Version 1.5.0-dev.2.0

svn merge -r 36469:36623 https://dart.googlecode.com/svn/branches/bleeding_edge trunk

git-svn-id: http://dart.googlecode.com/svn/trunk@36630 260f80e4-7a28-3924-810f-c04153c831b5
diff --git a/docs/language/dartLangSpec.tex b/docs/language/dartLangSpec.tex
index a87c3a1..e8dcfbb 100644
--- a/docs/language/dartLangSpec.tex
+++ b/docs/language/dartLangSpec.tex
@@ -1744,16 +1744,15 @@
 If some but not all of the $m_i, 1 \le i \le k$ are getters none of the $m_i$ are inherited, and a static warning is issued.
 
 Otherwise, if the static types $T_1, \ldots,  T_k$ of the members $m_1, \ldots,  m_k$  are not identical, then there must be a member $m_x$ such that $T_x <: T_i, 1 \le x \le k$ for all  $i  \in 1..k$, or a static type warning occurs. The member that is inherited  is $m_x$, if it exists; otherwise:
-\begin{itemize}
-\item Let $numberOfPositionals(f)$ denote the number of positional parameters of a function $f$, and let $numberOfRequiredParams(f)$ denote the number of required parameters of a function $f$. Furthermore, let $s$ denote the set of all named parameters of the $m_1, \ldots,  m_k$.  Then let 
+ let $numberOfPositionals(f)$ denote the number of positional parameters of a function $f$, and let $numberOfRequiredParams(f)$ denote the number of required parameters of a function $f$. Furthermore, let $s$ denote the set of all named parameters of the $m_1, \ldots,  m_k$.  Then let 
 
 $h = max(numberOfPositionals(m_i)), $
 
 $r = min(numberOfRequiredParams(m_i)), i \in 1..k$. 
 
-If $r \le h$ then $I$ has a method named $n$, with $r$ required parameters of type \DYNAMIC{}, $h$  positional parameters of type \DYNAMIC{}, named parameters $s$ of type  \DYNAMIC{} and  return type  \DYNAMIC{}.  
-\item Otherwise none of the members $m_1, \ldots,  m_k$ is inherited.
-\end{itemize}
+Then $I$ has a method named $n$, with $r$ required parameters of type \DYNAMIC{}, $h$  positional parameters of type \DYNAMIC{}, named parameters $s$ of type  \DYNAMIC{} and  return type  \DYNAMIC{}.  
+
+
 
 \commentary{The only situation where the runtime would be concerned with this would be during reflection, if a mirror attempted to obtain the signature of an interface member. 
 }
diff --git a/pkg/analysis_server/bin/dartdeps.dart b/pkg/analysis_server/bin/dartdeps.dart
index 9282844..6fdcb8b 100644
--- a/pkg/analysis_server/bin/dartdeps.dart
+++ b/pkg/analysis_server/bin/dartdeps.dart
@@ -78,7 +78,7 @@
    * Return `null` if the command line arguments are invalid.
    */
   Future<AnalysisManager> start() {
-    var parser = new ArgParser();
+    ArgParser parser = new ArgParser();
     parser.addOption(
         DART_SDK_OPTION,
         help: '[sdkPath] path to Dart SDK');
diff --git a/pkg/analysis_server/lib/src/analysis_manager.dart b/pkg/analysis_server/lib/src/analysis_manager.dart
index ce7f787..59677e2 100644
--- a/pkg/analysis_server/lib/src/analysis_manager.dart
+++ b/pkg/analysis_server/lib/src/analysis_manager.dart
@@ -50,7 +50,7 @@
    */
   Future<AnalysisManager> _launchServer(String pathToServer) {
     // TODO dynamically allocate port and/or allow client to specify port
-    var serverArgs = [pathToServer, '--port', PORT.toString()];
+    List<String> serverArgs = [pathToServer, '--port', PORT.toString()];
     return Process.start(Platform.executable, serverArgs)
         .catchError((error) {
           exitCode = 1;
@@ -81,7 +81,7 @@
         })
         .then((String line) {
           String port = line.substring(pattern.length).trim();
-          var url = 'ws://${InternetAddress.LOOPBACK_IP_V4.address}:$port/';
+          String url = 'ws://${InternetAddress.LOOPBACK_IP_V4.address}:$port/';
           return _openConnection(url);
         });
   }
@@ -90,7 +90,7 @@
    * Open a connection to the analysis server using the given URL.
    */
   Future<AnalysisManager> _openConnection(String serverUrl) {
-    var onError = (error) {
+    Function onError = (error) {
       exitCode = 1;
       if (process != null) {
         process.kill();
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index af8c32e..7ebd6c6 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -83,6 +83,11 @@
   final List<AnalysisContext> contextWorkQueue = new List<AnalysisContext>();
 
   /**
+   * A set of the [ServerService]s to send notifications for.
+   */
+  Set<ServerService> serverServices = new Set<ServerService>();
+
+  /**
    * Initialize a newly created server to receive requests from and send
    * responses to the given [channel].
    */
@@ -241,3 +246,31 @@
     });
   }
 }
+
+
+/**
+ * An enumeration of the services provided by the analysis domain.
+ */
+class AnalysisService extends Enum2<AnalysisService> {
+  static const AnalysisService ERRORS = const AnalysisService('ERRORS', 0);
+  static const AnalysisService HIGHLIGHTS = const AnalysisService('HIGHLIGHTS', 1);
+  static const AnalysisService NAVIGATION = const AnalysisService('NAVIGATION', 2);
+  static const AnalysisService OUTLINE = const AnalysisService('OUTLINE', 3);
+
+  static const List<AnalysisService> VALUES =
+      const [ERRORS, HIGHLIGHTS, NAVIGATION, OUTLINE];
+
+  const AnalysisService(String name, int ordinal) : super(name, ordinal);
+}
+
+
+/**
+ * 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/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
new file mode 100644
index 0000000..d83c1d3
--- /dev/null
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -0,0 +1,231 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 domain.analysis;
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/protocol.dart';
+
+/**
+ * Instances of the class [AnalysisDomainHandler] implement a [RequestHandler]
+ * that handles requests in the `analysis` domain.
+ */
+class AnalysisDomainHandler implements RequestHandler {
+  /**
+   * The name of the `analysis.getFixes` request.
+   */
+  static const String GET_FIXES_METHOD = 'analysis.getFixes';
+
+  /**
+   * The name of the `analysis.getMinorRefactorings` request.
+   */
+  static const String GET_MINOR_REFACTORINGS_METHOD = 'analysis.getMinorRefactorings';
+
+  /**
+   * The name of the `analysis.setAnalysisRoots` request.
+   */
+  static const String SET_ANALYSIS_ROOTS_METHOD = 'analysis.setAnalysisRoots';
+
+  /**
+   * The name of the `analysis.setPriorityFiles` request.
+   */
+  static const String SET_PRIORITY_FILES_METHOD = 'analysis.setPriorityFiles';
+
+  /**
+   * The name of the `analysis.setSubscriptions` request.
+   */
+  static const String SET_SUBSCRIPTIONS_METHOD = 'analysis.setSubscriptions';
+
+  /**
+   * The name of the `analysis.updateContent` request.
+   */
+  static const String UPDATE_CONTENT_METHOD = 'analysis.updateContent';
+
+  /**
+   * The name of the `analysis.updateOptions` request.
+   */
+  static const String UPDATE_OPTIONS_METHOD = 'analysis.updateOptions';
+
+  /**
+   * The name of the `analysis.updateSdks` request.
+   */
+  static const String UPDATE_SDKS_METHOD = 'analysis.updateSdks';
+
+  /**
+   * The name of the `analysis.errors` notification.
+   */
+  static const String ERRORS_NOTIFICATION = 'analysis.errors';
+
+  /**
+   * The name of the `analysis.highlights` notification.
+   */
+  static const String HIGHLIGHTS_NOTIFICATION = 'analysis.highlights';
+
+  /**
+   * The name of the `analysis.navigation` notification.
+   */
+  static const String NAVIGATION_NOTIFICATION = 'analysis.navigation';
+
+  /**
+   * The name of the `analysis.outline` notification.
+   */
+  static const String OUTLINE_NOTIFICATION = 'analysis.outline';
+
+  /**
+   * The name of the `aadded` parameter.
+   */
+  static const String ADDED_PARAM = 'added';
+
+  /**
+   * The name of the `default` parameter.
+   */
+  static const String DEFAULT_PARAM = 'default';
+
+  /**
+   * The name of the `errors` parameter.
+   */
+  static const String ERRORS_PARAM = 'errors';
+
+  /**
+   * The name of the `excluded` parameter.
+   */
+  static const String EXCLUDED_PARAM = 'excluded';
+
+  /**
+   * The name of the `file` parameter.
+   */
+  static const String FILE_PARAM = 'file';
+
+  /**
+   * The name of the `files` parameter.
+   */
+  static const String FILES_PARAM = 'files';
+
+  /**
+   * The name of the `fixes` parameter.
+   */
+  static const String FIXES_PARAM = 'fixes';
+
+  /**
+   * The name of the `included` parameter.
+   */
+  static const String INCLUDED_PARAM = 'included';
+
+  /**
+   * The name of the `length` parameter.
+   */
+  static const String LENGTH_PARAM = 'length';
+
+  /**
+   * The name of the `offset` parameter.
+   */
+  static const String OFFSET_PARAM = 'offset';
+
+  /**
+   * The name of the `options` parameter.
+   */
+  static const String OPTIONS_PARAM = 'options';
+
+  /**
+   * The name of the `outline` parameter.
+   */
+  static const String OUTLINE_PARAM = 'outline';
+
+  /**
+   * The name of the `refactorings` parameter.
+   */
+  static const String REFACTORINGS_PARAM = 'refactorings';
+
+  /**
+   * The name of the `regions` parameter.
+   */
+  static const String REGIONS_PARAM = 'regions';
+
+  /**
+   * The name of the `removed` parameter.
+   */
+  static const String REMOVED_PARAM = 'removed';
+
+  /**
+   * The name of the `subscriptions` parameter.
+   */
+  static const String SUBSCRIPTIONS_PARAM = 'subscriptions';
+
+  /**
+   * The analysis server that is using this handler to process requests.
+   */
+  final AnalysisServer server;
+
+  /**
+   * Initialize a newly created handler to handle requests for the given [server].
+   */
+  AnalysisDomainHandler(this.server);
+
+  @override
+  Response handleRequest(Request request) {
+    try {
+      String requestName = request.method;
+      if (requestName == GET_FIXES_METHOD) {
+        return getFixes(request);
+      } else if (requestName == GET_MINOR_REFACTORINGS_METHOD) {
+          return getMinorRefactorings(request);
+      } else if (requestName == SET_ANALYSIS_ROOTS_METHOD) {
+        return setAnalysisRoots(request);
+      } else if (requestName == SET_PRIORITY_FILES_METHOD) {
+        return setPriorityFiles(request);
+      } else if (requestName == SET_SUBSCRIPTIONS_METHOD) {
+        return setSubscriptions(request);
+      } else if (requestName == UPDATE_CONTENT_METHOD) {
+        return updateContent(request);
+      } else if (requestName == UPDATE_OPTIONS_METHOD) {
+        return updateOptions(request);
+      } else if (requestName == UPDATE_SDKS_METHOD) {
+        return updateSdks(request);
+      }
+    } on RequestFailure catch (exception) {
+      return exception.response;
+    }
+    return null;
+  }
+
+  Response getFixes(Request request) {
+    // TODO(scheglov) implement
+    return null;
+  }
+
+  Response getMinorRefactorings(Request request) {
+    // TODO(scheglov) implement
+    return null;
+  }
+
+  Response setAnalysisRoots(Request request) {
+    // TODO(scheglov) implement
+    return null;
+  }
+
+  Response setPriorityFiles(Request request) {
+    // TODO(scheglov) implement
+    return null;
+  }
+
+  Response setSubscriptions(Request request) {
+    // TODO(scheglov) implement
+    return null;
+  }
+
+  Response updateContent(Request request) {
+    // TODO(scheglov) implement
+    return null;
+  }
+
+  Response updateOptions(Request request) {
+    // TODO(scheglov) implement
+    return null;
+  }
+
+  Response updateSdks(Request request) {
+    // TODO(scheglov) implement
+    return null;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/domain_server.dart b/pkg/analysis_server/lib/src/domain_server.dart
index e213bdd..89e101d 100644
--- a/pkg/analysis_server/lib/src/domain_server.dart
+++ b/pkg/analysis_server/lib/src/domain_server.dart
@@ -6,11 +6,6 @@
 
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/protocol.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.dart';
-import 'package:analyzer/src/generated/source_io.dart';
 
 /**
  * Instances of the class [ServerDomainHandler] implement a [RequestHandler]
@@ -18,34 +13,24 @@
  */
 class ServerDomainHandler implements RequestHandler {
   /**
-   * The name of the server.createContext request.
+   * The name of the `server.getVersion` request.
    */
-  static const String CREATE_CONTEXT_METHOD = 'server.createContext';
+  static const String GET_VERSION_METHOD = 'server.getVersion';
 
   /**
-   * The name of the server.deleteContext request.
+   * The name of the `server.setSubscriptions` request.
    */
-  static const String DELETE_CONTEXT_METHOD = 'server.deleteContext';
+  static const String SET_SUBSCRIPTIONS_METHOD = 'server.setSubscriptions';
 
   /**
-   * The name of the server.shutdown request.
+   * The name of the `server.shutdown` request.
    */
   static const String SHUTDOWN_METHOD = 'server.shutdown';
 
   /**
-   * The name of the server.version request.
+   * The name of the `subscriptions` parameter.
    */
-  static const String VERSION_METHOD = 'server.version';
-
-  /**
-   * The name of the packageMap parameter.
-   */
-  static const String PACKAGE_MAP_PARAM = 'packageMap';
-
-  /**
-   * The name of the sdkDirectory parameter.
-   */
-  static const String SDK_DIRECTORY_PARAM = 'sdkDirectory';
+  static const String SUBSCRIPTIONS_PARAMETER = 'subscriptions';
 
   /**
    * The name of the version result value.
@@ -66,14 +51,12 @@
   Response handleRequest(Request request) {
     try {
       String requestName = request.method;
-      if (requestName == CREATE_CONTEXT_METHOD) {
-        return createContext(request);
-      } else if (requestName == DELETE_CONTEXT_METHOD) {
-        return deleteContext(request);
+      if (requestName == GET_VERSION_METHOD) {
+        return getVersion(request);
+      } else if (requestName == SET_SUBSCRIPTIONS_METHOD) {
+          return setSubscriptions(request);
       } else if (requestName == SHUTDOWN_METHOD) {
         return shutdown(request);
-      } else if (requestName == VERSION_METHOD) {
-        return version(request);
       }
     } on RequestFailure catch (exception) {
       return exception.response;
@@ -82,56 +65,68 @@
   }
 
   /**
-   * Create a new context in which analysis can be performed. The context that
-   * is created will persist until server.deleteContext is used to delete it.
-   * Clients, therefore, are responsible for managing the lifetime of contexts.
+   * Subscribe for services.
+   *
+   * All previous subscriptions are replaced by the given set of subscriptions.
    */
-  Response createContext(Request request) {
-    String sdkDirectory = request.getRequiredParameter(SDK_DIRECTORY_PARAM).asString();
-    Map<String, String> packageMap = request.getParameter(PACKAGE_MAP_PARAM, {}).asStringMap();
-
-    String contextId = request.getRequiredParameter(AnalysisServer.CONTEXT_ID_PARAM).asString();
-    if (server.contextMap.containsKey(contextId)) {
-      return new Response.contextAlreadyExists(request);
-    }
-    AnalysisContext context = AnalysisEngine.instance.createAnalysisContext();
-    // TODO(brianwilkerson) Use the information from the request to set the
-    // source factory in the context.
-    DirectoryBasedDartSdk sdk;
-    try {
-      sdk = new DirectoryBasedDartSdk(new JavaFile(sdkDirectory));
-    } on Exception catch (e) {
-      // TODO what error code should be returned here?
-      return new Response(request.id, new RequestError(
-          RequestError.CODE_SDK_ERROR, 'Failed to access sdk: $e'));
-    }
-    context.sourceFactory = new SourceFactory([
-      new DartUriResolver(sdk),
-      new FileUriResolver(),
-      // new PackageUriResolver(),
-    ]);
-    server.contextMap[contextId] = context;
-    server.contextIdMap[context] = contextId;
-
-    Response response = new Response(request.id);
-    return response;
+  Response setSubscriptions(Request request) {
+    RequestDatum subDatum = request.getRequiredParameter(SUBSCRIPTIONS_PARAMETER);
+    server.serverServices = subDatum.asEnumSet(ServerService.VALUES);
+    return new Response(request.id);
   }
 
-  /**
-   * Delete the context with the given id. Future attempts to use the context id
-   * will result in an error being returned.
-   */
-  Response deleteContext(Request request) {
-    String contextId = request.getRequiredParameter(AnalysisServer.CONTEXT_ID_PARAM).asString();
-
-    AnalysisContext removedContext = server.contextMap.remove(contextId);
-    if (removedContext == null) {
-      return new Response.contextDoesNotExist(request);
-    }
-    server.contextIdMap.remove(removedContext);
-    Response response = new Response(request.id);
-    return response;
-  }
+  // TODO(scheglov) remove or move to the 'analysis' domain
+//  /**
+//   * Create a new context in which analysis can be performed. The context that
+//   * is created will persist until server.deleteContext is used to delete it.
+//   * Clients, therefore, are responsible for managing the lifetime of contexts.
+//   */
+//  Response createContext(Request request) {
+//    String sdkDirectory = request.getRequiredParameter(SDK_DIRECTORY_PARAM).asString();
+//    Map<String, String> packageMap = request.getParameter(PACKAGE_MAP_PARAM, {}).asStringMap();
+//
+//    String contextId = request.getRequiredParameter(AnalysisServer.CONTEXT_ID_PARAM).asString();
+//    if (server.contextMap.containsKey(contextId)) {
+//      return new Response.contextAlreadyExists(request);
+//    }
+//    AnalysisContext context = AnalysisEngine.instance.createAnalysisContext();
+//    // TODO(brianwilkerson) Use the information from the request to set the
+//    // source factory in the context.
+//    DirectoryBasedDartSdk sdk;
+//    try {
+//      sdk = new DirectoryBasedDartSdk(new JavaFile(sdkDirectory));
+//    } on Exception catch (e) {
+//      // TODO what error code should be returned here?
+//      return new Response(request.id, new RequestError(
+//          RequestError.CODE_SDK_ERROR, 'Failed to access sdk: $e'));
+//    }
+//    context.sourceFactory = new SourceFactory([
+//      new DartUriResolver(sdk),
+//      new FileUriResolver(),
+//      // new PackageUriResolver(),
+//    ]);
+//    server.contextMap[contextId] = context;
+//    server.contextIdMap[context] = contextId;
+//
+//    Response response = new Response(request.id);
+//    return response;
+//  }
+//
+//  /**
+//   * Delete the context with the given id. Future attempts to use the context id
+//   * will result in an error being returned.
+//   */
+//  Response deleteContext(Request request) {
+//    String contextId = request.getRequiredParameter(AnalysisServer.CONTEXT_ID_PARAM).asString();
+//
+//    AnalysisContext removedContext = server.contextMap.remove(contextId);
+//    if (removedContext == null) {
+//      return new Response.contextDoesNotExist(request);
+//    }
+//    server.contextIdMap.remove(removedContext);
+//    Response response = new Response(request.id);
+//    return response;
+//  }
 
   /**
    * Cleanly shutdown the analysis server.
@@ -145,9 +140,9 @@
   /**
    * Return the version number of the analysis server.
    */
-  Response version(Request request) {
+  Response getVersion(Request request) {
     Response response = new Response(request.id);
     response.setResult(VERSION_RESULT, '0.0.1');
     return response;
   }
-}
\ No newline at end of file
+}
diff --git a/pkg/analysis_server/lib/src/get_handler.dart b/pkg/analysis_server/lib/src/get_handler.dart
index be7d47b..ca938cd 100644
--- a/pkg/analysis_server/lib/src/get_handler.dart
+++ b/pkg/analysis_server/lib/src/get_handler.dart
@@ -7,6 +7,7 @@
 import 'dart:io';
 
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/java_engine.dart' show CaughtException;
 
 import 'package:analysis_server/src/socket_server.dart';
 
@@ -66,14 +67,14 @@
           ['Context', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
           true);
       _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
-        AnalysisContentStatistics statistics =
+        AnalysisContextStatistics statistics =
             (context as AnalysisContextImpl).statistics;
         int errorCount = 0;
         int flushedCount = 0;
         int inProcessCount = 0;
         int invalidCount = 0;
         int validCount = 0;
-        statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
+        statistics.cacheRows.forEach((AnalysisContextStatistics_CacheRow row) {
           errorCount += row.errorCount;
           flushedCount += row.flushedCount;
           inProcessCount += row.inProcessCount;
@@ -91,13 +92,13 @@
       response.write('</table>');
       _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
         response.write('<h2><a name="context_$key">Analysis Context: $key</a></h2>');
-        AnalysisContentStatistics statistics = (context as AnalysisContextImpl).statistics;
+        AnalysisContextStatistics statistics = (context as AnalysisContextImpl).statistics;
         response.write('<table>');
         _writeRow(
             response,
             ['Item', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
             true);
-        statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
+        statistics.cacheRows.forEach((AnalysisContextStatistics_CacheRow row) {
           _writeRow(
               response,
               [row.name,
@@ -108,11 +109,11 @@
                row.validCount]);
         });
         response.write('</table>');
-        List<AnalysisException> exceptions = statistics.exceptions;
+        List<CaughtException> exceptions = statistics.exceptions;
         if (!exceptions.isEmpty) {
           response.write('<h2>Exceptions</h2>');
-          exceptions.forEach((AnalysisException exception) {
-            response.write('<p>${exception.message}</p>');
+          exceptions.forEach((CaughtException exception) {
+            response.write('<p>${exception.exception}</p>');
           });
         }
       });
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart
index 75b29c7..21d8b08 100644
--- a/pkg/analysis_server/lib/src/protocol.dart
+++ b/pkg/analysis_server/lib/src/protocol.dart
@@ -7,6 +7,45 @@
 import 'dart:convert' show JsonDecoder;
 
 /**
+ * An abstract enumeration.
+ */
+abstract class Enum2<E extends Enum2> implements Comparable<E> {
+  /**
+   * The name of this enum constant, as declared in the enum declaration.
+   */
+  final String name;
+
+  /**
+   * The position in the enum declaration.
+   */
+  final int ordinal;
+
+  const Enum2(this.name, this.ordinal);
+
+  @override
+  int get hashCode => ordinal;
+
+  @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;
+      }
+    }
+    return null;
+  }
+}
+
+
+/**
  * Instances of the class [Request] represent a request that was received.
  */
 class Request {
@@ -97,7 +136,7 @@
    * 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, dynamic defaultValue) {
+  RequestDatum getParameter(String name, defaultValue) {
     Object value = params[name];
     if (value == null) {
       return new RequestDatum(this, "default for $name", defaultValue);
@@ -204,7 +243,7 @@
       throw new RequestFailure(new Response.invalidParameter(request, path,
           "be a map"));
     }
-    datum.forEach((String key, dynamic value) {
+    datum.forEach((String key, value) {
       f(key, new RequestDatum(request, "$path.$key", value));
     });
   }
@@ -283,6 +322,22 @@
   }
 
   /**
+   * 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 whose values are all strings.
    *
    * Note: we can safely assume that the keys are all strings, since JSON maps
@@ -412,12 +467,12 @@
    */
   factory Response.fromJson(Map<String, Object> json) {
     try {
-      var id = json[Response.ID];
+      Object id = json[Response.ID];
       if (id is! String) {
         return null;
       }
-      var error = json[Response.ERROR];
-      var result = json[Response.RESULT];
+      Object error = json[Response.ERROR];
+      Object result = json[Response.RESULT];
       Response response;
       if (error is Map) {
         response = new Response(id, new RequestError.fromJson(error));
@@ -674,7 +729,7 @@
   factory Notification.fromJson(Map<String, Object> json) {
     try {
       String event = json[Notification.EVENT];
-      var params = json[Notification.PARAMS];
+      Object params = json[Notification.PARAMS];
       Notification notification = new Notification(event);
       if (params is Map) {
         params.forEach((String key, Object value) {
diff --git a/pkg/analysis_server/lib/src/resource.dart b/pkg/analysis_server/lib/src/resource.dart
new file mode 100644
index 0000000..2db8d61
--- /dev/null
+++ b/pkg/analysis_server/lib/src/resource.dart
@@ -0,0 +1,381 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library resource;
+
+import 'dart:io' as io;
+
+import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
+import 'package:analyzer/src/generated/java_io.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:path/path.dart';
+
+
+/**
+ * [File]s are leaf [Resource]s which contain data.
+ */
+abstract class File extends Resource {
+  /**
+   * Create a new [Source] instance that serves this file.
+   */
+  Source createSource(UriKind uriKind);
+}
+
+
+/**
+ * [Folder]s are [Resource]s which may contain files and/or other folders.
+ */
+abstract class Folder extends Resource {
+  /**
+   * Return an existing child [Resource] with the given [relPath].
+   * Return a not existing [File] if no such child exist.
+   */
+  Resource getChild(String relPath);
+
+  /**
+   * Return a list of existing direct children [Resource]s (folders and files)
+   * in this folder, in no particular order.
+   */
+  List<Resource> getChildren();
+}
+
+
+/**
+ * The abstract class [Resource] is an abstraction of file or folder.
+ */
+abstract class Resource {
+  /**
+   * Return `true` if this resource exists.
+   */
+  bool get exists;
+
+  /**
+   * Return the full (long) version of the name that can be displayed to the
+   * user to denote this resource.
+   */
+  String get fullName;
+
+  /**
+   * Return a short version of the name that can be displayed to the user to
+   * denote this resource.
+   */
+  String get shortName;
+}
+
+
+/**
+ * Instances of the class [ResourceProvider] convert [String] paths into
+ * [Resource]s.
+ */
+abstract class ResourceProvider {
+  /**
+   * Return the [Resource] that corresponds to the given [path].
+   */
+  Resource getResource(String path);
+}
+
+
+/**
+ * An in-memory implementation of [Resource].
+ */
+abstract class _MemoryResource implements Resource {
+  final MemoryResourceProvider _provider;
+  final String _path;
+
+  _MemoryResource(this._provider, this._path);
+
+  @override
+  bool operator ==(other) {
+    return identical(this, other);
+  }
+
+  @override
+  bool get exists => _provider._pathToResource.containsKey(_path);
+
+  @override
+  String get fullName => _path;
+
+  @override
+  get hashCode => _path.hashCode;
+
+  @override
+  String get shortName => basename(_path);
+
+  @override
+  String toString() => fullName;
+}
+
+
+/**
+ * An in-memory implementation of [File].
+ */
+class _MemoryFile extends _MemoryResource implements File {
+  _MemoryFile(MemoryResourceProvider provider, String path) :
+      super(provider, path);
+
+  @override
+  Source createSource(UriKind uriKind) {
+    return new _MemoryFileSource(this, uriKind);
+  }
+
+  String get _content {
+    String content = _provider._pathToContent[_path];
+    if (content == null) {
+      throw new MemoryResourceException(_path, "File '$_path' does not exist");
+    }
+    return content;
+  }
+
+  int get _timestamp => _provider._pathToTimestamp[_path];
+}
+
+
+/**
+ * Exception thrown when a memory [Resource] file operation fails.
+ */
+class MemoryResourceException {
+  final path;
+  final message;
+
+  MemoryResourceException(this.path, this.message);
+
+  @override
+  String toString() {
+    return "MemoryResourceException(path=$path; message=$message)";
+  }
+}
+
+
+/**
+ * An in-memory implementation of [Source].
+ */
+class _MemoryFileSource implements Source {
+  final _MemoryFile _file;
+
+  final UriKind uriKind;
+
+  _MemoryFileSource(this._file, this.uriKind);
+
+  @override
+  TimestampedData<String> get contents {
+    return new TimestampedData<String>(modificationStamp, _file._content);
+  }
+
+  @override
+  String get encoding {
+    return '${new String.fromCharCode(uriKind.encoding)}${_file.fullName}';
+  }
+
+  @override
+  bool exists() => _file.exists;
+
+  @override
+  String get fullName => _file.fullName;
+
+  @override
+  bool get isInSystemLibrary => false;
+
+  @override
+  int get modificationStamp => _file._timestamp;
+
+  @override
+  Source resolveRelative(Uri relativeUri) {
+    String relativePath = fromUri(relativeUri);
+    String folderPath = dirname(_file._path);
+    String path = join(folderPath, relativePath);
+    path = normalize(path);
+    _MemoryFile file = new _MemoryFile(_file._provider, path);
+    return new _MemoryFileSource(file, uriKind);
+  }
+
+  @override
+  String get shortName => _file.shortName;
+}
+
+
+/**
+ * An in-memory implementation of [Folder].
+ */
+class _MemoryFolder extends _MemoryResource implements Folder {
+  _MemoryFolder(MemoryResourceProvider provider, String path) :
+      super(provider, path);
+  @override
+  Resource getChild(String relPath) {
+    relPath = normalize(relPath);
+    String childPath = join(_path, relPath);
+    childPath = normalize(childPath);
+    _MemoryResource resource = _provider._pathToResource[childPath];
+    if (resource == null) {
+      resource = new _MemoryFile(_provider, childPath);
+    }
+    return resource;
+  }
+
+  @override
+  List<Resource> getChildren() {
+    List<Resource> children = <Resource>[];
+    _provider._pathToResource.forEach((path, resource) {
+      if (dirname(path) == _path) {
+        children.add(resource);
+      }
+    });
+    return children;
+  }
+}
+
+
+/**
+ * An in-memory implementation of [ResourceProvider].
+ * Use `/` as a path separator.
+ */
+class MemoryResourceProvider implements ResourceProvider {
+  final Map<String, _MemoryResource> _pathToResource = <String, _MemoryResource>{};
+  final Map<String, String> _pathToContent = <String, String>{};
+  final Map<String, int> _pathToTimestamp = <String, int>{};
+  int nextStamp = 0;
+
+  @override
+  Resource getResource(String path) {
+    path = normalize(path);
+    Resource resource = _pathToResource[path];
+    if (resource == null) {
+      resource = new _MemoryFile(this, path);
+    }
+    return resource;
+  }
+
+  Folder newFolder(String path) {
+    path = normalize(path);
+    if (path.isEmpty) {
+      throw new ArgumentError('Empty paths are not supported');
+    }
+    if (!path.startsWith('/')) {
+      throw new ArgumentError("Path must start with '/'");
+    }
+    _MemoryFolder folder = null;
+    String partialPath = "";
+    for (String pathPart in path.split('/')) {
+      if (pathPart.isEmpty) {
+        continue;
+      }
+      partialPath += '/' + pathPart;
+      _MemoryResource resource = _pathToResource[partialPath];
+      if (resource == null) {
+        folder = new _MemoryFolder(this, partialPath);
+        _pathToResource[partialPath] = folder;
+        _pathToTimestamp[partialPath] = nextStamp++;
+      } else if (resource is _MemoryFolder) {
+        folder = resource;
+      } else {
+        String message = 'Folder expected at '
+                         "'$partialPath'"
+                         'but ${resource.runtimeType} found';
+        throw new ArgumentError(message);
+      }
+    }
+    return folder;
+  }
+
+  File newFile(String path, String content) {
+    path = normalize(path);
+    newFolder(dirname(path));
+    _MemoryFile file = new _MemoryFile(this, path);
+    _pathToResource[path] = file;
+    _pathToContent[path] = content;
+    _pathToTimestamp[path] = nextStamp++;
+    return file;
+  }
+}
+
+
+/**
+ * A `dart:io` based implementation of [File].
+ */
+class _PhysicalFile extends _PhysicalResource implements File {
+  _PhysicalFile(io.File file) : super(file);
+
+  @override
+  Source createSource(UriKind uriKind) {
+    io.File file = _entry as io.File;
+    JavaFile javaFile = new JavaFile(file.absolute.path);
+    return new FileBasedSource.con2(javaFile, uriKind);
+  }
+}
+
+
+/**
+ * A `dart:io` based implementation of [Folder].
+ */
+class _PhysicalFolder extends _PhysicalResource implements Folder {
+  _PhysicalFolder(io.Directory directory) : super(directory);
+
+  @override
+  Resource getChild(String relPath) {
+    String childPath = join(_entry.absolute.path, relPath);
+    return PhysicalResourceProvider.INSTANCE.getResource(childPath);
+  }
+
+  @override
+  List<Resource> getChildren() {
+    List<Resource> children = <Resource>[];
+    io.Directory directory = _entry as io.Directory;
+    List<io.FileSystemEntity> entries = directory.listSync(recursive: false);
+    int numEntries = entries.length;
+    for (int i = 0; i < numEntries; i++) {
+      io.FileSystemEntity entity = entries[i];
+      if (entity is io.Directory) {
+        children.add(new _PhysicalFolder(entity));
+      } else if (entity is io.File) {
+        children.add(new _PhysicalFile(entity));
+      }
+    }
+    return children;
+  }
+}
+
+
+/**
+ * A `dart:io` based implementation of [Resource].
+ */
+abstract class _PhysicalResource implements Resource {
+  final io.FileSystemEntity _entry;
+
+  _PhysicalResource(this._entry);
+
+  @override
+  bool get exists => _entry.existsSync();
+
+  @override
+  String get fullName => _entry.absolute.path;
+
+  @override
+  get hashCode => _entry.hashCode;
+
+  @override
+  String get shortName => basename(fullName);
+
+  @override
+  String toString() => fullName;
+}
+
+
+/**
+ * A `dart:io` based implementation of [ResourceProvider].
+ */
+class PhysicalResourceProvider implements ResourceProvider {
+  static final PhysicalResourceProvider INSTANCE = new PhysicalResourceProvider._();
+
+  PhysicalResourceProvider._();
+
+  @override
+  Resource getResource(String path) {
+    if (io.FileSystemEntity.isDirectorySync(path)) {
+      io.Directory directory = new io.Directory(path);
+      return new _PhysicalFolder(directory);
+    } else {
+      io.File file = new io.File(path);
+      return new _PhysicalFile(file);
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index a2a0269..31d7e1b 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -6,6 +6,7 @@
 
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel.dart';
+import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/domain_context.dart';
 import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/protocol.dart';
@@ -29,7 +30,7 @@
    */
   void createAnalysisServer(ServerCommunicationChannel serverChannel) {
     if (analysisServer != null) {
-      var error = new RequestError.serverAlreadyStarted();
+      RequestError error = new RequestError.serverAlreadyStarted();
       serverChannel.sendResponse(new Response('', error));
       serverChannel.listen((Request request) {
         serverChannel.sendResponse(new Response(request.id, error));
@@ -46,6 +47,7 @@
   void _initializeHandlers(AnalysisServer server) {
     server.handlers = [
         new ServerDomainHandler(server),
+        new AnalysisDomainHandler(server),
         new ContextDomainHandler(server),
     ];
   }
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index 0768143..82e0c01 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analysis_server
-version: 0.0.1
+version: 0.0.2
 author: Dart Team <misc@dartlang.org>
 description: An HTTP server that performs analysis of Dart code via web sockets.
 homepage: http://www.dartlang.org
@@ -7,9 +7,10 @@
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
   analysis_services: any
-  analyzer: 0.15.1
+  analyzer: '>=0.15.1 <0.16.0'
   args: any
   logging: any
+  path: any
 dev_dependencies:
   mock: '>=0.10.0 <0.11.0'
   unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index c79f3c8..d730201 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -26,7 +26,8 @@
         AnalysisServerTest.addContextToWorkQueue_whenNotRunning);
     test('addContextToWorkQueue_whenRunning',
         AnalysisServerTest.addContextToWorkQueue_whenRunning);
-    test('createContext', AnalysisServerTest.createContext);
+    // TODO(scheglov) remove or move to the 'analysis' domain
+//    test('createContext', AnalysisServerTest.createContext);
     test('echo', AnalysisServerTest.echo);
     test('errorToJson_formattingApplied',
         AnalysisServerTest.errorToJson_formattingApplied);
@@ -102,17 +103,18 @@
         context.getLogs(callsTo('performAnalysisTask')).verify(happenedExactly(1)));
   }
 
-  static Future createContext() {
-    server.handlers = [new ServerDomainHandler(server)];
-    var request = new Request('my27', ServerDomainHandler.CREATE_CONTEXT_METHOD);
-    request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
-    request.setParameter(AnalysisServer.CONTEXT_ID_PARAM, 'ctx');
-    return channel.sendRequest(request)
-        .then((Response response) {
-          expect(response.id, equals('my27'));
-          expect(response.error, isNull);
-        });
-  }
+  // TODO(scheglov) remove or move to the 'analysis' domain
+//  static Future createContext() {
+//    server.handlers = [new ServerDomainHandler(server)];
+//    var request = new Request('my27', ServerDomainHandler.CREATE_CONTEXT_METHOD);
+//    request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
+//    request.setParameter(AnalysisServer.CONTEXT_ID_PARAM, 'ctx');
+//    return channel.sendRequest(request)
+//        .then((Response response) {
+//          expect(response.id, equals('my27'));
+//          expect(response.error, isNull);
+//        });
+//  }
 
   static Future echo() {
     server.handlers = [new EchoHandler()];
@@ -133,7 +135,7 @@
     Map<String, Object> json = AnalysisServer.errorToJson(analysisError);
 
     expect(json['message'],
-        equals("The element 'foo' is defined in the libraries 'bar' and 'baz'"));
+        equals("The name 'foo' is defined in the libraries 'bar' and 'baz'"));
   }
 
   static void errorToJson_noCorrection() {
@@ -182,7 +184,6 @@
   static Future shutdown() {
     server.handlers = [new ServerDomainHandler(server)];
     var request = new Request('my28', ServerDomainHandler.SHUTDOWN_METHOD);
-    request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, '');
     return channel.sendRequest(request)
         .then((Response response) {
           expect(response.id, equals('my28'));
diff --git a/pkg/analysis_server/test/declarative_tests.dart b/pkg/analysis_server/test/declarative_tests.dart
index f6a6e68..dadc680 100644
--- a/pkg/analysis_server/test/declarative_tests.dart
+++ b/pkg/analysis_server/test/declarative_tests.dart
@@ -4,24 +4,30 @@
 
 import 'package:unittest/unittest.dart' show group, test;
 
-/// Use [runTest] annotation to indicate that method is a test method.
-/// Alternatively method name can have the `test` prefix.
+/**
+ * Use [runTest] annotation to indicate that method is a test method.
+ * Alternatively method name can have the `test` prefix.
+ */
 const runTest = const _RunTest();
 
 class _RunTest {
   const _RunTest();
 }
 
-/// Creates a new named group of tests with the name of the given [Type], then
-/// adds new tests using [addTestMethods].
+/**
+ * Creates a new named group of tests with the name of the given [Type], then
+ * adds new tests using [addTestMethods].
+ */
 addTestSuite(Type type) {
   group(type.toString(), () {
     addTestMethods(type);
   });
 }
 
-/// Creates a new test case for the each static method with the name starting
-/// with `test` or having the [runTest] annotation.
+/**
+ * Creates a new test case for the each static method with the name starting
+ * with `test` or having the [runTest] annotation.
+ */
 addTestMethods(Type type) {
   var typeMirror = reflectClass(type);
   typeMirror.staticMembers.forEach((methodSymbol, method) {
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
new file mode 100644
index 0000000..5357050
--- /dev/null
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.domain.analysis;
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/domain_analysis.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:unittest/unittest.dart';
+
+import 'mocks.dart';
+
+main() {
+  AnalysisServer server;
+  AnalysisDomainHandler handler;
+
+  setUp(() {
+    var serverChannel = new MockServerChannel();
+    server = new AnalysisServer(serverChannel);
+    handler = new AnalysisDomainHandler(server);
+  });
+
+  group('AnalysisDomainHandler', () {
+    test('getFixes', () {
+      var request = new Request('0', AnalysisDomainHandler.GET_FIXES_METHOD);
+      request.setParameter(AnalysisDomainHandler.ERRORS_PARAM, []);
+      var response = handler.handleRequest(request);
+      // TODO(scheglov) implement
+      expect(response, isNull);
+    });
+
+    test('getMinorRefactorings', () {
+      var request = new Request('0', AnalysisDomainHandler.GET_MINOR_REFACTORINGS_METHOD);
+      request.setParameter(AnalysisDomainHandler.FILE_PARAM, 'test.dart');
+      request.setParameter(AnalysisDomainHandler.OFFSET_PARAM, 10);
+      request.setParameter(AnalysisDomainHandler.LENGTH_PARAM, 20);
+      var response = handler.handleRequest(request);
+      // TODO(scheglov) implement
+      expect(response, isNull);
+    });
+
+    test('setAnalysisRoots', () {
+      var request = new Request('0', AnalysisDomainHandler.SET_ANALYSIS_ROOTS_METHOD);
+      request.setParameter(
+          AnalysisDomainHandler.INCLUDED_PARAM,
+          ['projectA', 'projectB']);
+      request.setParameter(
+          AnalysisDomainHandler.EXCLUDED_PARAM,
+          ['projectA/subAA', 'projectA/subAB', 'projectB/subBA']);
+      var response = handler.handleRequest(request);
+      // TODO(scheglov) implement
+      expect(response, isNull);
+    });
+
+    test('setPriorityFiles', () {
+      var request = new Request('0', AnalysisDomainHandler.SET_PRIORITY_FILES_METHOD);
+      request.setParameter(
+          AnalysisDomainHandler.FILES_PARAM,
+          ['projectA/aa.dart', 'projectB/ba.dart']);
+      var response = handler.handleRequest(request);
+      // TODO(scheglov) implement
+      expect(response, isNull);
+    });
+
+    test('setSubscriptions', () {
+      var request = new Request('0', AnalysisDomainHandler.SET_SUBSCRIPTIONS_METHOD);
+      request.setParameter(
+          AnalysisDomainHandler.SUBSCRIPTIONS_PARAM,
+          {
+            AnalysisService.HIGHLIGHTS : ['project/a.dart', 'project/b.dart'],
+            AnalysisService.NAVIGATION : ['project/c.dart'],
+            AnalysisService.OUTLINE : ['project/d.dart', 'project/e.dart']
+          });
+      var response = handler.handleRequest(request);
+      // TODO(scheglov) implement
+      expect(response, isNull);
+    });
+
+    test('updateContent', () {
+      var request = new Request('0', AnalysisDomainHandler.UPDATE_CONTENT_METHOD);
+//      request.setParameter(
+//          AnalysisDomainHandler.FILES_PARAM,
+//          {'project/test.dart' : null});
+      var response = handler.handleRequest(request);
+      // TODO(scheglov) implement
+      expect(response, isNull);
+    });
+
+    test('updateOptions', () {
+      var request = new Request('0', AnalysisDomainHandler.UPDATE_OPTIONS_METHOD);
+      request.setParameter(
+          AnalysisDomainHandler.OPTIONS_PARAM,
+          {
+            'analyzeAngular' : true,
+            'enableDeferredLoading': true,
+            'enableEnums': false
+          });
+      var response = handler.handleRequest(request);
+      // TODO(scheglov) implement
+      expect(response, isNull);
+    });
+
+    test('updateSdks', () {
+      var request = new Request('0', AnalysisDomainHandler.UPDATE_SDKS_METHOD);
+      request.setParameter(
+          AnalysisDomainHandler.ADDED_PARAM,
+          ['/dart/sdk-1.3', '/dart/sdk-1.4']);
+      request.setParameter(
+          AnalysisDomainHandler.REMOVED_PARAM,
+          ['/dart/sdk-1.2']);
+      request.setParameter(AnalysisDomainHandler.DEFAULT_PARAM, '/dart/sdk-1.4');
+      var response = handler.handleRequest(request);
+      // TODO(scheglov) implement
+      expect(response, isNull);
+    });
+  });
+}
diff --git a/pkg/analysis_server/test/domain_context_test.dart b/pkg/analysis_server/test/domain_context_test.dart
index 96b887c..d8e55e8 100644
--- a/pkg/analysis_server/test/domain_context_test.dart
+++ b/pkg/analysis_server/test/domain_context_test.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_context.dart';
-import 'package:analysis_server/src/domain_server.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:unittest/unittest.dart';
 
@@ -17,39 +16,42 @@
 
 main() {
   group('ContextDomainHandlerTest', () {
-    test('applyChanges', ContextDomainHandlerTest.applyChanges);
+    // TODO(scheglov) remove or move to the 'analysis' domain
+//    test('applyChanges', ContextDomainHandlerTest.applyChanges);
     test('createChangeSet', ContextDomainHandlerTest.createChangeSet);
     test('createChangeSet_onlyAdded', ContextDomainHandlerTest.createChangeSet_onlyAdded);
-    test('setOptions', ContextDomainHandlerTest.setOptions);
-    test('setPrioritySources_empty', ContextDomainHandlerTest.setPrioritySources_empty);
-    test('setPrioritySources_nonEmpty', ContextDomainHandlerTest.setPrioritySources_nonEmpty);
+    // TODO(scheglov) remove or move to the 'analysis' domain
+//    test('setOptions', ContextDomainHandlerTest.setOptions);
+//    test('setPrioritySources_empty', ContextDomainHandlerTest.setPrioritySources_empty);
+//    test('setPrioritySources_nonEmpty', ContextDomainHandlerTest.setPrioritySources_nonEmpty);
   });
 }
 
 class ContextDomainHandlerTest {
   static int contextIdCounter = 0;
 
-  static void applyChanges() {
-    AnalysisServer server = new AnalysisServer(new MockServerChannel());
-    String contextId = _createContext(server);
-    ChangeSet changeSet = new ChangeSet();
-    ContextDomainHandler handler = new ContextDomainHandler(server);
-
-    Request request = new Request('0', ContextDomainHandler.APPLY_CHANGES_NAME);
-    request.setParameter(ContextDomainHandler.CONTEXT_ID_PARAM, contextId);
-    request.setParameter(ContextDomainHandler.SOURCES_PARAM, []);
-    request.setParameter(ContextDomainHandler.CHANGES_PARAM, {
-      ContextDomainHandler.ADDED_PARAM : ['ffile:/one.dart'],
-      ContextDomainHandler.MODIFIED_PARAM : ['ffile:/two.dart'],
-      ContextDomainHandler.REMOVED_PARAM : ['ffile:/three.dart']
-    });
-    expect(server.contextWorkQueue, isEmpty);
-    Response response = handler.handleRequest(request);
-    expect(server.contextWorkQueue, hasLength(1));
-    expect(response.toJson(), equals({
-      Response.ID: '0'
-    }));
-  }
+  // TODO(scheglov) remove or move to the 'analysis' domain
+//  static void applyChanges() {
+//    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+//    String contextId = _createContext(server);
+//    ChangeSet changeSet = new ChangeSet();
+//    ContextDomainHandler handler = new ContextDomainHandler(server);
+//
+//    Request request = new Request('0', ContextDomainHandler.APPLY_CHANGES_NAME);
+//    request.setParameter(ContextDomainHandler.CONTEXT_ID_PARAM, contextId);
+//    request.setParameter(ContextDomainHandler.SOURCES_PARAM, []);
+//    request.setParameter(ContextDomainHandler.CHANGES_PARAM, {
+//      ContextDomainHandler.ADDED_PARAM : ['ffile:/one.dart'],
+//      ContextDomainHandler.MODIFIED_PARAM : ['ffile:/two.dart'],
+//      ContextDomainHandler.REMOVED_PARAM : ['ffile:/three.dart']
+//    });
+//    expect(server.contextWorkQueue, isEmpty);
+//    Response response = handler.handleRequest(request);
+//    expect(server.contextWorkQueue, hasLength(1));
+//    expect(response.toJson(), equals({
+//      Response.ID: '0'
+//    }));
+//  }
 
   static void createChangeSet() {
     AnalysisServer server = new AnalysisServer(new MockServerChannel());
@@ -82,62 +84,66 @@
     expect(changeSet.removedSources, hasLength(equals(0)));
   }
 
-  static void setOptions() {
-    AnalysisServer server = new AnalysisServer(new MockServerChannel());
-    String contextId = _createContext(server);
-    Map<String, Object> options = new Map<String, Object>();
-    ContextDomainHandler handler = new ContextDomainHandler(server);
+  // TODO(scheglov) remove or move to the 'analysis' domain
+//  static void setOptions() {
+//    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+//    String contextId = _createContext(server);
+//    Map<String, Object> options = new Map<String, Object>();
+//    ContextDomainHandler handler = new ContextDomainHandler(server);
+//
+//    Request request = new Request('0', ContextDomainHandler.SET_OPTIONS_NAME);
+//    request.setParameter(ContextDomainHandler.CONTEXT_ID_PARAM, contextId);
+//    request.setParameter(ContextDomainHandler.OPTIONS_PARAM, options);
+//    Response response = handler.handleRequest(request);
+//    expect(response.toJson(), equals({
+//      Response.ID: '0'
+//    }));
+//  }
 
-    Request request = new Request('0', ContextDomainHandler.SET_OPTIONS_NAME);
-    request.setParameter(ContextDomainHandler.CONTEXT_ID_PARAM, contextId);
-    request.setParameter(ContextDomainHandler.OPTIONS_PARAM, options);
-    Response response = handler.handleRequest(request);
-    expect(response.toJson(), equals({
-      Response.ID: '0'
-    }));
-  }
+  // TODO(scheglov) remove or move to the 'analysis' domain
+//  static void setPrioritySources_empty() {
+//    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+//    String contextId = _createContext(server);
+//    List<String> sources = new List<String>();
+//    ContextDomainHandler handler = new ContextDomainHandler(server);
+//
+//    Request request = new Request('0', ContextDomainHandler.SET_PRIORITY_SOURCES_NAME);
+//    request.setParameter(ContextDomainHandler.CONTEXT_ID_PARAM, contextId);
+//    request.setParameter(ContextDomainHandler.SOURCES_PARAM, sources);
+//    Response response = handler.handleRequest(request);
+//    expect(response.toJson(), equals({
+//      Response.ID: '0'
+//    }));
+//  }
 
-  static void setPrioritySources_empty() {
-    AnalysisServer server = new AnalysisServer(new MockServerChannel());
-    String contextId = _createContext(server);
-    List<String> sources = new List<String>();
-    ContextDomainHandler handler = new ContextDomainHandler(server);
+  // TODO(scheglov) remove or move to the 'analysis' domain
+//  static void setPrioritySources_nonEmpty() {
+//    AnalysisServer server = new AnalysisServer(new MockServerChannel());
+//    String contextId = _createContext(server);
+//    List<String> sources = new List<String>();
+//    sources.add("foo.dart");
+//    ContextDomainHandler handler = new ContextDomainHandler(server);
+//
+//    Request request = new Request('0', ContextDomainHandler.SET_PRIORITY_SOURCES_NAME);
+//    request.setParameter(ContextDomainHandler.CONTEXT_ID_PARAM, contextId);
+//    request.setParameter(ContextDomainHandler.SOURCES_PARAM, sources);
+//    Response response = handler.handleRequest(request);
+//    expect(response.toJson(), equals({
+//      Response.ID: '0'
+//    }));
+//  }
 
-    Request request = new Request('0', ContextDomainHandler.SET_PRIORITY_SOURCES_NAME);
-    request.setParameter(ContextDomainHandler.CONTEXT_ID_PARAM, contextId);
-    request.setParameter(ContextDomainHandler.SOURCES_PARAM, sources);
-    Response response = handler.handleRequest(request);
-    expect(response.toJson(), equals({
-      Response.ID: '0'
-    }));
-  }
-
-  static void setPrioritySources_nonEmpty() {
-    AnalysisServer server = new AnalysisServer(new MockServerChannel());
-    String contextId = _createContext(server);
-    List<String> sources = new List<String>();
-    sources.add("foo.dart");
-    ContextDomainHandler handler = new ContextDomainHandler(server);
-
-    Request request = new Request('0', ContextDomainHandler.SET_PRIORITY_SOURCES_NAME);
-    request.setParameter(ContextDomainHandler.CONTEXT_ID_PARAM, contextId);
-    request.setParameter(ContextDomainHandler.SOURCES_PARAM, sources);
-    Response response = handler.handleRequest(request);
-    expect(response.toJson(), equals({
-      Response.ID: '0'
-    }));
-  }
-
-  static String _createContext(AnalysisServer server) {
-    String contextId = "context${contextIdCounter++}";
-    ServerDomainHandler handler = new ServerDomainHandler(server);
-    Request request = new Request('0', ServerDomainHandler.CREATE_CONTEXT_METHOD);
-    request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
-    request.setParameter(AnalysisServer.CONTEXT_ID_PARAM, contextId);
-    Response response = handler.handleRequest(request);
-    if (response.error != null) {
-      fail('Unexpected error: ${response.error.toJson()}');
-    }
-    return contextId;
-  }
+  // TODO(scheglov) remove or move to the 'analysis' domain
+//  static String _createContext(AnalysisServer server) {
+//    String contextId = "context${contextIdCounter++}";
+//    ServerDomainHandler handler = new ServerDomainHandler(server);
+//    Request request = new Request('0', ServerDomainHandler.CREATE_CONTEXT_METHOD);
+//    request.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
+//    request.setParameter(AnalysisServer.CONTEXT_ID_PARAM, contextId);
+//    Response response = handler.handleRequest(request);
+//    if (response.error != null) {
+//      fail('Unexpected error: ${response.error.toJson()}');
+//    }
+//    return contextId;
+//  }
 }
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index 031c95c..1356816 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -12,114 +12,69 @@
 import 'mocks.dart';
 
 main() {
-  group('ServerDomainHandler', () {
-    test('createContext', ServerDomainHandlerTest.createContext);
-    test('deleteContext_alreadyDeleted', ServerDomainHandlerTest.deleteContext_alreadyDeleted);
-    test('deleteContext_doesNotExist', ServerDomainHandlerTest.deleteContext_doesNotExist);
-    test('deleteContext_existing', ServerDomainHandlerTest.deleteContext_existing);
-    test('shutdown', ServerDomainHandlerTest.shutdown);
-    test('version', ServerDomainHandlerTest.version);
+  AnalysisServer server;
+  ServerDomainHandler handler;
+
+  setUp(() {
+    var serverChannel = new MockServerChannel();
+    server = new AnalysisServer(serverChannel);
+    handler = new ServerDomainHandler(server);
   });
-}
 
-class ServerDomainHandlerTest {
-  static void createContext() {
-    AnalysisServer server = new AnalysisServer(new MockServerChannel());
-    ServerDomainHandler handler = new ServerDomainHandler(server);
+  group('ServerDomainHandler', () {
+    test('getVersion', () {
+      var request = new Request('0', ServerDomainHandler.GET_VERSION_METHOD);
+      var response = handler.handleRequest(request);
+      expect(response.toJson(), equals({
+        Response.ID: '0',
+        Response.RESULT: {
+          ServerDomainHandler.VERSION_RESULT: '0.0.1'
+        }
+      }));
+    });
 
-    Request createRequest = new Request('0', ServerDomainHandler.CREATE_CONTEXT_METHOD);
-    createRequest.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
-    createRequest.setParameter(AnalysisServer.CONTEXT_ID_PARAM, 'ctx');
-    Response response = handler.handleRequest(createRequest);
-    expect(response.id, equals('0'));
-    expect(response.error, isNull);
-    expect(response.result, isEmpty);
-  }
+    group('setSubscriptions', () {
+      Request request;
+      setUp(() {
+        request = new Request('0', ServerDomainHandler.SET_SUBSCRIPTIONS_METHOD);
+      });
 
-  static void createContext_alreadyExists() {
-    AnalysisServer server = new AnalysisServer(new MockServerChannel());
-    ServerDomainHandler handler = new ServerDomainHandler(server);
+      test('invalid service name', () {
+        request.setParameter(
+            ServerDomainHandler.SUBSCRIPTIONS_PARAMETER,
+            ['noSuchService']);
+        var response = handler.handleRequest(request);
+        // TODO(scheglov) extract isResponseError(id) matcher
+        expect(response.id, equals('0'));
+        expect(response.error, isNotNull);
+      });
 
-    Request createRequest = new Request('0', ServerDomainHandler.CREATE_CONTEXT_METHOD);
-    createRequest.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
-    createRequest.setParameter(AnalysisServer.CONTEXT_ID_PARAM, 'ctx');
-    Response response = handler.handleRequest(createRequest);
-    expect(response.error, isNull);
-    response = handler.handleRequest(createRequest);
-    expect(response.error, isNotNull);
-  }
+      test('success', () {
+        expect(server.serverServices, isEmpty);
+        // send request
+        request.setParameter(
+            ServerDomainHandler.SUBSCRIPTIONS_PARAMETER,
+            [ServerService.STATUS.name]);
+        var response = handler.handleRequest(request);
+        // TODO(scheglov) extract isResponseSuccess(id) matcher
+        expect(response.id, equals('0'));
+        expect(response.error, isNull);
+        // set of services has been changed
+        expect(server.serverServices, contains(ServerService.STATUS));
+      });
+    });
 
-  static void deleteContext_alreadyDeleted() {
-    AnalysisServer server = new AnalysisServer(new MockServerChannel());
-    ServerDomainHandler handler = new ServerDomainHandler(server);
-
-    String contextId = 'ctx';
-    Request createRequest = new Request('0', ServerDomainHandler.CREATE_CONTEXT_METHOD);
-    createRequest.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
-    createRequest.setParameter(AnalysisServer.CONTEXT_ID_PARAM, contextId);
-    handler.handleRequest(createRequest);
-
-    Request deleteRequest = new Request('0', ServerDomainHandler.DELETE_CONTEXT_METHOD);
-    deleteRequest.setParameter(AnalysisServer.CONTEXT_ID_PARAM, contextId);
-    handler.handleRequest(deleteRequest);
-    Response response = handler.handleRequest(deleteRequest);
-    expect(response.id, equals('0'));
-    expect(response.error, isNotNull);
-  }
-
-  static void deleteContext_doesNotExist() {
-    AnalysisServer server = new AnalysisServer(new MockServerChannel());
-    ServerDomainHandler handler = new ServerDomainHandler(server);
-
-    Request deleteRequest = new Request('0', ServerDomainHandler.DELETE_CONTEXT_METHOD);
-    deleteRequest.setParameter(AnalysisServer.CONTEXT_ID_PARAM, 'xyzzy');
-    Response response = handler.handleRequest(deleteRequest);
-    expect(response.id, equals('0'));
-    expect(response.error, isNotNull);
-  }
-
-  static void deleteContext_existing() {
-    AnalysisServer server = new AnalysisServer(new MockServerChannel());
-    ServerDomainHandler handler = new ServerDomainHandler(server);
-
-    String contextId = 'ctx';
-    Request createRequest = new Request('0', ServerDomainHandler.CREATE_CONTEXT_METHOD);
-    createRequest.setParameter(ServerDomainHandler.SDK_DIRECTORY_PARAM, sdkPath);
-    createRequest.setParameter(AnalysisServer.CONTEXT_ID_PARAM, contextId);
-    handler.createContext(createRequest);
-
-    Request deleteRequest = new Request('0', ServerDomainHandler.DELETE_CONTEXT_METHOD);
-    deleteRequest.setParameter(AnalysisServer.CONTEXT_ID_PARAM, contextId);
-    Response response = handler.handleRequest(deleteRequest);
-    expect(response.toJson(), equals({
-      Response.ID: '0'
-    }));
-  }
-
-  static void shutdown() {
-    AnalysisServer server = new AnalysisServer(new MockServerChannel());
-    ServerDomainHandler handler = new ServerDomainHandler(server);
-
-    expect(server.running, isTrue);
-    Request shutdownRequest = new Request('0', ServerDomainHandler.SHUTDOWN_METHOD);
-    Response response = handler.handleRequest(shutdownRequest);
-    expect(response.toJson(), equals({
-      Response.ID: '0'
-    }));
-    expect(server.running, isFalse);
-  }
-
-  static void version() {
-    AnalysisServer server = new AnalysisServer(new MockServerChannel());
-    ServerDomainHandler handler = new ServerDomainHandler(server);
-
-    Request versionRequest = new Request('0', ServerDomainHandler.VERSION_METHOD);
-    Response response = handler.handleRequest(versionRequest);
-    expect(response.toJson(), equals({
-      Response.ID: '0',
-      Response.RESULT: {
-        ServerDomainHandler.VERSION_RESULT: '0.0.1'
-      }
-    }));
-  }
+    test('shutdown', () {
+      expect(server.running, isTrue);
+      // send request
+      var request = new Request('0', ServerDomainHandler.SHUTDOWN_METHOD);
+      var response = handler.handleRequest(request);
+      // TODO(scheglov) extract isResponseSuccess(id) matcher
+      expect(response.toJson(), equals({
+        Response.ID: '0'
+      }));
+      // server is down
+      expect(server.running, isFalse);
+    });
+  });
 }
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 8712032..2940115 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -90,7 +90,9 @@
 }
 
 class NoResponseException implements Exception {
-  /// The request that was not responded to.
+  /**
+   * The request that was not responded to.
+   */
   final Request request;
 
   NoResponseException(this.request);
@@ -126,7 +128,9 @@
     new Future(() => notificationController.add(notification));
   }
 
-  /// Simulate request/response pair
+  /**
+   * Simulate request/response pair.
+   */
   Future<Response> sendRequest(Request request) {
     var id = request.id;
     // Wrap send request in future to simulate websocket
diff --git a/pkg/analysis_server/test/resource_test.dart b/pkg/analysis_server/test/resource_test.dart
new file mode 100644
index 0000000..4818dc6
--- /dev/null
+++ b/pkg/analysis_server/test/resource_test.dart
@@ -0,0 +1,321 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.resource;
+
+import 'dart:io' as io;
+
+import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+
+main() {
+  groupSep = ' | ';
+
+  group('MemoryResourceProvider', () {
+    MemoryResourceProvider provider;
+
+    setUp(() {
+      provider = new MemoryResourceProvider();
+    });
+
+    group('File', () {
+      group('==', () {
+        test('false', () {
+          File fileA = provider.getResource('/fileA.txt');
+          File fileB = provider.getResource('/fileB.txt');
+          expect(fileA == new Object(), isFalse);
+          expect(fileA == fileB, isFalse);
+        });
+
+        test('true', () {
+          File file = provider.getResource('/file.txt');
+          expect(file == file, isTrue);
+        });
+      });
+
+      group('exists', () {
+        test('false', () {
+          File file = provider.getResource('/file.txt');
+          expect(file, isNotNull);
+          expect(file.exists, isFalse);
+        });
+
+        test('true', () {
+          provider.newFile('/foo/file.txt', 'qwerty');
+          File file = provider.getResource('/foo/file.txt');
+          expect(file, isNotNull);
+          expect(file.exists, isTrue);
+        });
+      });
+
+      test('fullName', () {
+        File file = provider.getResource('/foo/bar/file.txt');
+        expect(file.fullName, '/foo/bar/file.txt');
+      });
+
+      test('hashCode', () {
+        File file = provider.getResource('/foo/bar/file.txt');
+        file.hashCode;
+      });
+
+      test('shortName', () {
+        File file = provider.getResource('/foo/bar/file.txt');
+        expect(file.shortName, 'file.txt');
+      });
+
+      test('toString', () {
+        File file = provider.getResource('/foo/bar/file.txt');
+        expect(file.toString(), '/foo/bar/file.txt');
+      });
+    });
+
+    group('Folder', () {
+      Folder folder;
+
+      setUp(() {
+        folder = provider.newFolder('/foo/bar');
+      });
+
+      group('getChild', () {
+        test('does not exist', () {
+          File file = folder.getChild('file.txt');
+          expect(file, isNotNull);
+          expect(file.exists, isFalse);
+        });
+
+        test('file', () {
+          provider.newFile('/foo/bar/file.txt', 'content');
+          File child = folder.getChild('file.txt');
+          expect(child, isNotNull);
+          expect(child.exists, isTrue);
+        });
+
+        test('folder', () {
+          provider.newFolder('/foo/bar/baz');
+          Folder child = folder.getChild('baz');
+          expect(child, isNotNull);
+          expect(child.exists, isTrue);
+        });
+      });
+
+      test('getChildren', () {
+        provider.newFile('/foo/bar/a.txt', 'aaa');
+        provider.newFolder('/foo/bar/bFolder');
+        provider.newFile('/foo/bar/c.txt', 'ccc');
+        // prepare 3 children
+        List<Resource> children = folder.getChildren();
+        expect(children, hasLength(3));
+        children.sort((a, b) => a.shortName.compareTo(b.shortName));
+        // check that each child exists
+        children.forEach((child) {
+          expect(child.exists, true);
+        });
+        // check names
+        expect(children[0].shortName, 'a.txt');
+        expect(children[1].shortName, 'bFolder');
+        expect(children[2].shortName, 'c.txt');
+        // check types
+        expect(children[0], _isFile);
+        expect(children[1], _isFolder);
+        expect(children[2], _isFile);
+      });
+    });
+
+    group('_MemoryFileSource', () {
+      Source source;
+
+      group('existent', () {
+        setUp(() {
+          File file = provider.newFile('/foo/test.dart', 'library test;');
+          source = file.createSource(UriKind.FILE_URI);
+        });
+
+        test('contents', () {
+          TimestampedData<String> contents = source.contents;
+          expect(contents.data, 'library test;');
+        });
+
+        test('encoding', () {
+          expect(source.encoding, 'f/foo/test.dart');
+        });
+
+        test('exists', () {
+          expect(source.exists(), isTrue);
+        });
+
+        test('fullName', () {
+          expect(source.fullName, '/foo/test.dart');
+        });
+
+        test('shortName', () {
+          expect(source.shortName, 'test.dart');
+        });
+
+        test('resolveRelative', () {
+          var relative = source.resolveRelative(new Uri.file('bar/baz.dart'));
+          expect(relative.fullName, '/foo/bar/baz.dart');
+        });
+      });
+
+      group('non-existent', () {
+        setUp(() {
+          File file = provider.getResource('/foo/test.dart');
+          source = file.createSource(UriKind.FILE_URI);
+        });
+
+        test('contents', () {
+          expect(
+            () {
+              source.contents;
+            },
+            throwsA(_isMemoryResourceException)
+          );
+        });
+
+        test('encoding', () {
+          expect(source.encoding, 'f/foo/test.dart');
+        });
+
+        test('exists', () {
+          expect(source.exists(), isFalse);
+        });
+
+        test('fullName', () {
+          expect(source.fullName, '/foo/test.dart');
+        });
+
+        test('shortName', () {
+          expect(source.shortName, 'test.dart');
+        });
+
+        test('resolveRelative', () {
+          var relative = source.resolveRelative(new Uri.file('bar/baz.dart'));
+          expect(relative.fullName, '/foo/bar/baz.dart');
+        });
+      });
+    });
+  });
+
+  group('PhysicalResourceProvider', () {
+    io.Directory tempDirectory;
+    String tempPath;
+
+    setUp(() {
+      tempDirectory = io.Directory.systemTemp.createTempSync('test_resource');
+      tempPath = tempDirectory.absolute.path;
+    });
+
+    tearDown(() {
+      tempDirectory.deleteSync(recursive: true);
+    });
+
+    group('File', () {
+      String path;
+      File file;
+
+      setUp(() {
+        path = join(tempPath, 'file.txt');
+        file = PhysicalResourceProvider.INSTANCE.getResource(path);
+      });
+
+      test('createSource', () {
+        new io.File(path).writeAsStringSync('contents');
+        var source = file.createSource(UriKind.FILE_URI);
+        expect(source.uriKind, UriKind.FILE_URI);
+        expect(source.exists(), isTrue);
+        expect(source.contents.data, 'contents');
+      });
+
+      group('exists', () {
+        test('false', () {
+          expect(file.exists, isFalse);
+        });
+
+        test('true', () {
+          new io.File(path).writeAsStringSync('contents');
+          expect(file.exists, isTrue);
+        });
+      });
+
+      test('fullName', () {
+        expect(file.fullName, path);
+      });
+
+      test('hashCode', () {
+        file.hashCode;
+      });
+
+      test('shortName', () {
+        expect(file.shortName, 'file.txt');
+      });
+
+      test('toString', () {
+        expect(file.toString(), path);
+      });
+    });
+
+    group('Folder', () {
+      String path;
+      Folder folder;
+
+      setUp(() {
+        path = join(tempPath, 'folder');
+        new io.Directory(path).createSync();
+        folder = PhysicalResourceProvider.INSTANCE.getResource(path);
+      });
+
+      group('getChild', () {
+        test('does not exist', () {
+          var child = folder.getChild('no-such-resource');
+          expect(child, isNotNull);
+          expect(child.exists, isFalse);
+        });
+
+        test('file', () {
+          new io.File(join(path, 'myFile')).createSync();
+          var child = folder.getChild('myFile');
+          expect(child, _isFile);
+          expect(child.exists, isTrue);
+        });
+
+        test('folder', () {
+          new io.Directory(join(path, 'myFolder')).createSync();
+          var child = folder.getChild('myFolder');
+          expect(child, _isFolder);
+          expect(child.exists, isTrue);
+        });
+      });
+
+      test('getChildren', () {
+        // create 2 files and 1 folder
+        new io.File(join(path, 'a.txt')).createSync();
+        new io.Directory(join(path, 'bFolder')).createSync();
+        new io.File(join(path, 'c.txt')).createSync();
+        // prepare 3 children
+        List<Resource> children = folder.getChildren();
+        expect(children, hasLength(3));
+        children.sort((a, b) => a.shortName.compareTo(b.shortName));
+        // check that each child exists
+        children.forEach((child) {
+          expect(child.exists, true);
+        });
+        // check names
+        expect(children[0].shortName, 'a.txt');
+        expect(children[1].shortName, 'bFolder');
+        expect(children[2].shortName, 'c.txt');
+        // check types
+        expect(children[0], _isFile);
+        expect(children[1], _isFolder);
+        expect(children[2], _isFile);
+      });
+    });
+  });
+}
+
+var _isFile = new isInstanceOf<File>();
+var _isFolder = new isInstanceOf<Folder>();
+var _isMemoryResourceException = new isInstanceOf<MemoryResourceException>();
diff --git a/pkg/analysis_server/test/test_all.dart b/pkg/analysis_server/test/test_all.dart
index e230a51..b7c5df6 100644
--- a/pkg/analysis_server/test/test_all.dart
+++ b/pkg/analysis_server/test/test_all.dart
@@ -6,19 +6,26 @@
 
 import 'analysis_server_test.dart' as analysis_server_test;
 import 'channel_test.dart' as channel_test;
+import 'domain_analysis_test.dart' as domain_analysis_test;
 import 'domain_context_test.dart' as domain_context_test;
 import 'domain_server_test.dart' as domain_server_test;
 import 'protocol_test.dart' as protocol_test;
+import 'resource_test.dart' as resource_test;
 import 'socket_server_test.dart' as socket_server_test;
 
-/// Utility for manually running all tests
+/**
+ * Utility for manually running all tests.
+ */
 main() {
+  groupSep = ' | ';
   group('analysis_server', () {
     analysis_server_test.main();
     channel_test.main();
+    domain_analysis_test.main();
     domain_context_test.main();
     domain_server_test.main();
     protocol_test.main();
+    resource_test.main();
     socket_server_test.main();
   });
 }
\ No newline at end of file
diff --git a/pkg/analysis_services/pubspec.yaml b/pkg/analysis_services/pubspec.yaml
index 960ff75..b2059ef 100644
--- a/pkg/analysis_services/pubspec.yaml
+++ b/pkg/analysis_services/pubspec.yaml
@@ -1,11 +1,11 @@
 name: analysis_services
-version: 0.0.1
+version: 0.0.2
 author: Dart Team <misc@dartlang.org>
 description: A set of services on top of Analysis Engine
 homepage: http://www.dartlang.org
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analyzer: 0.15.1
+  analyzer: '>=0.15.1 <0.16.0'
 dev_dependencies:
   unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/analyzer/lib/options.dart b/pkg/analyzer/lib/options.dart
index 0922223..7dae073 100644
--- a/pkg/analyzer/lib/options.dart
+++ b/pkg/analyzer/lib/options.dart
@@ -24,6 +24,9 @@
   /** Whether to display version information */
   final bool displayVersion;
 
+  /** A table mapping the names of defined variables to their values. */
+  final Map<String, String> definedVariables;
+
   /** Whether to report hints */
   final bool disableHints;
 
@@ -60,7 +63,7 @@
   /**
    * Initialize options from the given parsed [args].
    */
-  CommandLineOptions._fromArgs(ArgResults args)
+  CommandLineOptions._fromArgs(ArgResults args, Map<String, String> definedVariables)
     : shouldBatch = args['batch'],
       machineFormat = args['machine'] || args['format'] == 'machine',
       displayVersion = args['version'],
@@ -74,7 +77,8 @@
       dartSdkPath = args['dart-sdk'],
       packageRootPath = args['package-root'],
       log = args['log'],
-      sourceFiles = args.rest;
+      sourceFiles = args.rest,
+      this.definedVariables = definedVariables;
 
   /**
    * Parse [args] into [CommandLineOptions] describing the specified
@@ -146,7 +150,8 @@
     try {
       // TODO(scheglov) https://code.google.com/p/dart/issues/detail?id=11061
       args = args.map((String arg) => arg == '-batch' ? '--batch' : arg).toList();
-      var results = parser.parse(args);
+      Map<String, String> definedVariables = <String, String>{};
+      var results = parser.parse(args, definedVariables);
       // help requests
       if (results['help']) {
         _showUsage(parser);
@@ -168,7 +173,7 @@
           exit(15);
         }
       }
-      return new CommandLineOptions._fromArgs(results);
+      return new CommandLineOptions._fromArgs(results, definedVariables);
     } on FormatException catch (e) {
       print(e.message);
       _showUsage(parser);
@@ -249,11 +254,30 @@
 
   /**
    * Parses [args], a list of command-line arguments, matches them against the
-   * flags and options defined by this parser, and returns the result.
+   * flags and options defined by this parser, and returns the result. The
+   * values of any defined variables are captured in the given map.
    *
    * See [ArgParser].
    */
-  ArgResults parse(List<String> args) => _parser.parse(_filterUnknowns(args));
+  ArgResults parse(List<String> args, Map<String, String> definedVariables) => _parser.parse(_filterUnknowns(parseDefinedVariables(args, definedVariables)));
+
+  List<String> parseDefinedVariables(List<String> args, Map<String, String> definedVariables) {
+    int count = args.length;
+    List<String> remainingArgs = <String>[];
+    for (int i = 0; i < count; i++) {
+      String arg = args[i];
+      if (arg == '--') {
+        while (i < count) {
+          remainingArgs.add(args[i++]);
+        }
+      } else if (arg.startsWith("-D")) {
+        definedVariables[arg.substring(2)] = args[++i];
+      } else {
+        remainingArgs.add(arg);
+      }
+    }
+    return remainingArgs;
+  }
 
   List<String> _filterUnknowns(args) {
 
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 52c3f81..870309a 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -3075,7 +3075,7 @@
    * The type of exceptions caught by this catch clause, or `null` if this catch clause
    * catches every type of exception.
    */
-  TypeName exceptionType;
+  TypeName _exceptionType;
 
   /**
    * The token representing the 'catch' keyword, or `null` if there is no 'catch' keyword.
@@ -3128,7 +3128,7 @@
    * @param body the body of the catch block
    */
   CatchClause(this.onKeyword, TypeName exceptionType, this.catchKeyword, Token leftParenthesis, SimpleIdentifier exceptionParameter, this.comma, SimpleIdentifier stackTraceParameter, Token rightParenthesis, Block body) {
-    this.exceptionType = becomeParentOf(exceptionType);
+    this._exceptionType = becomeParentOf(exceptionType);
     this._leftParenthesis = leftParenthesis;
     this._exceptionParameter = becomeParentOf(exceptionParameter);
     this._stackTraceParameter = becomeParentOf(stackTraceParameter);
@@ -3165,6 +3165,14 @@
   SimpleIdentifier get exceptionParameter => _exceptionParameter;
 
   /**
+   * Return the type of exceptions caught by this catch clause, or `null` if this catch clause
+   * catches every type of exception.
+   *
+   * @return the type of exceptions caught by this catch clause
+   */
+  TypeName get exceptionType => _exceptionType;
+
+  /**
    * Return the left parenthesis.
    *
    * @return the left parenthesis
@@ -3205,6 +3213,15 @@
   }
 
   /**
+   * Set the type of exceptions caught by this catch clause to the given type.
+   *
+   * @param exceptionType the type of exceptions caught by this catch clause
+   */
+  void set exceptionType(TypeName exceptionType) {
+    this._exceptionType = becomeParentOf(exceptionType);
+  }
+
+  /**
    * Set the left parenthesis to the given token.
    *
    * @param parenthesis the left parenthesis
@@ -3235,7 +3252,7 @@
 
   @override
   void visitChildren(AstVisitor visitor) {
-    safelyVisitChild(exceptionType, visitor);
+    safelyVisitChild(_exceptionType, visitor);
     safelyVisitChild(_exceptionParameter, visitor);
     safelyVisitChild(_stackTraceParameter, visitor);
     safelyVisitChild(_body, visitor);
@@ -3273,7 +3290,7 @@
    * The type parameters for the class, or `null` if the class does not have any type
    * parameters.
    */
-  TypeParameterList typeParameters;
+  TypeParameterList _typeParameters;
 
   /**
    * The extends clause for the class, or `null` if the class does not extend any other class.
@@ -3294,7 +3311,7 @@
   /**
    * The native clause for the class, or `null` if the class does not have a native clause.
    */
-  NativeClause nativeClause;
+  NativeClause _nativeClause;
 
   /**
    * The left curly bracket.
@@ -3330,7 +3347,7 @@
   ClassDeclaration(Comment comment, List<Annotation> metadata, this.abstractKeyword, this.classKeyword, SimpleIdentifier name, TypeParameterList typeParameters, ExtendsClause extendsClause, WithClause withClause, ImplementsClause implementsClause, this.leftBracket, List<ClassMember> members, this.rightBracket) : super(comment, metadata) {
     this._members = new NodeList<ClassMember>(this);
     this._name = becomeParentOf(name);
-    this.typeParameters = becomeParentOf(typeParameters);
+    this._typeParameters = becomeParentOf(typeParameters);
     this._extendsClause = becomeParentOf(extendsClause);
     this._withClause = becomeParentOf(withClause);
     this._implementsClause = becomeParentOf(implementsClause);
@@ -3440,6 +3457,22 @@
   SimpleIdentifier get name => _name;
 
   /**
+   * Return the native clause for this class, or `null` if the class does not have a native
+   * cluse.
+   *
+   * @return the native clause for this class
+   */
+  NativeClause get nativeClause => _nativeClause;
+
+  /**
+   * Return the type parameters for the class, or `null` if the class does not have any type
+   * parameters.
+   *
+   * @return the type parameters for the class
+   */
+  TypeParameterList get typeParameters => _typeParameters;
+
+  /**
    * Return the with clause for the class, or `null` if the class does not have a with clause.
    *
    * @return the with clause for the class
@@ -3481,6 +3514,24 @@
   }
 
   /**
+   * Set the native clause for this class to the given clause.
+   *
+   * @param nativeClause the native clause for this class
+   */
+  void set nativeClause(NativeClause nativeClause) {
+    this._nativeClause = becomeParentOf(nativeClause);
+  }
+
+  /**
+   * Set the type parameters for the class to the given list of type parameters.
+   *
+   * @param typeParameters the type parameters for the class
+   */
+  void set typeParameters(TypeParameterList typeParameters) {
+    this._typeParameters = becomeParentOf(typeParameters);
+  }
+
+  /**
    * Set the with clause for the class to the given clause.
    *
    * @param withClause the with clause for the class
@@ -3493,11 +3544,11 @@
   void visitChildren(AstVisitor visitor) {
     super.visitChildren(visitor);
     safelyVisitChild(_name, visitor);
-    safelyVisitChild(typeParameters, visitor);
+    safelyVisitChild(_typeParameters, visitor);
     safelyVisitChild(_extendsClause, visitor);
     safelyVisitChild(_withClause, visitor);
     safelyVisitChild(_implementsClause, visitor);
-    safelyVisitChild(nativeClause, visitor);
+    safelyVisitChild(_nativeClause, visitor);
     members.accept(visitor);
   }
 
@@ -3906,7 +3957,7 @@
    * @param identifier the identifier being referenced
    */
   void set identifier(Identifier identifier) {
-    identifier = becomeParentOf(identifier);
+    this._identifier = becomeParentOf(identifier);
   }
 
   @override
@@ -5290,6 +5341,15 @@
   bool get isFinal => (keyword is KeywordToken) && (keyword as KeywordToken).keyword == Keyword.FINAL;
 
   /**
+   * Set the name of the variable being declared to the given name.
+   *
+   * @param identifier the new name of the variable being declared
+   */
+  void set identifier(SimpleIdentifier identifier) {
+    this._identifier = becomeParentOf(identifier);
+  }
+
+  /**
    * Set the name of the declared type of the parameter to the given type name.
    *
    * @param typeName the name of the declared type of the parameter
@@ -6415,7 +6475,7 @@
    * @param fieldList the fields being declared
    */
   void set fields(VariableDeclarationList fieldList) {
-    fieldList = becomeParentOf(fieldList);
+    this._fieldList = becomeParentOf(fieldList);
   }
 
   @override
@@ -6892,7 +6952,7 @@
    * @param variableList the declaration of the loop variables
    */
   void set variables(VariableDeclarationList variableList) {
-    variableList = becomeParentOf(variableList);
+    this._variableList = becomeParentOf(variableList);
   }
 
   @override
@@ -7265,7 +7325,7 @@
    * @param functionExpression the function expression being wrapped
    */
   void set functionExpression(FunctionExpression functionExpression) {
-    functionExpression = becomeParentOf(functionExpression);
+    this._functionExpression = becomeParentOf(functionExpression);
   }
 
   /**
@@ -7274,16 +7334,16 @@
    * @param identifier the name of the function
    */
   void set name(SimpleIdentifier identifier) {
-    _name = becomeParentOf(identifier);
+    this._name = becomeParentOf(identifier);
   }
 
   /**
    * Set the return type of the function to the given name.
    *
-   * @param name the return type of the function
+   * @param returnType the return type of the function
    */
-  void set returnType(TypeName name) {
-    _returnType = becomeParentOf(name);
+  void set returnType(TypeName returnType) {
+    this._returnType = becomeParentOf(returnType);
   }
 
   @override
@@ -7350,7 +7410,7 @@
    *
    * @param functionDeclaration the function declaration being wrapped
    */
-  void set functionExpression(FunctionDeclaration functionDeclaration) {
+  void set functionDeclaration(FunctionDeclaration functionDeclaration) {
     this._functionDeclaration = becomeParentOf(functionDeclaration);
   }
 
@@ -7578,7 +7638,7 @@
    * @param function the expression producing the function being invoked
    */
   void set function(Expression function) {
-    function = becomeParentOf(function);
+    this._function = becomeParentOf(function);
   }
 
   /**
@@ -9673,7 +9733,7 @@
   /**
    * The name of the constructor to be invoked.
    */
-  ConstructorName constructorName;
+  ConstructorName _constructorName;
 
   /**
    * The list of arguments to the constructor.
@@ -9699,7 +9759,7 @@
    * @param argumentList the list of arguments to the constructor
    */
   InstanceCreationExpression(this.keyword, ConstructorName constructorName, ArgumentList argumentList) {
-    this.constructorName = becomeParentOf(constructorName);
+    this._constructorName = becomeParentOf(constructorName);
     this._argumentList = becomeParentOf(argumentList);
   }
 
@@ -9716,6 +9776,13 @@
   @override
   Token get beginToken => keyword;
 
+  /**
+   * Return the name of the constructor to be invoked.
+   *
+   * @return the name of the constructor to be invoked
+   */
+  ConstructorName get constructorName => _constructorName;
+
   @override
   Token get endToken => _argumentList.endToken;
 
@@ -9748,6 +9815,15 @@
   }
 
   /**
+   * Set the name of the constructor to be invoked to the given name.
+   *
+   * @param constructorName the name of the constructor to be invoked
+   */
+  void set constructorName(ConstructorName constructorName) {
+    this._constructorName = becomeParentOf(constructorName);
+  }
+
+  /**
    * Set the result of evaluating this expression as a compile-time constant expression to the given
    * result.
    *
@@ -9759,7 +9835,7 @@
 
   @override
   void visitChildren(AstVisitor visitor) {
-    safelyVisitChild(constructorName, visitor);
+    safelyVisitChild(_constructorName, visitor);
     safelyVisitChild(_argumentList, visitor);
   }
 }
@@ -11227,7 +11303,7 @@
   /**
    * The name of the native object that implements the class.
    */
-  StringLiteral name;
+  StringLiteral _name;
 
   /**
    * Initialize a newly created native clause.
@@ -11235,7 +11311,9 @@
    * @param keyword the token representing the 'native' keyword
    * @param name the name of the native object that implements the class.
    */
-  NativeClause(this.keyword, this.name);
+  NativeClause(this.keyword, StringLiteral name) {
+    this._name = becomeParentOf(name);
+  }
 
   @override
   accept(AstVisitor visitor) => visitor.visitNativeClause(this);
@@ -11244,11 +11322,27 @@
   Token get beginToken => keyword;
 
   @override
-  Token get endToken => name.endToken;
+  Token get endToken => _name.endToken;
+
+  /**
+   * Return the name of the native object that implements the class.
+   *
+   * @return the name of the native object that implements the class
+   */
+  StringLiteral get name => _name;
+
+  /**
+   * Sets the name of the native object that implements the class.
+   *
+   * @param name the name of the native object that implements the class.
+   */
+  void set name(StringLiteral name) {
+    this._name = becomeParentOf(name);
+  }
 
   @override
   void visitChildren(AstVisitor visitor) {
-    safelyVisitChild(name, visitor);
+    safelyVisitChild(_name, visitor);
   }
 }
 
@@ -11305,6 +11399,15 @@
    */
   StringLiteral get stringLiteral => _stringLiteral;
 
+  /**
+   * Set the string literal representing the string after the 'native' token to the given string.
+   *
+   * @param stringLiteral the string literal representing the string after the 'native' token
+   */
+  void set stringLiteral(StringLiteral stringLiteral) {
+    this._stringLiteral = becomeParentOf(stringLiteral);
+  }
+
   @override
   void visitChildren(AstVisitor visitor) {
     safelyVisitChild(_stringLiteral, visitor);
@@ -11419,6 +11522,1121 @@
 }
 
 /**
+ * Instances of the class `NodeReplacer` implement an object that will replace one child node
+ * in an AST node with another node.
+ */
+class NodeReplacer implements AstVisitor<bool> {
+  /**
+   * Replace the old node with the new node in the AST structure containing the old node.
+   *
+   * @param oldNode
+   * @param newNode
+   * @return `true` if the replacement was successful
+   * @throws IllegalArgumentException if either node is `null`, if the old node does not have
+   *           a parent node, or if the AST structure has been corrupted
+   */
+  static bool replace(AstNode oldNode, AstNode newNode) {
+    if (oldNode == null || newNode == null) {
+      throw new IllegalArgumentException("The old and new nodes must be non-null");
+    } else if (identical(oldNode, newNode)) {
+      return true;
+    }
+    AstNode parent = oldNode.parent;
+    if (parent == null) {
+      throw new IllegalArgumentException("The old node is not a child of another node");
+    }
+    NodeReplacer replacer = new NodeReplacer(oldNode, newNode);
+    return parent.accept(replacer);
+  }
+
+  final AstNode _oldNode;
+
+  final AstNode _newNode;
+
+  NodeReplacer(this._oldNode, this._newNode);
+
+  @override
+  bool visitAdjacentStrings(AdjacentStrings node) {
+    if (_replaceInList(node.strings)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  bool visitAnnotatedNode(AnnotatedNode node) {
+    if (identical(node.documentationComment, _oldNode)) {
+      node.documentationComment = _newNode as Comment;
+      return true;
+    } else if (_replaceInList(node.metadata)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitAnnotation(Annotation node) {
+    if (identical(node.arguments, _oldNode)) {
+      node.arguments = _newNode as ArgumentList;
+      return true;
+    } else if (identical(node.constructorName, _oldNode)) {
+      node.constructorName = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.name, _oldNode)) {
+      node.name = _newNode as Identifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitArgumentList(ArgumentList node) {
+    if (_replaceInList(node.arguments)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitAsExpression(AsExpression node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    } else if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeName;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitAssertStatement(AssertStatement node) {
+    if (identical(node.condition, _oldNode)) {
+      node.condition = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitAssignmentExpression(AssignmentExpression node) {
+    if (identical(node.leftHandSide, _oldNode)) {
+      node.leftHandSide = _newNode as Expression;
+      return true;
+    } else if (identical(node.rightHandSide, _oldNode)) {
+      node.rightHandSide = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitBinaryExpression(BinaryExpression node) {
+    if (identical(node.leftOperand, _oldNode)) {
+      node.leftOperand = _newNode as Expression;
+      return true;
+    } else if (identical(node.rightOperand, _oldNode)) {
+      node.rightOperand = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitBlock(Block node) {
+    if (_replaceInList(node.statements)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitBlockFunctionBody(BlockFunctionBody node) {
+    if (identical(node.block, _oldNode)) {
+      node.block = _newNode as Block;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitBooleanLiteral(BooleanLiteral node) => visitNode(node);
+
+  @override
+  bool visitBreakStatement(BreakStatement node) {
+    if (identical(node.label, _oldNode)) {
+      node.label = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitCascadeExpression(CascadeExpression node) {
+    if (identical(node.target, _oldNode)) {
+      node.target = _newNode as Expression;
+      return true;
+    } else if (_replaceInList(node.cascadeSections)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitCatchClause(CatchClause node) {
+    if (identical(node.exceptionType, _oldNode)) {
+      node.exceptionType = _newNode as TypeName;
+      return true;
+    } else if (identical(node.exceptionParameter, _oldNode)) {
+      node.exceptionParameter = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.stackTraceParameter, _oldNode)) {
+      node.stackTraceParameter = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitClassDeclaration(ClassDeclaration node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.typeParameters, _oldNode)) {
+      node.typeParameters = _newNode as TypeParameterList;
+      return true;
+    } else if (identical(node.extendsClause, _oldNode)) {
+      node.extendsClause = _newNode as ExtendsClause;
+      return true;
+    } else if (identical(node.withClause, _oldNode)) {
+      node.withClause = _newNode as WithClause;
+      return true;
+    } else if (identical(node.implementsClause, _oldNode)) {
+      node.implementsClause = _newNode as ImplementsClause;
+      return true;
+    } else if (identical(node.nativeClause, _oldNode)) {
+      node.nativeClause = _newNode as NativeClause;
+      return true;
+    } else if (_replaceInList(node.members)) {
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitClassTypeAlias(ClassTypeAlias node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.typeParameters, _oldNode)) {
+      node.typeParameters = _newNode as TypeParameterList;
+      return true;
+    } else if (identical(node.superclass, _oldNode)) {
+      node.superclass = _newNode as TypeName;
+      return true;
+    } else if (identical(node.withClause, _oldNode)) {
+      node.withClause = _newNode as WithClause;
+      return true;
+    } else if (identical(node.implementsClause, _oldNode)) {
+      node.implementsClause = _newNode as ImplementsClause;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitComment(Comment node) {
+    if (_replaceInList(node.references)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitCommentReference(CommentReference node) {
+    if (identical(node.identifier, _oldNode)) {
+      node.identifier = _newNode as Identifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitCompilationUnit(CompilationUnit node) {
+    if (identical(node.scriptTag, _oldNode)) {
+      node.scriptTag = _newNode as ScriptTag;
+      return true;
+    } else if (_replaceInList(node.directives)) {
+      return true;
+    } else if (_replaceInList(node.declarations)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitConditionalExpression(ConditionalExpression node) {
+    if (identical(node.condition, _oldNode)) {
+      node.condition = _newNode as Expression;
+      return true;
+    } else if (identical(node.thenExpression, _oldNode)) {
+      node.thenExpression = _newNode as Expression;
+      return true;
+    } else if (identical(node.elseExpression, _oldNode)) {
+      node.elseExpression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitConstructorDeclaration(ConstructorDeclaration node) {
+    if (identical(node.returnType, _oldNode)) {
+      node.returnType = _newNode as Identifier;
+      return true;
+    } else if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.parameters, _oldNode)) {
+      node.parameters = _newNode as FormalParameterList;
+      return true;
+    } else if (identical(node.redirectedConstructor, _oldNode)) {
+      node.redirectedConstructor = _newNode as ConstructorName;
+      return true;
+    } else if (identical(node.body, _oldNode)) {
+      node.body = _newNode as FunctionBody;
+      return true;
+    } else if (_replaceInList(node.initializers)) {
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitConstructorFieldInitializer(ConstructorFieldInitializer node) {
+    if (identical(node.fieldName, _oldNode)) {
+      node.fieldName = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitConstructorName(ConstructorName node) {
+    if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeName;
+      return true;
+    } else if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitContinueStatement(ContinueStatement node) {
+    if (identical(node.label, _oldNode)) {
+      node.label = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitDeclaredIdentifier(DeclaredIdentifier node) {
+    if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeName;
+      return true;
+    } else if (identical(node.identifier, _oldNode)) {
+      node.identifier = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitDefaultFormalParameter(DefaultFormalParameter node) {
+    if (identical(node.parameter, _oldNode)) {
+      node.parameter = _newNode as NormalFormalParameter;
+      return true;
+    } else if (identical(node.defaultValue, _oldNode)) {
+      node.defaultValue = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitDoStatement(DoStatement node) {
+    if (identical(node.body, _oldNode)) {
+      node.body = _newNode as Statement;
+      return true;
+    } else if (identical(node.condition, _oldNode)) {
+      node.condition = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitDoubleLiteral(DoubleLiteral node) => visitNode(node);
+
+  @override
+  bool visitEmptyFunctionBody(EmptyFunctionBody node) => visitNode(node);
+
+  @override
+  bool visitEmptyStatement(EmptyStatement node) => visitNode(node);
+
+  @override
+  bool visitExportDirective(ExportDirective node) => visitNamespaceDirective(node);
+
+  @override
+  bool visitExpressionFunctionBody(ExpressionFunctionBody node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitExpressionStatement(ExpressionStatement node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitExtendsClause(ExtendsClause node) {
+    if (identical(node.superclass, _oldNode)) {
+      node.superclass = _newNode as TypeName;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitFieldDeclaration(FieldDeclaration node) {
+    if (identical(node.fields, _oldNode)) {
+      node.fields = _newNode as VariableDeclarationList;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitFieldFormalParameter(FieldFormalParameter node) {
+    if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeName;
+      return true;
+    } else if (identical(node.parameters, _oldNode)) {
+      node.parameters = _newNode as FormalParameterList;
+      return true;
+    }
+    return visitNormalFormalParameter(node);
+  }
+
+  @override
+  bool visitForEachStatement(ForEachStatement node) {
+    if (identical(node.loopVariable, _oldNode)) {
+      node.loopVariable = _newNode as DeclaredIdentifier;
+      return true;
+    } else if (identical(node.identifier, _oldNode)) {
+      node.identifier = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.iterator, _oldNode)) {
+      node.iterator = _newNode as Expression;
+      return true;
+    } else if (identical(node.body, _oldNode)) {
+      node.body = _newNode as Statement;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitFormalParameterList(FormalParameterList node) {
+    if (_replaceInList(node.parameters)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitForStatement(ForStatement node) {
+    if (identical(node.variables, _oldNode)) {
+      node.variables = _newNode as VariableDeclarationList;
+      return true;
+    } else if (identical(node.initialization, _oldNode)) {
+      node.initialization = _newNode as Expression;
+      return true;
+    } else if (identical(node.condition, _oldNode)) {
+      node.condition = _newNode as Expression;
+      return true;
+    } else if (identical(node.body, _oldNode)) {
+      node.body = _newNode as Statement;
+      return true;
+    } else if (_replaceInList(node.updaters)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitFunctionDeclaration(FunctionDeclaration node) {
+    if (identical(node.returnType, _oldNode)) {
+      node.returnType = _newNode as TypeName;
+      return true;
+    } else if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.functionExpression, _oldNode)) {
+      node.functionExpression = _newNode as FunctionExpression;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitFunctionDeclarationStatement(FunctionDeclarationStatement node) {
+    if (identical(node.functionDeclaration, _oldNode)) {
+      node.functionDeclaration = _newNode as FunctionDeclaration;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitFunctionExpression(FunctionExpression node) {
+    if (identical(node.parameters, _oldNode)) {
+      node.parameters = _newNode as FormalParameterList;
+      return true;
+    } else if (identical(node.body, _oldNode)) {
+      node.body = _newNode as FunctionBody;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    if (identical(node.function, _oldNode)) {
+      node.function = _newNode as Expression;
+      return true;
+    } else if (identical(node.argumentList, _oldNode)) {
+      node.argumentList = _newNode as ArgumentList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitFunctionTypeAlias(FunctionTypeAlias node) {
+    if (identical(node.returnType, _oldNode)) {
+      node.returnType = _newNode as TypeName;
+      return true;
+    } else if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.typeParameters, _oldNode)) {
+      node.typeParameters = _newNode as TypeParameterList;
+      return true;
+    } else if (identical(node.parameters, _oldNode)) {
+      node.parameters = _newNode as FormalParameterList;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) {
+    if (identical(node.returnType, _oldNode)) {
+      node.returnType = _newNode as TypeName;
+      return true;
+    } else if (identical(node.parameters, _oldNode)) {
+      node.parameters = _newNode as FormalParameterList;
+      return true;
+    }
+    return visitNormalFormalParameter(node);
+  }
+
+  @override
+  bool visitHideCombinator(HideCombinator node) {
+    if (_replaceInList(node.hiddenNames)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitIfStatement(IfStatement node) {
+    if (identical(node.condition, _oldNode)) {
+      node.condition = _newNode as Expression;
+      return true;
+    } else if (identical(node.thenStatement, _oldNode)) {
+      node.thenStatement = _newNode as Statement;
+      return true;
+    } else if (identical(node.elseStatement, _oldNode)) {
+      node.elseStatement = _newNode as Statement;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitImplementsClause(ImplementsClause node) {
+    if (_replaceInList(node.interfaces)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitImportDirective(ImportDirective node) {
+    if (identical(node.prefix, _oldNode)) {
+      node.prefix = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNamespaceDirective(node);
+  }
+
+  @override
+  bool visitIndexExpression(IndexExpression node) {
+    if (identical(node.target, _oldNode)) {
+      node.target = _newNode as Expression;
+      return true;
+    } else if (identical(node.index, _oldNode)) {
+      node.index = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitInstanceCreationExpression(InstanceCreationExpression node) {
+    if (identical(node.constructorName, _oldNode)) {
+      node.constructorName = _newNode as ConstructorName;
+      return true;
+    } else if (identical(node.argumentList, _oldNode)) {
+      node.argumentList = _newNode as ArgumentList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitIntegerLiteral(IntegerLiteral node) => visitNode(node);
+
+  @override
+  bool visitInterpolationExpression(InterpolationExpression node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitInterpolationString(InterpolationString node) => visitNode(node);
+
+  @override
+  bool visitIsExpression(IsExpression node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    } else if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeName;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitLabel(Label node) {
+    if (identical(node.label, _oldNode)) {
+      node.label = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitLabeledStatement(LabeledStatement node) {
+    if (identical(node.statement, _oldNode)) {
+      node.statement = _newNode as Statement;
+      return true;
+    } else if (_replaceInList(node.labels)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitLibraryDirective(LibraryDirective node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as LibraryIdentifier;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitLibraryIdentifier(LibraryIdentifier node) {
+    if (_replaceInList(node.components)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitListLiteral(ListLiteral node) {
+    if (_replaceInList(node.elements)) {
+      return true;
+    }
+    return visitTypedLiteral(node);
+  }
+
+  @override
+  bool visitMapLiteral(MapLiteral node) {
+    if (_replaceInList(node.entries)) {
+      return true;
+    }
+    return visitTypedLiteral(node);
+  }
+
+  @override
+  bool visitMapLiteralEntry(MapLiteralEntry node) {
+    if (identical(node.key, _oldNode)) {
+      node.key = _newNode as Expression;
+      return true;
+    } else if (identical(node.value, _oldNode)) {
+      node.value = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitMethodDeclaration(MethodDeclaration node) {
+    if (identical(node.returnType, _oldNode)) {
+      node.returnType = _newNode as TypeName;
+      return true;
+    } else if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.parameters, _oldNode)) {
+      node.parameters = _newNode as FormalParameterList;
+      return true;
+    } else if (identical(node.body, _oldNode)) {
+      node.body = _newNode as FunctionBody;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitMethodInvocation(MethodInvocation node) {
+    if (identical(node.target, _oldNode)) {
+      node.target = _newNode as Expression;
+      return true;
+    } else if (identical(node.methodName, _oldNode)) {
+      node.methodName = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.argumentList, _oldNode)) {
+      node.argumentList = _newNode as ArgumentList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitNamedExpression(NamedExpression node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as Label;
+      return true;
+    } else if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  bool visitNamespaceDirective(NamespaceDirective node) {
+    if (_replaceInList(node.combinators)) {
+      return true;
+    }
+    return visitUriBasedDirective(node);
+  }
+
+  @override
+  bool visitNativeClause(NativeClause node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as StringLiteral;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitNativeFunctionBody(NativeFunctionBody node) {
+    if (identical(node.stringLiteral, _oldNode)) {
+      node.stringLiteral = _newNode as StringLiteral;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  bool visitNode(AstNode node) {
+    throw new IllegalArgumentException("The old node is not a child of it's parent");
+  }
+
+  bool visitNormalFormalParameter(NormalFormalParameter node) {
+    if (identical(node.documentationComment, _oldNode)) {
+      node.documentationComment = _newNode as Comment;
+      return true;
+    } else if (identical(node.identifier, _oldNode)) {
+      node.identifier = _newNode as SimpleIdentifier;
+      return true;
+    } else if (_replaceInList(node.metadata)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitNullLiteral(NullLiteral node) => visitNode(node);
+
+  @override
+  bool visitParenthesizedExpression(ParenthesizedExpression node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitPartDirective(PartDirective node) => visitUriBasedDirective(node);
+
+  @override
+  bool visitPartOfDirective(PartOfDirective node) {
+    if (identical(node.libraryName, _oldNode)) {
+      node.libraryName = _newNode as LibraryIdentifier;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitPostfixExpression(PostfixExpression node) {
+    if (identical(node.operand, _oldNode)) {
+      node.operand = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitPrefixedIdentifier(PrefixedIdentifier node) {
+    if (identical(node.prefix, _oldNode)) {
+      node.prefix = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.identifier, _oldNode)) {
+      node.identifier = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitPrefixExpression(PrefixExpression node) {
+    if (identical(node.operand, _oldNode)) {
+      node.operand = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitPropertyAccess(PropertyAccess node) {
+    if (identical(node.target, _oldNode)) {
+      node.target = _newNode as Expression;
+      return true;
+    } else if (identical(node.propertyName, _oldNode)) {
+      node.propertyName = _newNode as SimpleIdentifier;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitRedirectingConstructorInvocation(RedirectingConstructorInvocation node) {
+    if (identical(node.constructorName, _oldNode)) {
+      node.constructorName = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.argumentList, _oldNode)) {
+      node.argumentList = _newNode as ArgumentList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitRethrowExpression(RethrowExpression node) => visitNode(node);
+
+  @override
+  bool visitReturnStatement(ReturnStatement node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitScriptTag(ScriptTag scriptTag) => visitNode(scriptTag);
+
+  @override
+  bool visitShowCombinator(ShowCombinator node) {
+    if (_replaceInList(node.shownNames)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitSimpleFormalParameter(SimpleFormalParameter node) {
+    if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeName;
+      return true;
+    }
+    return visitNormalFormalParameter(node);
+  }
+
+  @override
+  bool visitSimpleIdentifier(SimpleIdentifier node) => visitNode(node);
+
+  @override
+  bool visitSimpleStringLiteral(SimpleStringLiteral node) => visitNode(node);
+
+  @override
+  bool visitStringInterpolation(StringInterpolation node) {
+    if (_replaceInList(node.elements)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    if (identical(node.constructorName, _oldNode)) {
+      node.constructorName = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.argumentList, _oldNode)) {
+      node.argumentList = _newNode as ArgumentList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitSuperExpression(SuperExpression node) => visitNode(node);
+
+  @override
+  bool visitSwitchCase(SwitchCase node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitSwitchMember(node);
+  }
+
+  @override
+  bool visitSwitchDefault(SwitchDefault node) => visitSwitchMember(node);
+
+  bool visitSwitchMember(SwitchMember node) {
+    if (_replaceInList(node.labels)) {
+      return true;
+    } else if (_replaceInList(node.statements)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitSwitchStatement(SwitchStatement node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    } else if (_replaceInList(node.members)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitSymbolLiteral(SymbolLiteral node) => visitNode(node);
+
+  @override
+  bool visitThisExpression(ThisExpression node) => visitNode(node);
+
+  @override
+  bool visitThrowExpression(ThrowExpression node) {
+    if (identical(node.expression, _oldNode)) {
+      node.expression = _newNode as Expression;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
+    if (identical(node.variables, _oldNode)) {
+      node.variables = _newNode as VariableDeclarationList;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitTryStatement(TryStatement node) {
+    if (identical(node.body, _oldNode)) {
+      node.body = _newNode as Block;
+      return true;
+    } else if (identical(node.finallyBlock, _oldNode)) {
+      node.finallyBlock = _newNode as Block;
+      return true;
+    } else if (_replaceInList(node.catchClauses)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitTypeArgumentList(TypeArgumentList node) {
+    if (_replaceInList(node.arguments)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  bool visitTypedLiteral(TypedLiteral node) {
+    if (identical(node.typeArguments, _oldNode)) {
+      node.typeArguments = _newNode as TypeArgumentList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitTypeName(TypeName node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as Identifier;
+      return true;
+    } else if (identical(node.typeArguments, _oldNode)) {
+      node.typeArguments = _newNode as TypeArgumentList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitTypeParameter(TypeParameter node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.bound, _oldNode)) {
+      node.bound = _newNode as TypeName;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitTypeParameterList(TypeParameterList node) {
+    if (_replaceInList(node.typeParameters)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  bool visitUriBasedDirective(UriBasedDirective node) {
+    if (identical(node.uri, _oldNode)) {
+      node.uri = _newNode as StringLiteral;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitVariableDeclaration(VariableDeclaration node) {
+    if (identical(node.name, _oldNode)) {
+      node.name = _newNode as SimpleIdentifier;
+      return true;
+    } else if (identical(node.initializer, _oldNode)) {
+      node.initializer = _newNode as Expression;
+      return true;
+    }
+    return visitAnnotatedNode(node);
+  }
+
+  @override
+  bool visitVariableDeclarationList(VariableDeclarationList node) {
+    if (identical(node.type, _oldNode)) {
+      node.type = _newNode as TypeName;
+      return true;
+    } else if (_replaceInList(node.variables)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitVariableDeclarationStatement(VariableDeclarationStatement node) {
+    if (identical(node.variables, _oldNode)) {
+      node.variables = _newNode as VariableDeclarationList;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitWhileStatement(WhileStatement node) {
+    if (identical(node.condition, _oldNode)) {
+      node.condition = _newNode as Expression;
+      return true;
+    } else if (identical(node.body, _oldNode)) {
+      node.body = _newNode as Statement;
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  @override
+  bool visitWithClause(WithClause node) {
+    if (_replaceInList(node.mixinTypes)) {
+      return true;
+    }
+    return visitNode(node);
+  }
+
+  bool _replaceInList(NodeList list) {
+    int count = list.length;
+    for (int i = 0; i < count; i++) {
+      if (identical(_oldNode, list[i])) {
+        javaListSet(list, i, _newNode);
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+/**
  * The abstract class `NormalFormalParameter` defines the behavior common to formal parameters
  * that are required (are not optional).
  *
@@ -11505,6 +12723,16 @@
     this._identifier = becomeParentOf(identifier);
   }
 
+  /**
+   * Set the metadata associated with this node to the given metadata.
+   *
+   * @param metadata the metadata to be associated with this node
+   */
+  void set metadata(List<Annotation> metadata) {
+    this._metadata.clear();
+    this._metadata.addAll(metadata);
+  }
+
   @override
   void visitChildren(AstVisitor visitor) {
     //
@@ -16131,7 +17359,7 @@
    * @param variableList the top-level variables being declared
    */
   void set variables(VariableDeclarationList variableList) {
-    variableList = becomeParentOf(variableList);
+    this._variableList = becomeParentOf(variableList);
   }
 
   @override
@@ -16649,7 +17877,7 @@
    * The type argument associated with this literal, or `null` if no type arguments were
    * declared.
    */
-  TypeArgumentList typeArguments;
+  TypeArgumentList _typeArguments;
 
   /**
    * Initialize a newly created typed literal.
@@ -16659,12 +17887,29 @@
    *          arguments were declared
    */
   TypedLiteral(this.constKeyword, TypeArgumentList typeArguments) {
-    this.typeArguments = becomeParentOf(typeArguments);
+    this._typeArguments = becomeParentOf(typeArguments);
+  }
+
+  /**
+   * Return the type argument associated with this literal, or `null` if no type arguments
+   * were declared.
+   *
+   * @return the type argument associated with this literal
+   */
+  TypeArgumentList get typeArguments => _typeArguments;
+
+  /**
+   * Set the type argument associated with this literal to the given arguments.
+   *
+   * @param typeArguments the type argument associated with this literal
+   */
+  void set typeArguments(TypeArgumentList typeArguments) {
+    this._typeArguments = becomeParentOf(typeArguments);
   }
 
   @override
   void visitChildren(AstVisitor visitor) {
-    safelyVisitChild(typeArguments, visitor);
+    safelyVisitChild(_typeArguments, visitor);
   }
 }
 
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index ef4fd68..b5c986d 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -1722,6 +1722,78 @@
 }
 
 /**
+ * Instances of the class `DeclaredVariables` provide access to the values of variables that
+ * have been defined on the command line using the `-D` option.
+ */
+class DeclaredVariables {
+  /**
+   * A table mapping the names of declared variables to their values.
+   */
+  Map<String, String> _declaredVariables = new Map<String, String>();
+
+  /**
+   * Define a variable with the given name to have the given value.
+   *
+   * @param variableName the name of the variable being defined
+   * @param value the value of the variable
+   */
+  void define(String variableName, String value) {
+    _declaredVariables[variableName] = value;
+  }
+
+  /**
+   * Return the value of the variable with the given name interpreted as a boolean value, or
+   * `null` if the variable is not defined.
+   *
+   * @param typeProvider the type provider used to find the type 'bool'
+   * @param variableName the name of the variable whose value is to be returned
+   */
+  DartObject getBool(TypeProvider typeProvider, String variableName) {
+    String value = _declaredVariables[variableName];
+    if (value == null) {
+      return null;
+    }
+    if (value == "true") {
+      return new DartObjectImpl(typeProvider.boolType, BoolState.from(true));
+    } else if (value == "false") {
+      return new DartObjectImpl(typeProvider.boolType, BoolState.from(false));
+    }
+    return null;
+  }
+
+  /**
+   * Return the value of the variable with the given name interpreted as an integer value, or
+   * `null` if the variable is not defined.
+   *
+   * @param typeProvider the type provider used to find the type 'int'
+   * @param variableName the name of the variable whose value is to be returned
+   * @throws NumberFormatException if the value of the variable is not a valid integer value
+   */
+  DartObject getInt(TypeProvider typeProvider, String variableName) {
+    String value = _declaredVariables[variableName];
+    if (value == null) {
+      return null;
+    }
+    return new DartObjectImpl(typeProvider.intType, new IntState(int.parse(value)));
+  }
+
+  /**
+   * Return the value of the variable with the given name interpreted as a String value, or
+   * `null` if the variable is not defined.
+   *
+   * @param typeProvider the type provider used to find the type 'String'
+   * @param variableName the name of the variable whose value is to be returned
+   */
+  DartObject getString(TypeProvider typeProvider, String variableName) {
+    String value = _declaredVariables[variableName];
+    if (value == null) {
+      return null;
+    }
+    return new DartObjectImpl(typeProvider.stringType, new StringState(value));
+  }
+}
+
+/**
  * Instances of the class `DoubleState` represent the state of an object representing a
  * double.
  */
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 9cfa683..50b872b 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -1042,6 +1042,25 @@
   bool get isValidMixin;
 
   /**
+   * Return the element representing the method that results from looking up the given method in
+   * this class with respect to the given library, ignoring abstract methods, or `null` if the
+   * look up fails. The behavior of this method is defined by the Dart Language Specification in
+   * section 12.15.1: <blockquote> The result of looking up method <i>m</i> in class <i>C</i> with
+   * respect to library <i>L</i> is:
+   * * If <i>C</i> declares an instance method named <i>m</i> that is accessible to <i>L</i>, then
+   * that method is the result of the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then
+   * the result of the lookup is the result of looking up method <i>m</i> in <i>S</i> with respect
+   * to <i>L</i>. Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   *
+   * @param methodName the name of the method being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given method in this class with respect to the given
+   *         library
+   */
+  MethodElement lookUpConcreteMethod(String methodName, LibraryElement library);
+
+  /**
    * Return the element representing the getter that results from looking up the given getter in
    * this class with respect to the given library, or `null` if the look up fails. The
    * behavior of this method is defined by the Dart Language Specification in section 12.15.1:
@@ -1062,6 +1081,65 @@
   PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library);
 
   /**
+   * Return the element representing the getter that results from looking up the given getter in the
+   * superclass of this class with respect to the given library, ignoring abstract getters, or
+   * `null` if the look up fails. The behavior of this method is defined by the Dart Language
+   * Specification in section 12.15.1: <blockquote>The result of looking up getter (respectively
+   * setter) <i>m</i> in class <i>C</i> with respect to library <i>L</i> is:
+   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+   * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
+   * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
+   * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
+   * Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   *
+   * @param getterName the name of the getter being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given getter in this class with respect to the given
+   *         library
+   */
+  PropertyAccessorElement lookUpInheritedConcreteGetter(String getterName, LibraryElement library);
+
+  /**
+   * Return the element representing the method that results from looking up the given method in the
+   * superclass of this class with respect to the given library, ignoring abstract methods, or
+   * `null` if the look up fails. The behavior of this method is defined by the Dart Language
+   * Specification in section 12.15.1: <blockquote> The result of looking up method <i>m</i> in
+   * class <i>C</i> with respect to library <i>L</i> is:
+   * * If <i>C</i> declares an instance method named <i>m</i> that is accessible to <i>L</i>, then
+   * that method is the result of the lookup. Otherwise, if <i>C</i> has a superclass <i>S</i>, then
+   * the result of the lookup is the result of looking up method <i>m</i> in <i>S</i> with respect
+   * to <i>L</i>. Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   *
+   * @param methodName the name of the method being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given method in the superclass of this class with respect
+   *         to the given library
+   */
+  MethodElement lookUpInheritedConcreteMethod(String methodName, LibraryElement library);
+
+  /**
+   * Return the element representing the setter that results from looking up the given setter in the
+   * superclass of this class with respect to the given library, ignoring abstract setters, or
+   * `null` if the look up fails. The behavior of this method is defined by the Dart Language
+   * Specification in section 12.16: <blockquote> The result of looking up getter (respectively
+   * setter) <i>m</i> in class <i>C</i> with respect to library <i>L</i> is:
+   * * If <i>C</i> declares an instance getter (respectively setter) named <i>m</i> that is
+   * accessible to <i>L</i>, then that getter (respectively setter) is the result of the lookup.
+   * Otherwise, if <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the result
+   * of looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect to <i>L</i>.
+   * Otherwise, we say that the lookup has failed.
+   * </blockquote>
+   *
+   * @param setterName the name of the setter being looked up
+   * @param library the library with respect to which the lookup is being performed
+   * @return the result of looking up the given setter in this class with respect to the given
+   *         library
+   */
+  PropertyAccessorElement lookUpInheritedConcreteSetter(String setterName, LibraryElement library);
+
+  /**
    * Return the element representing the method that results from looking up the given method in the
    * superclass of this class with respect to the given library, or `null` if the look up
    * fails. The behavior of this method is defined by the Dart Language Specification in section
@@ -1406,32 +1484,19 @@
   bool get isValidMixin => hasModifier(Modifier.MIXIN);
 
   @override
-  PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library) {
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
-    ClassElement currentElement = this;
-    while (currentElement != null && !visitedClasses.contains(currentElement)) {
-      visitedClasses.add(currentElement);
-      PropertyAccessorElement element = currentElement.getGetter(getterName);
-      if (element != null && element.isAccessibleIn(library)) {
-        return element;
-      }
-      for (InterfaceType mixin in currentElement.mixins) {
-        ClassElement mixinElement = mixin.element;
-        if (mixinElement != null) {
-          element = mixinElement.getGetter(getterName);
-          if (element != null && element.isAccessibleIn(library)) {
-            return element;
-          }
-        }
-      }
-      InterfaceType supertype = currentElement.supertype;
-      if (supertype == null) {
-        return null;
-      }
-      currentElement = supertype.element;
-    }
-    return null;
-  }
+  MethodElement lookUpConcreteMethod(String methodName, LibraryElement library) => _internalLookUpConcreteMethod(methodName, library, true);
+
+  @override
+  PropertyAccessorElement lookUpGetter(String getterName, LibraryElement library) => _internalLookUpGetter(getterName, library, true);
+
+  @override
+  PropertyAccessorElement lookUpInheritedConcreteGetter(String getterName, LibraryElement library) => _internalLookUpConcreteGetter(getterName, library, false);
+
+  @override
+  MethodElement lookUpInheritedConcreteMethod(String methodName, LibraryElement library) => _internalLookUpConcreteMethod(methodName, library, false);
+
+  @override
+  PropertyAccessorElement lookUpInheritedConcreteSetter(String setterName, LibraryElement library) => _internalLookUpConcreteSetter(setterName, library, false);
 
   @override
   MethodElement lookUpInheritedMethod(String methodName, LibraryElement library) => _internalLookUpMethod(methodName, library, false);
@@ -1440,32 +1505,7 @@
   MethodElement lookUpMethod(String methodName, LibraryElement library) => _internalLookUpMethod(methodName, library, true);
 
   @override
-  PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library) {
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
-    ClassElement currentElement = this;
-    while (currentElement != null && !visitedClasses.contains(currentElement)) {
-      visitedClasses.add(currentElement);
-      PropertyAccessorElement element = currentElement.getSetter(setterName);
-      if (element != null && element.isAccessibleIn(library)) {
-        return element;
-      }
-      for (InterfaceType mixin in currentElement.mixins) {
-        ClassElement mixinElement = mixin.element;
-        if (mixinElement != null) {
-          element = mixinElement.getSetter(setterName);
-          if (element != null && element.isAccessibleIn(library)) {
-            return element;
-          }
-        }
-      }
-      InterfaceType supertype = currentElement.supertype;
-      if (supertype == null) {
-        return null;
-      }
-      currentElement = supertype.element;
-    }
-    return null;
-  }
+  PropertyAccessorElement lookUpSetter(String setterName, LibraryElement library) => _internalLookUpSetter(setterName, library, true);
 
   /**
    * Set whether this class is abstract to correspond to the given value.
@@ -1624,6 +1664,74 @@
     }
   }
 
+  PropertyAccessorElement _internalLookUpConcreteGetter(String getterName, LibraryElement library, bool includeThisClass) {
+    PropertyAccessorElement getter = _internalLookUpGetter(getterName, library, includeThisClass);
+    while (getter != null && getter.isAbstract) {
+      Element definingClass = getter.enclosingElement;
+      if (definingClass is! ClassElementImpl) {
+        return null;
+      }
+      getter = (definingClass as ClassElementImpl)._internalLookUpGetter(getterName, library, false);
+    }
+    return getter;
+  }
+
+  MethodElement _internalLookUpConcreteMethod(String methodName, LibraryElement library, bool includeThisClass) {
+    MethodElement method = _internalLookUpMethod(methodName, library, includeThisClass);
+    while (method != null && method.isAbstract) {
+      ClassElement definingClass = method.enclosingElement;
+      if (definingClass == null) {
+        return null;
+      }
+      method = definingClass.lookUpInheritedMethod(methodName, library);
+    }
+    return method;
+  }
+
+  PropertyAccessorElement _internalLookUpConcreteSetter(String setterName, LibraryElement library, bool includeThisClass) {
+    PropertyAccessorElement setter = _internalLookUpSetter(setterName, library, includeThisClass);
+    while (setter != null && setter.isAbstract) {
+      Element definingClass = setter.enclosingElement;
+      if (definingClass is! ClassElementImpl) {
+        return null;
+      }
+      setter = (definingClass as ClassElementImpl)._internalLookUpSetter(setterName, library, false);
+    }
+    return setter;
+  }
+
+  PropertyAccessorElement _internalLookUpGetter(String getterName, LibraryElement library, bool includeThisClass) {
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    ClassElement currentElement = this;
+    if (includeThisClass) {
+      PropertyAccessorElement element = currentElement.getGetter(getterName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+    }
+    while (currentElement != null && visitedClasses.add(currentElement)) {
+      for (InterfaceType mixin in currentElement.mixins) {
+        ClassElement mixinElement = mixin.element;
+        if (mixinElement != null) {
+          PropertyAccessorElement element = mixinElement.getGetter(getterName);
+          if (element != null && element.isAccessibleIn(library)) {
+            return element;
+          }
+        }
+      }
+      InterfaceType supertype = currentElement.supertype;
+      if (supertype == null) {
+        return null;
+      }
+      currentElement = supertype.element;
+      PropertyAccessorElement element = currentElement.getGetter(getterName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+    }
+    return null;
+  }
+
   MethodElement _internalLookUpMethod(String methodName, LibraryElement library, bool includeThisClass) {
     Set<ClassElement> visitedClasses = new Set<ClassElement>();
     ClassElement currentElement = this;
@@ -1656,6 +1764,38 @@
     return null;
   }
 
+  PropertyAccessorElement _internalLookUpSetter(String setterName, LibraryElement library, bool includeThisClass) {
+    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    ClassElement currentElement = this;
+    if (includeThisClass) {
+      PropertyAccessorElement element = currentElement.getSetter(setterName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+    }
+    while (currentElement != null && visitedClasses.add(currentElement)) {
+      for (InterfaceType mixin in currentElement.mixins) {
+        ClassElement mixinElement = mixin.element;
+        if (mixinElement != null) {
+          PropertyAccessorElement element = mixinElement.getSetter(setterName);
+          if (element != null && element.isAccessibleIn(library)) {
+            return element;
+          }
+        }
+      }
+      InterfaceType supertype = currentElement.supertype;
+      if (supertype == null) {
+        return null;
+      }
+      currentElement = supertype.element;
+      PropertyAccessorElement element = currentElement.getSetter(setterName);
+      if (element != null && element.isAccessibleIn(library)) {
+        return element;
+      }
+    }
+    return null;
+  }
+
   bool _safeIsOrInheritsProxy(ClassElement classElt, Set<ClassElement> visitedClassElts) {
     if (visitedClassElts.contains(classElt)) {
       return false;
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index e06709a..c513eec 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -21,6 +21,7 @@
 import 'element.dart';
 import 'resolver.dart';
 import 'html.dart' as ht;
+import 'package:analyzer/src/generated/constant.dart';
 
 /**
  * Instances of the class `AnalysisCache` implement an LRU cache of information related to
@@ -239,9 +240,11 @@
 
   /**
    * Return the documentation comment for the given element as it appears in the original source
-   * (complete with the beginning and ending delimiters), or `null` if the element does not
-   * have a documentation comment associated with it. This can be a long-running operation if the
-   * information needed to access the comment is not cached.
+   * (complete with the beginning and ending delimiters) for block documentation comments, or lines
+   * starting with `"///"` and separated with `"\n"` characters for end-of-line
+   * documentation comments, or `null` if the element does not have a documentation comment
+   * associated with it. This can be a long-running operation if the information needed to access
+   * the comment is not cached.
    *
    * <b>Note:</b> This method cannot be used in an async environment.
    *
@@ -399,6 +402,13 @@
   TimestampedData<String> getContents(Source source);
 
   /**
+   * Return the set of declared variables used when computing constant values.
+   *
+   * @return the set of declared variables used when computing constant values
+   */
+  DeclaredVariables get declaredVariables;
+
+  /**
    * Return the element referenced by the given location, or `null` if the element is not
    * immediately available or if there is no element with the given location. The latter condition
    * can occur, for example, if the location describes an element from a different context or if the
@@ -829,6 +839,11 @@
   SourceFactory _sourceFactory;
 
   /**
+   * The set of declared variables used when computing constant values.
+   */
+  DeclaredVariables _declaredVariables = new DeclaredVariables();
+
+  /**
    * A source representing the core library.
    */
   Source _coreLibrarySource;
@@ -1033,7 +1048,7 @@
         List<Token> tokens = comment.tokens;
         for (int i = 0; i < tokens.length; i++) {
           if (i > 0) {
-            builder.append('\n');
+            builder.append("\n");
           }
           builder.append(tokens[i].lexeme);
         }
@@ -1233,6 +1248,9 @@
   }
 
   @override
+  DeclaredVariables get declaredVariables => _declaredVariables;
+
+  @override
   Element getElement(ElementLocation location) {
     // TODO(brianwilkerson) This should not be a "get" method.
     try {
@@ -4985,12 +5003,8 @@
     if (sourceEntry == null) {
       sourceEntry = _createSourceEntry(source, true);
     } else {
-      SourceEntryImpl sourceCopy = sourceEntry.writableCopy;
-      int newTime = getModificationStamp(source);
-      sourceCopy.modificationTime = newTime;
-      sourceCopy.explicitlyAdded = true;
-      // TODO(brianwilkerson) Understand why we're not invalidating the cached data.
-      _cache.put(source, sourceCopy);
+      _sourceChanged(source);
+      sourceEntry = _cache.get(source);
     }
     if (sourceEntry is HtmlEntry) {
       _workManager.add(source, SourcePriority.HTML);
@@ -5027,7 +5041,6 @@
         _computeAllLibrariesDependingOn(containingLibrary, librariesToInvalidate);
       }
       for (Source library in librariesToInvalidate) {
-        //    for (Source library : containingLibraries) {
         _invalidateLibraryResolution(library);
       }
       _removeFromParts(source, _cache.get(source) as DartEntry);
@@ -11752,6 +11765,9 @@
   TimestampedData<String> getContents(Source source) => _basis.getContents(source);
 
   @override
+  DeclaredVariables get declaredVariables => _basis.declaredVariables;
+
+  @override
   Element getElement(ElementLocation location) {
     InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getElement");
     _checkThread(instrumentation);
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 1ad5ee8..e92f2ae 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -394,7 +394,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', 0, "The element '%s' is defined in the libraries '%s' and '%s'");
+  static const CompileTimeErrorCode AMBIGUOUS_EXPORT = const CompileTimeErrorCode.con1('AMBIGUOUS_EXPORT', 0, "The name '%s' is defined in the libraries '%s' and '%s'");
 
   /**
    * 12.33 Argument Definition Test: It is a compile time error if <i>v</i> does not denote a formal
@@ -1491,58 +1491,70 @@
   static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 131, "'%s' cannot implement itself");
 
   /**
-   * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
-   * <i>k'</i> is not a constant constructor.
+   * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
+   * superinterface of itself.
+   *
+   * 8.1 Superinterfaces: It is a compile-time error if an interface is a superinterface of itself.
+   *
+   * 7.9 Superclasses: It is a compile-time error if a class <i>C</i> is a superclass of itself.
+   *
+   * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 132, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH', 132, "'%s' 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_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 133, "The name '%s' is not a type and cannot be used in a redirected constructor");
+  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 133, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 134, "Constant factory constructor cannot delegate to a non-constant constructor");
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 134, "The name '%s' is not a type and cannot be used in a redirected constructor");
+
+  /**
+   * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
+   * <i>k'</i> is not a constant constructor.
+   */
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 135, "Constant factory constructor cannot delegate to a non-constant constructor");
 
   /**
    * 7.6.1 Generative constructors: A generative constructor may be <i>redirecting</i>, in which
    * case its only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR', 135, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR', 136, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.1 Generative constructors: A generative constructor may be <i>redirecting</i>, in which
    * case its only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR', 136, "Generative constructor cannot redirect to a factory constructor");
+  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR', 137, "Generative constructor cannot redirect to a factory constructor");
 
   /**
    * 5 Variables: A local variable may only be referenced at a source code location that is after
    * its initializer, if any, is complete, or a compile-time error occurs.
    */
-  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 137, "Local variables cannot be referenced before they are declared");
+  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 138, "Local variables cannot be referenced before they are declared");
 
   /**
    * 12.8.1 Rethrow: It is a compile-time error if an expression of the form <i>rethrow;</i> is not
    * enclosed within a on-catch clause.
    */
-  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 138, "rethrow must be inside of a catch clause");
+  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 139, "rethrow must be inside of a catch clause");
 
   /**
    * 13.12 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
    * appears in a generative constructor.
    */
-  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 139, "Constructors cannot return a value");
+  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 140, "Constructors cannot return a value");
 
   /**
    * 14.1 Imports: It is a compile-time error if a prefix used in a deferred import is used in
    * another import clause.
    */
-  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 140, "The prefix of a deferred import cannot be used in other import directives");
+  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 141, "The prefix of a deferred import cannot be used in other import directives");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -1552,19 +1564,19 @@
    * initializer list, in class Object, in a factory constructor, or in a static method or variable
    * initializer.
    */
-  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 141, "Invalid context for 'super' invocation");
+  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 142, "Invalid context for 'super' invocation");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 142, "The redirecting constructor cannot have a 'super' initializer");
+  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 143, "The redirecting constructor cannot have a 'super' initializer");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
    * error if a generative constructor of class Object includes a superinitializer.
    */
-  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 143, "");
+  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 144, "");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -1583,19 +1595,19 @@
    * @param boundingTypeName the name of the bounding type
    * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
-  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 144, "'%s' does not extend '%s'");
+  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 145, "'%s' does not extend '%s'");
 
   /**
    * 15.3.1 Typedef: Any self reference, either directly, or recursively via another typedef, is a
    * compile time error.
    */
-  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 145, "Type alias cannot reference itself directly or recursively via another typedef");
+  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 146, "Type alias cannot reference itself directly or recursively via another typedef");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
    * scope, optionally followed by type arguments.
    */
-  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 146, "Undefined class '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 147, "Undefined class '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1603,7 +1615,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', 147, "The class '%s' does not have a generative constructor '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 148, "The class '%s' does not have a generative constructor '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1611,7 +1623,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', 148, "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', 149, "The class '%s' does not have a default generative constructor");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -1623,7 +1635,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 149, "The named parameter '%s' is not defined");
+  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 150, "The named parameter '%s' is not defined");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1638,7 +1650,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', 150, "Target of URI does not exist: '%s'");
+  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 151, "Target of URI does not exist: '%s'");
 
   /**
    * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
@@ -1650,7 +1662,7 @@
    * 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that describes a URI is
    * not a compile-time constant, or if <i>x</i> involves string interpolation.
    */
-  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 151, "URIs cannot use string interpolation");
+  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 152, "URIs cannot use string interpolation");
 
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
@@ -1663,7 +1675,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', 152, "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', 153, "Operator '%s' should declare exactly %d parameter(s), but %d found");
 
   /**
    * 7.1.1 Operators: It is a compile time error if the arity of the user-declared operator - is not
@@ -1671,13 +1683,13 @@
    *
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 153, "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', 154, "Operator '-' should declare 0 or 1 parameter, but %d found");
 
   /**
    * 7.3 Setters: It is a compile-time error if a setter's formal parameter list does not include
    * exactly one required formal parameter <i>p</i>.
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 154, "Setters should declare exactly one required parameter");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 155, "Setters should declare exactly one required parameter");
 
   static const List<CompileTimeErrorCode> values = const [
       AMBIGUOUS_EXPORT,
@@ -1812,6 +1824,7 @@
       RECURSIVE_INTERFACE_INHERITANCE,
       RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS,
       RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS,
+      RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH,
       REDIRECT_TO_MISSING_CONSTRUCTOR,
       REDIRECT_TO_NON_CLASS,
       REDIRECT_TO_NON_CONST_CONSTRUCTOR,
@@ -2980,7 +2993,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 type '%s' is defined in the libraries '%s' and '%s'");
+  static const StaticWarningCode AMBIGUOUS_IMPORT = const StaticWarningCode.con1('AMBIGUOUS_IMPORT', 0, "The name '%s' is defined in the libraries %s");
 
   /**
    * 12.11.1 New: It is a static warning if the static type of <i>a<sub>i</sub>, 1 &lt;= i &lt;= n+
diff --git a/pkg/analyzer/lib/src/generated/java_engine.dart b/pkg/analyzer/lib/src/generated/java_engine.dart
index 37cbe39..3c2d08f 100644
--- a/pkg/analyzer/lib/src/generated/java_engine.dart
+++ b/pkg/analyzer/lib/src/generated/java_engine.dart
@@ -158,6 +158,36 @@
     }
     return last;
   }
+
+  /**
+   * Produce a string containing all of the names in the given array, surrounded by single quotes,
+   * and separated by commas. The list must contain at least two elements.
+   *
+   * @param names the names to be printed
+   * @return the result of printing the names
+   */
+  static String printListOfQuotedNames(List<String> names) {
+    if (names == null) {
+      throw new IllegalArgumentException("The list must not be null");
+    }
+    int count = names.length;
+    if (count < 2) {
+      throw new IllegalArgumentException("The list must contain at least two names");
+    }
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("'");
+    buffer.write(names[0]);
+    buffer.write("'");
+    for (int i = 1; i < count - 1; i++) {
+      buffer.write(", '");
+      buffer.write(names[i]);
+      buffer.write("'");
+    }
+    buffer.write(" and '");
+    buffer.write(names[count - 1]);
+    buffer.write("'");
+    return buffer.toString();
+  }
 }
 
 class FileNameUtilities {
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index f1e857c..003a977 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -1584,14 +1584,7 @@
     }
     ClassElement classElement = element as ClassElement;
     // lookup for ==
-    MethodElement method = classElement.lookUpMethod("==", _currentLibrary);
-    while (method != null && method.isAbstract) {
-      ClassElement definingClass = method.enclosingElement;
-      if (definingClass == null) {
-        return false;
-      }
-      method = definingClass.lookUpInheritedMethod("==", _currentLibrary);
-    }
+    MethodElement method = classElement.lookUpConcreteMethod("==", _currentLibrary);
     if (method == null || method.enclosingElement.type.isObject) {
       return false;
     }
@@ -5504,6 +5497,9 @@
       }
     } else if (element is ExecutableElement) {
       return null;
+    } else if (element is MultiplyDefinedElement) {
+      // The error has already been reported
+      return null;
     } else if (element == null && target is SuperExpression) {
       // TODO(jwren) We should split the UNDEFINED_METHOD into two error codes, this one, and
       // a code that describes the situation where the method was found, but it was not
@@ -6728,6 +6724,14 @@
                   staticOrPropagatedEnclosingElt.displayName]);
             }
           } else {
+            if (staticOrPropagatedEnclosingElt is ClassElement) {
+              InterfaceType targetType = staticOrPropagatedEnclosingElt.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;
+              }
+            }
             ErrorCode errorCode = (shouldReportMissingMember_static ? StaticTypeWarningCode.UNDEFINED_GETTER : HintCode.UNDEFINED_GETTER);
             if (_doesClassElementHaveProxy(staticOrPropagatedEnclosingElt)) {
               _resolver.reportErrorForNode(errorCode, propertyName, [
@@ -7412,7 +7416,6 @@
         _checkForExtendsDeferredClassInTypeAlias(node);
         _checkForImplementsDeferredClass(implementsClause);
         _checkForRecursiveInterfaceInheritance(_enclosingClass);
-        _checkForTypeAliasCannotReferenceItself_mixin(node);
         _checkForNonAbstractClassInheritsAbstractMember(node.name);
       }
     } finally {
@@ -8887,9 +8890,20 @@
    */
   bool _checkForConcreteClassWithAbstractMember(MethodDeclaration node) {
     if (node.isAbstract && _enclosingClass != null && !_enclosingClass.isAbstract) {
-      SimpleIdentifier methodName = node.name;
-      _errorReporter.reportErrorForNode(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, methodName, [methodName.name, _enclosingClass.displayName]);
-      return true;
+      SimpleIdentifier nameNode = node.name;
+      String memberName = nameNode.name;
+      ExecutableElement overriddenMember;
+      if (node.isGetter) {
+        overriddenMember = _enclosingClass.lookUpInheritedConcreteGetter(memberName, _currentLibrary);
+      } else if (node.isSetter) {
+        overriddenMember = _enclosingClass.lookUpInheritedConcreteSetter(memberName, _currentLibrary);
+      } else {
+        overriddenMember = _enclosingClass.lookUpInheritedConcreteMethod(memberName, _currentLibrary);
+      }
+      if (overriddenMember == null) {
+        _errorReporter.reportErrorForNode(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, nameNode, [memberName, _enclosingClass.displayName]);
+        return true;
+      }
     }
     return false;
   }
@@ -11372,21 +11386,6 @@
   }
 
   /**
-   * This verifies that the given class type alias does not reference itself.
-   *
-   * @return `true` if and only if an error code is generated on the passed node
-   * @see CompileTimeErrorCode#TYPE_ALIAS_CANNOT_REFERENCE_ITSELF
-   */
-  bool _checkForTypeAliasCannotReferenceItself_mixin(ClassTypeAlias node) {
-    ClassElement element = node.element;
-    if (!_hasTypedefSelfReference(element)) {
-      return false;
-    }
-    _errorReporter.reportErrorForNode(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, node, []);
-    return true;
-  }
-
-  /**
    * This verifies that the passed type name is not a deferred type.
    *
    * @param expression the expression to evaluate
@@ -11760,6 +11759,26 @@
   }
 
   /**
+   * Return the error code that should be used when the given class references itself directly.
+   *
+   * @param classElt the class that references itself
+   * @return the error code that should be used
+   */
+  ErrorCode _getBaseCaseErrorCode(ClassElement classElt) {
+    InterfaceType supertype = classElt.supertype;
+    if (supertype != null && _enclosingClass == supertype.element) {
+      return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS;
+    }
+    List<InterfaceType> mixins = classElt.mixins;
+    for (int i = 0; i < mixins.length; i++) {
+      if (_enclosingClass == mixins[i].element) {
+        return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH;
+      }
+    }
+    return CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS;
+  }
+
+  /**
    * Returns the Type (return type) for a given getter.
    *
    * @param propertyAccessorElement
@@ -12000,6 +12019,7 @@
    * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE
    * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
    * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS
+   * @see CompileTimeErrorCode#RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH
    */
   bool _safeCheckForRecursiveInterfaceInheritance(ClassElement classElt, List<ClassElement> path) {
     // Detect error condition.
@@ -12020,10 +12040,10 @@
         _errorReporter.reportErrorForOffset(CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName, builder.toString()]);
         return true;
       } else {
-        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS or RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS
-        InterfaceType supertype = classElt.supertype;
-        ErrorCode errorCode = (supertype != null && _enclosingClass == supertype.element ? CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS : CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS);
-        _errorReporter.reportErrorForOffset(errorCode, _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName]);
+        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS or
+        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS or
+        // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH
+        _errorReporter.reportErrorForOffset(_getBaseCaseErrorCode(classElt), _enclosingClass.nameOffset, enclosingClassName.length, [enclosingClassName]);
         return true;
       }
     }
@@ -12042,6 +12062,12 @@
         return true;
       }
     }
+    List<InterfaceType> mixinTypes = classElt.mixins;
+    for (InterfaceType mixinType in mixinTypes) {
+      if (_safeCheckForRecursiveInterfaceInheritance(mixinType.element, path)) {
+        return true;
+      }
+    }
     path.removeAt(path.length - 1);
     return false;
   }
@@ -13061,12 +13087,16 @@
   Map<ImportDirective, Namespace> _namespaceMap;
 
   /**
-   * This is a map between prefix elements and the import directive from which they are derived. In
+   * This is a map between prefix elements and the import directives from which they are derived. In
    * cases where a type is referenced via a prefix element, the import directive can be marked as
    * used (removed from the unusedImports) by looking at the resolved `lib` in `lib.X`,
    * instead of looking at which library the `lib.X` resolves.
+   *
+   * TODO (jwren) Since multiple [ImportDirective]s can share the same [PrefixElement],
+   * it is possible to have an unreported unused import in situations where two imports use the same
+   * prefix and at least one import directive is used.
    */
-  Map<PrefixElement, ImportDirective> _prefixElementMap;
+  Map<PrefixElement, List<ImportDirective>> _prefixElementMap;
 
   /**
    * Create a new instance of the [ImportsVerifier].
@@ -13079,7 +13109,7 @@
     this._duplicateImports = new List<ImportDirective>();
     this._libraryMap = new Map<LibraryElement, List<ImportDirective>>();
     this._namespaceMap = new Map<ImportDirective, Namespace>();
-    this._prefixElementMap = new Map<PrefixElement, ImportDirective>();
+    this._prefixElementMap = new Map<PrefixElement, List<ImportDirective>>();
   }
 
   /**
@@ -13137,7 +13167,12 @@
                 Element element = prefixIdentifier.staticElement;
                 if (element is PrefixElement) {
                   PrefixElement prefixElementKey = element;
-                  _prefixElementMap[prefixElementKey] = importDirective;
+                  List<ImportDirective> list = _prefixElementMap[prefixElementKey];
+                  if (list == null) {
+                    list = new List<ImportDirective>();
+                    _prefixElementMap[prefixElementKey] = list;
+                  }
+                  list.add(importDirective);
                 }
               }
             }
@@ -13210,7 +13245,10 @@
     SimpleIdentifier prefixIdentifier = node.prefix;
     Element element = prefixIdentifier.staticElement;
     if (element is PrefixElement) {
-      _unusedImports.remove(_prefixElementMap[element]);
+      List<ImportDirective> importDirectives = _prefixElementMap[element];
+      for (ImportDirective importDirective in importDirectives) {
+        _unusedImports.remove(importDirective);
+      }
       return null;
     }
     // Otherwise, pass the prefixed identifier element and name onto visitIdentifier.
@@ -13292,7 +13330,10 @@
       }
       return null;
     } else if (element is PrefixElement) {
-      _unusedImports.remove(_prefixElementMap[element]);
+      List<ImportDirective> importDirectives = _prefixElementMap[element];
+      for (ImportDirective importDirective in importDirectives) {
+        _unusedImports.remove(importDirective);
+      }
       return null;
     } else if (element.enclosingElement is! CompilationUnitElement) {
       // Identifiers that aren't a prefix element and whose enclosing element isn't a
@@ -15076,11 +15117,15 @@
     if (foundElement is MultiplyDefinedElementImpl) {
       String foundEltName = foundElement.displayName;
       List<Element> conflictingMembers = (foundElement as MultiplyDefinedElementImpl).conflictingElements;
-      String libName1 = _getLibraryName(conflictingMembers[0], "");
-      String libName2 = _getLibraryName(conflictingMembers[1], "");
-      // TODO (jwren) Change the error message to include a list of all library names instead of
-      // just the first two
-      errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.AMBIGUOUS_IMPORT, [foundEltName, libName1, libName2]));
+      int count = conflictingMembers.length;
+      List<String> libraryNames = new List<String>(count);
+      for (int i = 0; i < count; i++) {
+        libraryNames[i] = _getLibraryName(conflictingMembers[i], "");
+      }
+      libraryNames.sort();
+      errorListener.onError(new AnalysisError.con2(getSource(identifier), identifier.offset, identifier.length, StaticWarningCode.AMBIGUOUS_IMPORT, [
+          foundEltName,
+          StringUtilities.printListOfQuotedNames(libraryNames)]));
       return foundElement;
     }
     if (foundElement != null) {
@@ -17714,6 +17759,12 @@
   ClassDeclaration _enclosingClassDeclaration = null;
 
   /**
+   * The function type alias representing the function type containing the current node, or
+   * `null` if the current node is not contained in a function type alias.
+   */
+  FunctionTypeAlias _enclosingFunctionTypeAlias = null;
+
+  /**
    * The element representing the function containing the current node, or `null` if the
    * current node is not contained in a function.
    */
@@ -17809,7 +17860,8 @@
 
   @override
   Object visitAnnotation(Annotation node) {
-    if (identical(node.parent, _enclosingClassDeclaration)) {
+    AstNode parent = node.parent;
+    if (identical(parent, _enclosingClassDeclaration) || identical(parent, _enclosingFunctionTypeAlias)) {
       return null;
     }
     return super.visitAnnotation(node);
@@ -18181,6 +18233,22 @@
   }
 
   @override
+  Object visitFunctionTypeAlias(FunctionTypeAlias node) {
+    // Resolve the metadata in the library scope.
+    if (node.metadata != null) {
+      node.metadata.accept(this);
+    }
+    FunctionTypeAlias outerAlias = _enclosingFunctionTypeAlias;
+    _enclosingFunctionTypeAlias = node;
+    try {
+      super.visitFunctionTypeAlias(node);
+    } finally {
+      _enclosingFunctionTypeAlias = outerAlias;
+    }
+    return null;
+  }
+
+  @override
   Object visitHideCombinator(HideCombinator node) => null;
 
   @override
@@ -20522,40 +20590,43 @@
     if (staticPropagatedType != null && (staticStaticType == null || staticPropagatedType.isMoreSpecificThan(staticStaticType))) {
       _recordPropagatedType(node, staticPropagatedType);
     }
+    bool needPropagatedType = true;
     String methodName = methodNameNode.name;
-    // Future.then(closure) return type is:
-    // 1) the returned Future type, if the closure returns a Future;
-    // 2) Future<valueType>, if the closure returns a value.
     if (methodName == "then") {
       Expression target = node.realTarget;
-      DartType targetType = target == null ? null : target.bestType;
-      if (_isAsyncFutureType(targetType)) {
-        NodeList<Expression> arguments = node.argumentList.arguments;
-        if (arguments.length == 1) {
-          // TODO(brianwilkerson) Handle the case where both arguments are provided.
-          Expression closureArg = arguments[0];
-          if (closureArg is FunctionExpression) {
-            FunctionExpression closureExpr = closureArg;
-            DartType returnType = _computePropagatedReturnType(closureExpr.element);
-            if (returnType != null) {
-              // prepare the type of the returned Future
-              InterfaceTypeImpl newFutureType;
-              if (_isAsyncFutureType(returnType)) {
-                newFutureType = returnType as InterfaceTypeImpl;
-              } else {
-                InterfaceType futureType = targetType as InterfaceType;
-                newFutureType = new InterfaceTypeImpl.con1(futureType.element);
-                newFutureType.typeArguments = <DartType> [returnType];
+      if (target != null) {
+        DartType targetType = target.bestType;
+        if (_isAsyncFutureType(targetType)) {
+          // Future.then(closure) return type is:
+          // 1) the returned Future type, if the closure returns a Future;
+          // 2) Future<valueType>, if the closure returns a value.
+          NodeList<Expression> arguments = node.argumentList.arguments;
+          if (arguments.length == 1) {
+            // TODO(brianwilkerson) Handle the case where both arguments are provided.
+            Expression closureArg = arguments[0];
+            if (closureArg is FunctionExpression) {
+              FunctionExpression closureExpr = closureArg;
+              DartType returnType = _computePropagatedReturnType(closureExpr.element);
+              if (returnType != null) {
+                // prepare the type of the returned Future
+                InterfaceTypeImpl newFutureType;
+                if (_isAsyncFutureType(returnType)) {
+                  newFutureType = returnType as InterfaceTypeImpl;
+                } else {
+                  InterfaceType futureType = targetType as InterfaceType;
+                  newFutureType = new InterfaceTypeImpl.con1(futureType.element);
+                  newFutureType.typeArguments = <DartType> [returnType];
+                }
+                // set the 'then' invocation type
+                _recordPropagatedType(node, newFutureType);
+                needPropagatedType = false;
+                return null;
               }
-              // set the 'then' invocation type
-              _recordPropagatedType(node, newFutureType);
-              return null;
             }
           }
         }
       }
-    }
-    if (methodName == "\$dom_createEvent") {
+    } else if (methodName == "\$dom_createEvent") {
       Expression target = node.realTarget;
       if (target != null) {
         DartType targetType = target.bestType;
@@ -20565,6 +20636,7 @@
             DartType returnType = _getFirstArgumentAsType(library, node.argumentList);
             if (returnType != null) {
               _recordPropagatedType(node, returnType);
+              needPropagatedType = false;
             }
           }
         }
@@ -20579,6 +20651,7 @@
             DartType returnType = _getFirstArgumentAsQuery(library, node.argumentList);
             if (returnType != null) {
               _recordPropagatedType(node, returnType);
+              needPropagatedType = false;
             }
           }
         }
@@ -20590,19 +20663,23 @@
             DartType returnType = _getFirstArgumentAsQuery(library, node.argumentList);
             if (returnType != null) {
               _recordPropagatedType(node, returnType);
+              needPropagatedType = false;
             }
           }
         }
       }
     } else if (methodName == "\$dom_createElement") {
       Expression target = node.realTarget;
-      DartType targetType = target.bestType;
-      if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
-        LibraryElement library = targetType.element.library;
-        if (_isHtmlLibrary(library)) {
-          DartType returnType = _getFirstArgumentAsQuery(library, node.argumentList);
-          if (returnType != null) {
-            _recordPropagatedType(node, returnType);
+      if (target != null) {
+        DartType targetType = target.bestType;
+        if (targetType is InterfaceType && (targetType.name == "HtmlDocument" || targetType.name == "Document")) {
+          LibraryElement library = targetType.element.library;
+          if (_isHtmlLibrary(library)) {
+            DartType returnType = _getFirstArgumentAsQuery(library, node.argumentList);
+            if (returnType != null) {
+              _recordPropagatedType(node, returnType);
+              needPropagatedType = false;
+            }
           }
         }
       }
@@ -20610,8 +20687,34 @@
       DartType returnType = _getFirstArgumentAsType(_typeProvider.objectType.element.library, node.argumentList);
       if (returnType != null) {
         _recordPropagatedType(node, returnType);
+        needPropagatedType = false;
       }
-    } else {
+    } else if (methodName == "getContext") {
+      Expression target = node.realTarget;
+      if (target != null) {
+        DartType targetType = target.bestType;
+        if (targetType is InterfaceType && (targetType.name == "CanvasElement")) {
+          NodeList<Expression> arguments = node.argumentList.arguments;
+          if (arguments.length == 1) {
+            Expression argument = arguments[0];
+            if (argument is StringLiteral) {
+              String value = argument.stringValue;
+              if ("2d" == value) {
+                PropertyAccessorElement getter = targetType.element.getGetter("context2D");
+                if (getter != null) {
+                  DartType returnType = getter.returnType;
+                  if (returnType != null) {
+                    _recordPropagatedType(node, returnType);
+                    needPropagatedType = false;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    if (needPropagatedType) {
       Element propagatedElement = methodNameNode.propagatedElement;
       if (!identical(propagatedElement, staticMethodElement)) {
         // Record static return type of the propagated element.
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index cb37f34..1f452ed 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.15.4
+version: 0.15.5
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
diff --git a/pkg/analyzer/test/generated/ast_test.dart b/pkg/analyzer/test/generated/ast_test.dart
index f4f69e9..0c60c2d 100644
--- a/pkg/analyzer/test/generated/ast_test.dart
+++ b/pkg/analyzer/test/generated/ast_test.dart
@@ -186,6 +186,8 @@
 
   static ForEachStatement forEachStatement(DeclaredIdentifier loopVariable, Expression iterator, Statement body) => new ForEachStatement.con1(TokenFactory.tokenFromKeyword(Keyword.FOR), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), loopVariable, TokenFactory.tokenFromKeyword(Keyword.IN), iterator, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN), body);
 
+  static ForEachStatement forEachStatement2(SimpleIdentifier identifier, Expression iterator, Statement body) => new ForEachStatement.con2(TokenFactory.tokenFromKeyword(Keyword.FOR), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), identifier, TokenFactory.tokenFromKeyword(Keyword.IN), iterator, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN), body);
+
   static FormalParameterList formalParameterList(List<FormalParameter> parameters) => new FormalParameterList(TokenFactory.tokenFromType(TokenType.OPEN_PAREN), list(parameters), null, null, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN));
 
   static ForStatement forStatement(Expression initialization, Expression condition, List<Expression> updaters, Statement body) => new ForStatement(TokenFactory.tokenFromKeyword(Keyword.FOR), TokenFactory.tokenFromType(TokenType.OPEN_PAREN), null, initialization, TokenFactory.tokenFromType(TokenType.SEMICOLON), condition, TokenFactory.tokenFromType(TokenType.SEMICOLON), updaters, TokenFactory.tokenFromType(TokenType.CLOSE_PAREN), body);
@@ -282,7 +284,7 @@
 
   static ListLiteral listLiteral(List<Expression> elements) => listLiteral2(null, null, elements);
 
-  static ListLiteral listLiteral2(Keyword keyword, TypeArgumentList typeArguments, List<Expression> elements) => new ListLiteral(keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), null, TokenFactory.tokenFromType(TokenType.OPEN_SQUARE_BRACKET), list(elements), TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET));
+  static ListLiteral listLiteral2(Keyword keyword, TypeArgumentList typeArguments, List<Expression> elements) => new ListLiteral(keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), typeArguments, TokenFactory.tokenFromType(TokenType.OPEN_SQUARE_BRACKET), list(elements), TokenFactory.tokenFromType(TokenType.CLOSE_SQUARE_BRACKET));
 
   static MapLiteral mapLiteral(Keyword keyword, TypeArgumentList typeArguments, List<MapLiteralEntry> entries) => new MapLiteral(keyword == null ? null : TokenFactory.tokenFromKeyword(keyword), typeArguments, TokenFactory.tokenFromType(TokenType.OPEN_CURLY_BRACKET), list(entries), TokenFactory.tokenFromType(TokenType.CLOSE_CURLY_BRACKET));
 
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index 9cbb1e6..e6c2fc3 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -252,7 +252,122 @@
     JUnitTestCase.assertTrue(classA.hasStaticMember);
   }
 
+  void test_lookUpConcreteMethod_declared() {
+    // class A {
+    //   m() {}
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement method = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertSame(method, classA.lookUpConcreteMethod(methodName, library));
+  }
+
+  void test_lookUpConcreteMethod_declaredAbstract() {
+    // class A {
+    //   m();
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElementImpl method = ElementFactory.methodElement(methodName, null, []);
+    method.abstract = true;
+    classA.methods = <MethodElement> [method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertNull(classA.lookUpConcreteMethod(methodName, library));
+  }
+
+  void test_lookUpConcreteMethod_declaredAbstractAndInherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    //   m();
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement inheritedMethod = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    MethodElementImpl method = ElementFactory.methodElement(methodName, null, []);
+    method.abstract = true;
+    classB.methods = <MethodElement> [method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertSame(inheritedMethod, classB.lookUpConcreteMethod(methodName, library));
+  }
+
+  void test_lookUpConcreteMethod_declaredAndInherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    //   m() {}
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement inheritedMethod = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    MethodElement method = ElementFactory.methodElement(methodName, null, []);
+    classB.methods = <MethodElement> [method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertSame(method, classB.lookUpConcreteMethod(methodName, library));
+  }
+
+  void test_lookUpConcreteMethod_declaredAndInheritedAbstract() {
+    // abstract class A {
+    //   m();
+    // }
+    // class B extends A {
+    //   m() {}
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.abstract = true;
+    String methodName = "m";
+    MethodElementImpl inheritedMethod = ElementFactory.methodElement(methodName, null, []);
+    inheritedMethod.abstract = true;
+    classA.methods = <MethodElement> [inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    MethodElement method = ElementFactory.methodElement(methodName, null, []);
+    classB.methods = <MethodElement> [method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertSame(method, classB.lookUpConcreteMethod(methodName, library));
+  }
+
+  void test_lookUpConcreteMethod_inherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement inheritedMethod = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertSame(inheritedMethod, classB.lookUpConcreteMethod(methodName, library));
+  }
+
+  void test_lookUpConcreteMethod_undeclared() {
+    // class A {
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertNull(classA.lookUpConcreteMethod("m", library));
+  }
+
   void test_lookUpGetter_declared() {
+    // class A {
+    //   get g {}
+    // }
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -263,6 +378,11 @@
   }
 
   void test_lookUpGetter_inherited() {
+    // class A {
+    //   get g {}
+    // }
+    // class B extends A {
+    // }
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String getterName = "g";
@@ -274,6 +394,8 @@
   }
 
   void test_lookUpGetter_undeclared() {
+    // class A {
+    // }
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
@@ -281,6 +403,10 @@
   }
 
   void test_lookUpGetter_undeclared_recursive() {
+    // class A extends B {
+    // }
+    // class B extends A {
+    // }
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
@@ -289,7 +415,236 @@
     JUnitTestCase.assertNull(classA.lookUpGetter("g", library));
   }
 
+  void test_lookUpInheritedConcreteGetter_declared() {
+    // class A {
+    //   get g {}
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement getter = ElementFactory.getterElement(getterName, false, null);
+    classA.accessors = <PropertyAccessorElement> [getter];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteGetter(getterName, library));
+  }
+
+  void test_lookUpInheritedConcreteGetter_inherited() {
+    // class A {
+    //   get g {}
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String getterName = "g";
+    PropertyAccessorElement inheritedGetter = ElementFactory.getterElement(getterName, false, null);
+    classA.accessors = <PropertyAccessorElement> [inheritedGetter];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertSame(inheritedGetter, classB.lookUpInheritedConcreteGetter(getterName, library));
+  }
+
+  void test_lookUpInheritedConcreteGetter_undeclared() {
+    // class A {
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteGetter("g", library));
+  }
+
+  void test_lookUpInheritedConcreteGetter_undeclared_recursive() {
+    // class A extends B {
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.supertype = classB.type;
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteGetter("g", library));
+  }
+
+  void test_lookUpInheritedConcreteMethod_declared() {
+    // class A {
+    //   m() {}
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement method = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteMethod(methodName, library));
+  }
+
+  void test_lookUpInheritedConcreteMethod_declaredAbstractAndInherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    //   m();
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement inheritedMethod = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    MethodElementImpl method = ElementFactory.methodElement(methodName, null, []);
+    method.abstract = true;
+    classB.methods = <MethodElement> [method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertSame(inheritedMethod, classB.lookUpInheritedConcreteMethod(methodName, library));
+  }
+
+  void test_lookUpInheritedConcreteMethod_declaredAndInherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    //   m() {}
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement inheritedMethod = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    MethodElement method = ElementFactory.methodElement(methodName, null, []);
+    classB.methods = <MethodElement> [method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertSame(inheritedMethod, classB.lookUpInheritedConcreteMethod(methodName, library));
+  }
+
+  void test_lookUpInheritedConcreteMethod_declaredAndInheritedAbstract() {
+    // abstract class A {
+    //   m();
+    // }
+    // class B extends A {
+    //   m() {}
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    classA.abstract = true;
+    String methodName = "m";
+    MethodElementImpl inheritedMethod = ElementFactory.methodElement(methodName, null, []);
+    inheritedMethod.abstract = true;
+    classA.methods = <MethodElement> [inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    MethodElement method = ElementFactory.methodElement(methodName, null, []);
+    classB.methods = <MethodElement> [method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertNull(classB.lookUpInheritedConcreteMethod(methodName, library));
+  }
+
+  void test_lookUpInheritedConcreteMethod_declaredAndInheritedWithAbstractBetween() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    //   m();
+    // }
+    // class C extends B {
+    //   m() {}
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement inheritedMethod = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    MethodElementImpl abstractMethod = ElementFactory.methodElement(methodName, null, []);
+    abstractMethod.abstract = true;
+    classB.methods = <MethodElement> [abstractMethod];
+    ClassElementImpl classC = ElementFactory.classElement("C", classB.type, []);
+    MethodElementImpl method = ElementFactory.methodElement(methodName, null, []);
+    classC.methods = <MethodElement> [method];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB, classC];
+    JUnitTestCase.assertSame(inheritedMethod, classC.lookUpInheritedConcreteMethod(methodName, library));
+  }
+
+  void test_lookUpInheritedConcreteMethod_inherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElement inheritedMethod = ElementFactory.methodElement(methodName, null, []);
+    classA.methods = <MethodElement> [inheritedMethod];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertSame(inheritedMethod, classB.lookUpInheritedConcreteMethod(methodName, library));
+  }
+
+  void test_lookUpInheritedConcreteMethod_undeclared() {
+    // class A {
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteMethod("m", library));
+  }
+
+  void test_lookUpInheritedConcreteSetter_declared() {
+    // class A {
+    //   set g(x) {}
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String setterName = "s";
+    PropertyAccessorElement setter = ElementFactory.setterElement(setterName, false, null);
+    classA.accessors = <PropertyAccessorElement> [setter];
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteSetter(setterName, library));
+  }
+
+  void test_lookUpInheritedConcreteSetter_inherited() {
+    // class A {
+    //   set g(x) {}
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String setterName = "s";
+    PropertyAccessorElement setter = ElementFactory.setterElement(setterName, false, null);
+    classA.accessors = <PropertyAccessorElement> [setter];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertSame(setter, classB.lookUpInheritedConcreteSetter(setterName, library));
+  }
+
+  void test_lookUpInheritedConcreteSetter_undeclared() {
+    // class A {
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
+    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteSetter("s", library));
+  }
+
+  void test_lookUpInheritedConcreteSetter_undeclared_recursive() {
+    // class A extends B {
+    // }
+    // class B extends A {
+    // }
+    LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    classA.supertype = classB.type;
+    (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA, classB];
+    JUnitTestCase.assertNull(classA.lookUpInheritedConcreteSetter("s", library));
+  }
+
   void test_lookUpInheritedMethod_declared() {
+    // class A {
+    //   m() {}
+    // }
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -300,6 +655,12 @@
   }
 
   void test_lookUpInheritedMethod_declaredAndInherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    //   m() {}
+    // }
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -313,6 +674,11 @@
   }
 
   void test_lookUpInheritedMethod_inherited() {
+    // class A {
+    //   m() {}
+    // }
+    // class B extends A {
+    // }
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String methodName = "m";
@@ -324,6 +690,8 @@
   }
 
   void test_lookUpInheritedMethod_undeclared() {
+    // class A {
+    // }
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
@@ -368,6 +736,9 @@
   }
 
   void test_lookUpSetter_declared() {
+    // class A {
+    //   set g(x) {}
+    // }
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String setterName = "s";
@@ -378,6 +749,11 @@
   }
 
   void test_lookUpSetter_inherited() {
+    // class A {
+    //   set g(x) {}
+    // }
+    // class B extends A {
+    // }
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     String setterName = "s";
@@ -389,6 +765,8 @@
   }
 
   void test_lookUpSetter_undeclared() {
+    // class A {
+    // }
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     (library.definingCompilationUnit as CompilationUnitElementImpl).types = <ClassElement> [classA];
@@ -396,6 +774,10 @@
   }
 
   void test_lookUpSetter_undeclared_recursive() {
+    // class A extends B {
+    // }
+    // class B extends A {
+    // }
     LibraryElementImpl library = ElementFactory.library(createAnalysisContext(), "lib");
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
@@ -478,6 +860,34 @@
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_hasStaticMember_true_setter);
       });
+      _ut.test('test_lookUpConcreteMethod_declared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpConcreteMethod_declared);
+      });
+      _ut.test('test_lookUpConcreteMethod_declaredAbstract', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpConcreteMethod_declaredAbstract);
+      });
+      _ut.test('test_lookUpConcreteMethod_declaredAbstractAndInherited', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpConcreteMethod_declaredAbstractAndInherited);
+      });
+      _ut.test('test_lookUpConcreteMethod_declaredAndInherited', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpConcreteMethod_declaredAndInherited);
+      });
+      _ut.test('test_lookUpConcreteMethod_declaredAndInheritedAbstract', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpConcreteMethod_declaredAndInheritedAbstract);
+      });
+      _ut.test('test_lookUpConcreteMethod_inherited', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpConcreteMethod_inherited);
+      });
+      _ut.test('test_lookUpConcreteMethod_undeclared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpConcreteMethod_undeclared);
+      });
       _ut.test('test_lookUpGetter_declared', () {
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_lookUpGetter_declared);
@@ -494,6 +904,66 @@
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_lookUpGetter_undeclared_recursive);
       });
+      _ut.test('test_lookUpInheritedConcreteGetter_declared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedConcreteGetter_declared);
+      });
+      _ut.test('test_lookUpInheritedConcreteGetter_inherited', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedConcreteGetter_inherited);
+      });
+      _ut.test('test_lookUpInheritedConcreteGetter_undeclared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedConcreteGetter_undeclared);
+      });
+      _ut.test('test_lookUpInheritedConcreteGetter_undeclared_recursive', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedConcreteGetter_undeclared_recursive);
+      });
+      _ut.test('test_lookUpInheritedConcreteMethod_declared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedConcreteMethod_declared);
+      });
+      _ut.test('test_lookUpInheritedConcreteMethod_declaredAbstractAndInherited', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedConcreteMethod_declaredAbstractAndInherited);
+      });
+      _ut.test('test_lookUpInheritedConcreteMethod_declaredAndInherited', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedConcreteMethod_declaredAndInherited);
+      });
+      _ut.test('test_lookUpInheritedConcreteMethod_declaredAndInheritedAbstract', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedConcreteMethod_declaredAndInheritedAbstract);
+      });
+      _ut.test('test_lookUpInheritedConcreteMethod_declaredAndInheritedWithAbstractBetween', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedConcreteMethod_declaredAndInheritedWithAbstractBetween);
+      });
+      _ut.test('test_lookUpInheritedConcreteMethod_inherited', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedConcreteMethod_inherited);
+      });
+      _ut.test('test_lookUpInheritedConcreteMethod_undeclared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedConcreteMethod_undeclared);
+      });
+      _ut.test('test_lookUpInheritedConcreteSetter_declared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedConcreteSetter_declared);
+      });
+      _ut.test('test_lookUpInheritedConcreteSetter_inherited', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedConcreteSetter_inherited);
+      });
+      _ut.test('test_lookUpInheritedConcreteSetter_undeclared', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedConcreteSetter_undeclared);
+      });
+      _ut.test('test_lookUpInheritedConcreteSetter_undeclared_recursive', () {
+        final __test = new ClassElementImplTest();
+        runJUnitTest(__test, __test.test_lookUpInheritedConcreteSetter_undeclared_recursive);
+      });
       _ut.test('test_lookUpInheritedMethod_declared', () {
         final __test = new ClassElementImplTest();
         runJUnitTest(__test, __test.test_lookUpInheritedMethod_declared);
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index cbea5a5..b59d1e9 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -151,6 +151,12 @@
     htmlUnit.source = htmlSource;
     ClassElementImpl elementElement = ElementFactory.classElement2("Element", []);
     InterfaceType elementType = elementElement.type;
+    ClassElementImpl canvasElement = ElementFactory.classElement("CanvasElement", elementType, []);
+    ClassElementImpl contextElement = ElementFactory.classElement2("CanvasRenderingContext", []);
+    InterfaceType contextElementType = contextElement.type;
+    ClassElementImpl context2dElement = ElementFactory.classElement("CanvasRenderingContext2D", contextElementType, []);
+    canvasElement.methods = <MethodElement> [ElementFactory.methodElement("getContext", contextElementType, [provider.stringType])];
+    canvasElement.accessors = <PropertyAccessorElement> [ElementFactory.getterElement("context2D", false, context2dElement.type)];
     ClassElementImpl documentElement = ElementFactory.classElement("Document", elementType, []);
     ClassElementImpl htmlDocumentElement = ElementFactory.classElement("HtmlDocument", documentElement.type, []);
     htmlDocumentElement.methods = <MethodElement> [ElementFactory.methodElement("query", elementType, <DartType> [provider.stringType])];
@@ -158,6 +164,9 @@
         ElementFactory.classElement("AnchorElement", elementType, []),
         ElementFactory.classElement("BodyElement", elementType, []),
         ElementFactory.classElement("ButtonElement", elementType, []),
+        canvasElement,
+        contextElement,
+        context2dElement,
         ElementFactory.classElement("DivElement", elementType, []),
         documentElement,
         elementElement,
@@ -663,29 +672,25 @@
   }
 
   void test_constDeferredClass() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A();", "}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {", "  const A();", "}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "main() {",
         "  const a.A();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
   }
 
   void test_constDeferredClass_namedConstructor() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A.b();", "}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {", "  const A.b();", "}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "main() {",
         "  const a.A.b();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
   }
 
   void test_constEval_newInstance_constConstructor() {
@@ -857,25 +862,21 @@
   }
 
   void test_constInitializedWithNonConstValueFromDeferredClass() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const V = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
-        "const B = a.V;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "const B = a.V;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_constInitializedWithNonConstValueFromDeferredClass_nested() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const V = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
-        "const B = a.V + 1;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "const B = a.V + 1;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_constInstanceField() {
@@ -1318,26 +1319,22 @@
   }
 
   void test_extendsDeferredClass() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
-        "class B extends a.A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
-    verify([source]);
+        "class B extends a.A {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
   }
 
   void test_extendsDeferredClass_classTypeAlias() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "class M {}",
-        "class C = a.A with M;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
-    verify([source]);
+        "class C = a.A with M;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
   }
 
   void test_extendsDisallowedClass_class_bool() {
@@ -1646,27 +1643,23 @@
   }
 
   void test_implementsDeferredClass() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
-        "class B implements a.A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
-    verify([source]);
+        "class B implements a.A {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
   }
 
   void test_implementsDeferredClass_classTypeAlias() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "class B {}",
         "class M {}",
-        "class C = B with M implements a.A;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
-    verify([source]);
+        "class C = B with M implements a.A;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
   }
 
   void test_implementsDisallowedClass_class_bool() {
@@ -2190,41 +2183,35 @@
 
   void test_invalidAnnotationFromDeferredLibrary() {
     // See test_invalidAnnotation_notConstantVariable
-    addNamedSource("/lib1.dart", EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource([
         "library lib1;",
         "class V { const V(); }",
-        "const v = const V();"]));
-    Source source = addSource(EngineTestCase.createSource([
+        "const v = const V();"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
-        "@a.v main () {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "@a.v main () {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_invalidAnnotationFromDeferredLibrary_constructor() {
     // See test_invalidAnnotation_notConstantVariable
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class C { const C(); }"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class C { const C(); }"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
-        "@a.C() main () {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "@a.C() main () {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_invalidAnnotationFromDeferredLibrary_namedConstructor() {
     // See test_invalidAnnotation_notConstantVariable
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class C { const C.name(); }"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class C { const C.name(); }"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
-        "@a.C.name() main () {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "@a.C.name() main () {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_invalidConstructorName_notEnclosingClassName_defined() {
@@ -2464,26 +2451,22 @@
   }
 
   void test_mixinDeferredClass() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
-        "class B extends Object with a.A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
-    verify([source]);
+        "class B extends Object with a.A {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
   }
 
   void test_mixinDeferredClass_classTypeAlias() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "class B {}",
-        "class C = B with a.A;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
-    verify([source]);
+        "class C = B with a.A;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
   }
 
   void test_mixinInheritsFromNotObject_classDeclaration_extends() {
@@ -2805,25 +2788,21 @@
   }
 
   void test_nonConstantDefaultValueFromDeferredLibrary() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const V = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
-        "f({x : a.V}) {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "f({x : a.V}) {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstantDefaultValueFromDeferredLibrary_nested() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const V = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
-        "f({x : a.V + 1}) {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "f({x : a.V + 1}) {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstCaseExpression() {
@@ -2840,8 +2819,9 @@
   }
 
   void test_nonConstCaseExpressionFromDeferredLibrary() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "main (int p) {",
@@ -2849,15 +2829,13 @@
         "    case a.c:",
         "      break;",
         "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstCaseExpressionFromDeferredLibrary_nested() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "main (int p) {",
@@ -2865,10 +2843,7 @@
         "    case a.c + 1:",
         "      break;",
         "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstListElement() {
@@ -2879,29 +2854,25 @@
   }
 
   void test_nonConstListElementFromDeferredLibrary() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "f() {",
         "  return const [a.c];",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstListElementFromDeferredLibrary_nested() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "f() {",
         "  return const [a.c + 1];",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstMapAsExpressionStatement_begin() {
@@ -2926,29 +2897,25 @@
   }
 
   void test_nonConstMapKeyFromDeferredLibrary() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "f() {",
         "  return const {a.c : 0};",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstMapKeyFromDeferredLibrary_nested() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "f() {",
         "  return const {a.c + 1 : 0};",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstMapValue() {
@@ -2959,29 +2926,25 @@
   }
 
   void test_nonConstMapValueFromDeferredLibrary() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "f() {",
         "  return const {'a' : a.c};",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstMapValueFromDeferredLibrary_nested() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "f() {",
         "  return const {'a' : a.c + 1};",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstValueInInitializer_binary_notBool_left() {
@@ -3075,61 +3038,53 @@
   }
 
   void test_nonConstValueInInitializerFromDeferredLibrary_field() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "class A {",
         "  final int x;",
-        "  const A() : x = a.C;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "  const A() : x = a.c;",
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstValueInInitializerFromDeferredLibrary_field_nested() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "class A {",
         "  final int x;",
-        "  const A() : x = a.C + 1;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "  const A() : x = a.c + 1;",
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstValueInInitializerFromDeferredLibrary_redirecting() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "class A {",
         "  const A.named(p);",
-        "  const A() : this.named(a.C);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "  const A() : this.named(a.c);",
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonConstValueInInitializerFromDeferredLibrary_super() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "const int c = 1;"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "class A {",
         "  const A(p);",
         "}",
         "class B extends A {",
-        "  const B() : super(a.C);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
+        "  const B() : super(a.c);",
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
   }
 
   void test_nonGenerativeConstructor_explicit() {
@@ -3415,6 +3370,17 @@
     verify([source]);
   }
 
+  void test_recursiveInterfaceInheritance_mixin() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class M1 = Object with M2;",
+        "class M2 = Object with M1;"]));
+    resolve(source);
+    assertErrors(source, [
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
+        CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE]);
+    verify([source]);
+  }
+
   void test_recursiveInterfaceInheritance_tail() {
     Source source = addSource(EngineTestCase.createSource([
         "abstract class A implements A {}",
@@ -3474,6 +3440,13 @@
     verify([source]);
   }
 
+  void test_recursiveInterfaceInheritanceBaseCaseWith() {
+    Source source = addSource(EngineTestCase.createSource(["class M = Object with M;"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH]);
+    verify([source]);
+  }
+
   void test_redirectGenerativeToMissingConstructor() {
     Source source = addSource(EngineTestCase.createSource(["class A {", "  A() : this.noSuchConstructor();", "}"]));
     resolve(source);
@@ -3612,16 +3585,14 @@
   }
 
   void test_sharedDeferredPrefix() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f1() {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f2() {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "f1() {}"]),
+        EngineTestCase.createSource(["library lib2;", "f2() {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as lib;",
         "import 'lib2.dart' as lib;",
-        "main() { lib.f1(); lib.f2(); }"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.SHARED_DEFERRED_PREFIX]);
-    verify([source]);
+        "main() { lib.f1(); lib.f2(); }"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [CompileTimeErrorCode.SHARED_DEFERRED_PREFIX]);
   }
 
   void test_superInInvalidContext_binaryExpression() {
@@ -3807,24 +3778,6 @@
     verify([source]);
   }
 
-  void test_typeAliasCannotRereferenceItself_mixin_direct() {
-    Source source = addSource(EngineTestCase.createSource(["class M = Object with M;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
-    verify([source]);
-  }
-
-  void test_typeAliasCannotRereferenceItself_mixin_indirect() {
-    Source source = addSource(EngineTestCase.createSource([
-        "class M1 = Object with M2;",
-        "class M2 = Object with M1;"]));
-    resolve(source);
-    assertErrors(source, [
-        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
-        CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]);
-    verify([source]);
-  }
-
   void test_typeArgumentNotMatchingBounds_const() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {}",
@@ -5321,6 +5274,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_recursiveInterfaceInheritanceBaseCaseImplements_typeAlias);
       });
+      _ut.test('test_recursiveInterfaceInheritanceBaseCaseWith', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritanceBaseCaseWith);
+      });
       _ut.test('test_recursiveInterfaceInheritance_extends', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_extends);
@@ -5333,6 +5290,10 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_implements);
       });
+      _ut.test('test_recursiveInterfaceInheritance_mixin', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_mixin);
+      });
       _ut.test('test_recursiveInterfaceInheritance_tail', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_recursiveInterfaceInheritance_tail);
@@ -5485,14 +5446,6 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_typeAliasCannotReferenceItself_typeVariableBounds);
       });
-      _ut.test('test_typeAliasCannotRereferenceItself_mixin_direct', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_typeAliasCannotRereferenceItself_mixin_direct);
-      });
-      _ut.test('test_typeAliasCannotRereferenceItself_mixin_indirect', () {
-        final __test = new CompileTimeErrorCodeTest();
-        runJUnitTest(__test, __test.test_typeAliasCannotRereferenceItself_mixin_indirect);
-      });
       _ut.test('test_typeArgumentNotMatchingBounds_const', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_typeArgumentNotMatchingBounds_const);
@@ -5741,771 +5694,6 @@
   }
 }
 
-class DeferredLoadingTest extends ResolverTestCase {
-  void test_constDeferredClass() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A();", "}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "main() {",
-        "  const a.A();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_constDeferredClass_namedConstructor() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A.b();", "}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "main() {",
-        "  const a.A.b();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_constDeferredClass_new_nonTest() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A.b();", "}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "main() {",
-        "  new a.A.b();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, []);
-    verify([source]);
-  }
-
-  void test_constInitializedWithNonConstValueFromDeferredClass() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "const B = a.V;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_constInitializedWithNonConstValueFromDeferredClass_nested() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "const B = a.V + 1;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_extendsDeferredClass() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class B extends a.A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_extendsDeferredClass_classTypeAlias() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class M {}",
-        "class C = a.A with M;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDeferredClass() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class B implements a.A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_implementsDeferredClass_classTypeAlias() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class B {}",
-        "class M {}",
-        "class C = B with M implements a.A;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.IMPLEMENTS_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_importDeferredLibraryWithLoadFunction() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "loadLibrary() {}", "f() {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as lib1;",
-        "main() { lib1.f(); }"]));
-    resolve(source);
-    assertErrors(source, [HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]);
-    verify([source]);
-  }
-
-  void test_importOfNonLibrary() {
-    Source source = addSource(EngineTestCase.createSource([
-        "library lib;",
-        "import 'part.dart' deferred as p;",
-        "var a = new p.A();"]));
-    addNamedSource("/part.dart", EngineTestCase.createSource(["part of lib;", "class A {}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.IMPORT_OF_NON_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_invalidAnnotationFromDeferredLibrary() {
-    // See test_invalidAnnotation_notConstantVariable
-    addNamedSource("/lib1.dart", EngineTestCase.createSource([
-        "library lib1;",
-        "class V { const V(); }",
-        "const v = const V();"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "@a.v main () {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_invalidAnnotationFromDeferredLibrary_constructor() {
-    // See test_invalidAnnotation_notConstantVariable
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class C { const C(); }"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "@a.C() main () {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_invalidAnnotationFromDeferredLibrary_namedConstructor() {
-    // See test_invalidAnnotation_notConstantVariable
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class C { const C.name(); }"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "@a.C.name() main () {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_loadLibraryDefined_nonTest() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "foo() => 22;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib.dart' deferred as other;",
-        "main() {",
-        "  other.loadLibrary().then((_) => other.foo());",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_mixinDeferredClass() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class B extends Object with a.A {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_mixinDeferredClass_classTypeAlias() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class B {}",
-        "class C = B with a.A;"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.MIXIN_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_nonConstantDefaultValueFromDeferredLibrary() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f({x : a.V}) {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_nonConstantDefaultValueFromDeferredLibrary_nested() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const V = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f({x : a.V + 1}) {}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_nonConstCaseExpressionFromDeferredLibrary() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "main (int p) {",
-        "  switch (p) {",
-        "    case a.c:",
-        "      break;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_nonConstCaseExpressionFromDeferredLibrary_nested() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "main (int p) {",
-        "  switch (p) {",
-        "    case a.c + 1:",
-        "      break;",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_nonConstListElementFromDeferredLibrary() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f() {",
-        "  return const [a.c];",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_nonConstListElementFromDeferredLibrary_nested() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f() {",
-        "  return const [a.c + 1];",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_nonConstMapKeyFromDeferredLibrary() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f() {",
-        "  return const {a.c : 0};",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_nonConstMapKeyFromDeferredLibrary_nested() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f() {",
-        "  return const {a.c + 1 : 0};",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_nonConstMapValueFromDeferredLibrary() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f() {",
-        "  return const {'a' : a.c};",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_nonConstMapValueFromDeferredLibrary_nested() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int c = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f() {",
-        "  return const {'a' : a.c + 1};",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_nonConstValueInInitializerFromDeferredLibrary_field() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class A {",
-        "  final int x;",
-        "  const A() : x = a.C;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_nonConstValueInInitializerFromDeferredLibrary_field_nested() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class A {",
-        "  final int x;",
-        "  const A() : x = a.C + 1;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_nonConstValueInInitializerFromDeferredLibrary_redirecting() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class A {",
-        "  const A.named(p);",
-        "  const A() : this.named(a.C);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_nonConstValueInInitializerFromDeferredLibrary_super() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "const int C = 1;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class A {",
-        "  const A(p);",
-        "}",
-        "class B extends A {",
-        "  const B() : super(a.C);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY]);
-    verify([source]);
-  }
-
-  void test_sharedDeferredPrefix() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f1() {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f2() {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as lib;",
-        "import 'lib2.dart' as lib;",
-        "main() { lib.f1(); lib.f2(); }"]));
-    resolve(source);
-    assertErrors(source, [CompileTimeErrorCode.SHARED_DEFERRED_PREFIX]);
-    verify([source]);
-  }
-
-  void test_sharedDeferredPrefix_nonTest() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f1() {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f2() {}"]));
-    addNamedSource("/lib3.dart", EngineTestCase.createSource(["library lib3;", "f3() {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as lib1;",
-        "import 'lib2.dart' as lib;",
-        "import 'lib3.dart' as lib;",
-        "main() { lib1.f1(); lib.f2(); lib.f3(); }"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  void test_typeAnnotationDeferredClass_asExpression() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f(var v) {",
-        "  v as a.A;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_typeAnnotationDeferredClass_catchClause() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f(var v) {",
-        "  try {",
-        "  } on a.A {",
-        "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_typeAnnotationDeferredClass_fieldFormalParameter() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class C {",
-        "  var v;",
-        "  C(a.A this.v);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_typeAnnotationDeferredClass_functionDeclaration_returnType() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "a.A f() { return null; }"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f(a.A g()) {}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_typeAnnotationDeferredClass_isExpression() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f(var v) {",
-        "  bool b = v is a.A;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_typeAnnotationDeferredClass_methodDeclaration_returnType() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class C {",
-        "  a.A m() { return null; }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_typeAnnotationDeferredClass_simpleFormalParameter() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "f(a.A v) {}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_typeAnnotationDeferredClass_typeArgumentList() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class C<E> {}",
-        "C<a.A> c;"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_typeAnnotationDeferredClass_typeArgumentList2() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class C<E, F> {}",
-        "C<a.A, a.A> c;"]));
-    resolve(source);
-    assertErrors(source, [
-        StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS,
-        StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_typeAnnotationDeferredClass_typeParameter_bound() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "class C<E extends a.A> {}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  void test_typeAnnotationDeferredClass_variableDeclarationList() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "library root;",
-        "import 'lib1.dart' deferred as a;",
-        "a.A v;"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
-  }
-
-  @override
-  void reset() {
-    AnalysisOptionsImpl analysisOptions = new AnalysisOptionsImpl();
-    analysisOptions.enableDeferredLoading = true;
-    resetWithOptions(analysisOptions);
-  }
-
-  static dartSuite() {
-    _ut.group('DeferredLoadingTest', () {
-      _ut.test('test_constDeferredClass', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_constDeferredClass);
-      });
-      _ut.test('test_constDeferredClass_namedConstructor', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_constDeferredClass_namedConstructor);
-      });
-      _ut.test('test_constDeferredClass_new_nonTest', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_constDeferredClass_new_nonTest);
-      });
-      _ut.test('test_constInitializedWithNonConstValueFromDeferredClass', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_constInitializedWithNonConstValueFromDeferredClass);
-      });
-      _ut.test('test_constInitializedWithNonConstValueFromDeferredClass_nested', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_constInitializedWithNonConstValueFromDeferredClass_nested);
-      });
-      _ut.test('test_extendsDeferredClass', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_extendsDeferredClass);
-      });
-      _ut.test('test_extendsDeferredClass_classTypeAlias', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_extendsDeferredClass_classTypeAlias);
-      });
-      _ut.test('test_implementsDeferredClass', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_implementsDeferredClass);
-      });
-      _ut.test('test_implementsDeferredClass_classTypeAlias', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_implementsDeferredClass_classTypeAlias);
-      });
-      _ut.test('test_importDeferredLibraryWithLoadFunction', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_importDeferredLibraryWithLoadFunction);
-      });
-      _ut.test('test_importOfNonLibrary', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_importOfNonLibrary);
-      });
-      _ut.test('test_invalidAnnotationFromDeferredLibrary', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_invalidAnnotationFromDeferredLibrary);
-      });
-      _ut.test('test_invalidAnnotationFromDeferredLibrary_constructor', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_invalidAnnotationFromDeferredLibrary_constructor);
-      });
-      _ut.test('test_invalidAnnotationFromDeferredLibrary_namedConstructor', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_invalidAnnotationFromDeferredLibrary_namedConstructor);
-      });
-      _ut.test('test_loadLibraryDefined_nonTest', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_loadLibraryDefined_nonTest);
-      });
-      _ut.test('test_mixinDeferredClass', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_mixinDeferredClass);
-      });
-      _ut.test('test_mixinDeferredClass_classTypeAlias', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_mixinDeferredClass_classTypeAlias);
-      });
-      _ut.test('test_nonConstCaseExpressionFromDeferredLibrary', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_nonConstCaseExpressionFromDeferredLibrary);
-      });
-      _ut.test('test_nonConstCaseExpressionFromDeferredLibrary_nested', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_nonConstCaseExpressionFromDeferredLibrary_nested);
-      });
-      _ut.test('test_nonConstListElementFromDeferredLibrary', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_nonConstListElementFromDeferredLibrary);
-      });
-      _ut.test('test_nonConstListElementFromDeferredLibrary_nested', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_nonConstListElementFromDeferredLibrary_nested);
-      });
-      _ut.test('test_nonConstMapKeyFromDeferredLibrary', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_nonConstMapKeyFromDeferredLibrary);
-      });
-      _ut.test('test_nonConstMapKeyFromDeferredLibrary_nested', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_nonConstMapKeyFromDeferredLibrary_nested);
-      });
-      _ut.test('test_nonConstMapValueFromDeferredLibrary', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_nonConstMapValueFromDeferredLibrary);
-      });
-      _ut.test('test_nonConstMapValueFromDeferredLibrary_nested', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_nonConstMapValueFromDeferredLibrary_nested);
-      });
-      _ut.test('test_nonConstValueInInitializerFromDeferredLibrary_field', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_nonConstValueInInitializerFromDeferredLibrary_field);
-      });
-      _ut.test('test_nonConstValueInInitializerFromDeferredLibrary_field_nested', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_nonConstValueInInitializerFromDeferredLibrary_field_nested);
-      });
-      _ut.test('test_nonConstValueInInitializerFromDeferredLibrary_redirecting', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_nonConstValueInInitializerFromDeferredLibrary_redirecting);
-      });
-      _ut.test('test_nonConstValueInInitializerFromDeferredLibrary_super', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_nonConstValueInInitializerFromDeferredLibrary_super);
-      });
-      _ut.test('test_nonConstantDefaultValueFromDeferredLibrary', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValueFromDeferredLibrary);
-      });
-      _ut.test('test_nonConstantDefaultValueFromDeferredLibrary_nested', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_nonConstantDefaultValueFromDeferredLibrary_nested);
-      });
-      _ut.test('test_sharedDeferredPrefix', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_sharedDeferredPrefix);
-      });
-      _ut.test('test_sharedDeferredPrefix_nonTest', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_sharedDeferredPrefix_nonTest);
-      });
-      _ut.test('test_typeAnnotationDeferredClass_asExpression', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_asExpression);
-      });
-      _ut.test('test_typeAnnotationDeferredClass_catchClause', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_catchClause);
-      });
-      _ut.test('test_typeAnnotationDeferredClass_fieldFormalParameter', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_fieldFormalParameter);
-      });
-      _ut.test('test_typeAnnotationDeferredClass_functionDeclaration_returnType', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_functionDeclaration_returnType);
-      });
-      _ut.test('test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType);
-      });
-      _ut.test('test_typeAnnotationDeferredClass_isExpression', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_isExpression);
-      });
-      _ut.test('test_typeAnnotationDeferredClass_methodDeclaration_returnType', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_methodDeclaration_returnType);
-      });
-      _ut.test('test_typeAnnotationDeferredClass_simpleFormalParameter', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_simpleFormalParameter);
-      });
-      _ut.test('test_typeAnnotationDeferredClass_typeArgumentList', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_typeArgumentList);
-      });
-      _ut.test('test_typeAnnotationDeferredClass_typeArgumentList2', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_typeArgumentList2);
-      });
-      _ut.test('test_typeAnnotationDeferredClass_typeParameter_bound', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_typeParameter_bound);
-      });
-      _ut.test('test_typeAnnotationDeferredClass_variableDeclarationList', () {
-        final __test = new DeferredLoadingTest();
-        runJUnitTest(__test, __test.test_typeAnnotationDeferredClass_variableDeclarationList);
-      });
-    });
-  }
-}
-
 class ElementResolverTest extends EngineTestCase {
   /**
    * The error listener to which errors will be reported.
@@ -7521,6 +6709,22 @@
     verify([source]);
   }
 
+  void fail_unusedImport_as_equalPrefixes() {
+    // See todo at ImportsVerifier.prefixElementMap.
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart' as one;",
+        "import 'lib2.dart' as one;",
+        "one.A a;"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source3 = addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class B {}"]));
+    resolve(source);
+    assertErrors(source, [HintCode.UNUSED_IMPORT]);
+    assertNoErrors(source2);
+    assertNoErrors(source3);
+    verify([source, source2, source3]);
+  }
+
   void test_argumentTypeNotAssignable_functionType() {
     Source source = addSource(EngineTestCase.createSource([
         "m() {",
@@ -8142,19 +7346,17 @@
         "M.A a;"]));
     addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}", "class B {}"]));
     resolve(source);
-    assertErrors(source, [HintCode.DUPLICATE_IMPORT, HintCode.UNUSED_IMPORT]);
+    assertErrors(source, [HintCode.DUPLICATE_IMPORT]);
     verify([source]);
   }
 
   void test_importDeferredLibraryWithLoadFunction() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "loadLibrary() {}", "f() {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "loadLibrary() {}", "f() {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as lib1;",
-        "main() { lib1.f(); }"]));
-    resolve(source);
-    assertErrors(source, [HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]);
-    verify([source]);
+        "main() { lib1.f(); }"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION]);
   }
 
   void test_invalidAssignment_instanceVariable() {
@@ -11290,6 +10492,19 @@
     verify([source]);
   }
 
+  void test_concreteClassWithAbstractMember_inherited() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m() {}",
+        "}",
+        "class B extends A {",
+        "  m();",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_conflictingInstanceGetterAndSuperclassMember_instance() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -11407,16 +10622,14 @@
   }
 
   void test_constDeferredClass_new() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {", "  const A.b();", "}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {", "  const A.b();", "}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "main() {",
         "  new a.A.b();",
-        "}"]));
-    resolve(source);
-    assertErrors(source, []);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> []);
   }
 
   void test_constEval_functionTypeLiteral() {
@@ -12836,15 +12049,15 @@
   }
 
   void test_loadLibraryDefined() {
-    addNamedSource("/lib.dart", EngineTestCase.createSource(["library lib;", "foo() => 22;"]));
-    Source source = addSource(EngineTestCase.createSource([
-        "import 'lib.dart' deferred as other;",
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "foo() => 22;"]),
+        EngineTestCase.createSource([
+        "import 'lib1.dart' deferred as other;",
         "main() {",
         "  other.loadLibrary().then((_) => other.foo());",
-        "}"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
+        "}"])], <ErrorCode> [
+        ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED,
+        StaticTypeWarningCode.UNDEFINED_FUNCTION], <ErrorCode> []);
   }
 
   void test_mapKeyTypeNotAssignable() {
@@ -14083,18 +13296,16 @@
   }
 
   void test_sharedDeferredPrefix() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f1() {}"]));
-    addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f2() {}"]));
-    addNamedSource("/lib3.dart", EngineTestCase.createSource(["library lib3;", "f3() {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "f1() {}"]),
+        EngineTestCase.createSource(["library lib2;", "f2() {}"]),
+        EngineTestCase.createSource(["library lib3;", "f3() {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as lib1;",
         "import 'lib2.dart' as lib;",
         "import 'lib3.dart' as lib;",
-        "main() { lib1.f1(); lib.f2(); lib.f3(); }"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
+        "main() { lib1.f1(); lib.f2(); lib.f3(); }"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> []);
   }
 
   void test_staticAccessToInstanceMember_annotation() {
@@ -14944,6 +14155,10 @@
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_concreteClassWithAbstractMember);
       });
+      _ut.test('test_concreteClassWithAbstractMember_inherited', () {
+        final __test = new NonErrorResolverTest();
+        runJUnitTest(__test, __test.test_concreteClassWithAbstractMember_inherited);
+      });
       _ut.test('test_conflictingInstanceGetterAndSuperclassMember_instance', () {
         final __test = new NonErrorResolverTest();
         runJUnitTest(__test, __test.test_conflictingInstanceGetterAndSuperclassMember_instance);
@@ -16372,14 +15587,12 @@
   }
 
   void test_importDeferredLibraryWithLoadFunction() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f() {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "f() {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as lib1;",
-        "main() { lib1.f(); }"]));
-    resolve(source);
-    assertNoErrors(source);
-    verify([source]);
+        "main() { lib1.f(); }"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> []);
   }
 
   void test_missingReturn_emptyFunctionBody() {
@@ -16763,6 +15976,23 @@
     verify([source, source2]);
   }
 
+  void test_unusedImport_as_equalPrefixes() {
+    // 18818
+    Source source = addSource(EngineTestCase.createSource([
+        "library L;",
+        "import 'lib1.dart' as one;",
+        "import 'lib2.dart' as one;",
+        "one.A a;",
+        "one.B b;"]));
+    Source source2 = addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
+    Source source3 = addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "class B {}"]));
+    resolve(source);
+    assertErrors(source, []);
+    assertNoErrors(source2);
+    assertNoErrors(source3);
+    verify([source, source2, source3]);
+  }
+
   void test_unusedImport_core_library() {
     Source source = addSource(EngineTestCase.createSource(["library L;", "import 'dart:core';"]));
     resolve(source);
@@ -17037,6 +16267,10 @@
         final __test = new NonHintCodeTest();
         runJUnitTest(__test, __test.test_unusedImport_annotationOnDirective);
       });
+      _ut.test('test_unusedImport_as_equalPrefixes', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unusedImport_as_equalPrefixes);
+      });
       _ut.test('test_unusedImport_core_library', () {
         final __test = new NonHintCodeTest();
         runJUnitTest(__test, __test.test_unusedImport_core_library);
@@ -17661,12 +16895,42 @@
    */
   CompilationUnit resolveCompilationUnit(Source source, LibraryElement library) => _analysisContext.resolveCompilationUnit(source, library);
 
-  CompilationUnit resolveSource(String sourceText) {
-    Source source = addSource(sourceText);
+  CompilationUnit resolveSource(String sourceText) => resolveSource2("/test.dart", sourceText);
+
+  CompilationUnit resolveSource2(String fileName, String sourceText) {
+    Source source = addNamedSource(fileName, sourceText);
     LibraryElement library = analysisContext.computeLibraryElement(source);
     return analysisContext.resolveCompilationUnit(source, library);
   }
 
+  Source resolveSources(List<String> sourceTexts) {
+    for (int i = 0; i < sourceTexts.length; i++) {
+      CompilationUnit unit = resolveSource2("/lib${(i + 1)}.dart", sourceTexts[i]);
+      // reference the source if this is the last source
+      if (i + 1 == sourceTexts.length) {
+        return unit.element.source;
+      }
+    }
+    return null;
+  }
+
+  void resolveWithAndWithoutExperimental(List<String> strSources, List<ErrorCode> codesWithoutExperimental, List<ErrorCode> codesWithExperimental) {
+    // Setup analysis context as non-experimental
+    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
+    options.enableDeferredLoading = false;
+    resetWithOptions(options);
+    // Analysis and assertions
+    Source source = resolveSources(strSources);
+    assertErrors(source, codesWithoutExperimental);
+    verify([source]);
+    // Setup analysis context as experimental
+    reset();
+    // Analysis and assertions
+    source = resolveSources(strSources);
+    assertErrors(source, codesWithExperimental);
+    verify([source]);
+  }
+
   @override
   void tearDown() {
     _analysisContext = null;
@@ -18531,17 +17795,25 @@
   }
 
   void test_metadata_class() {
-    Source source = addSource(EngineTestCase.createSource(["const A = null;", "@A class C {}"]));
+    Source source = addSource(EngineTestCase.createSource(["const A = null;", "@A class C<A> {}"]));
     LibraryElement library = resolve(source);
     JUnitTestCase.assertNotNull(library);
-    CompilationUnitElement unit = library.definingCompilationUnit;
-    JUnitTestCase.assertNotNull(unit);
-    List<ClassElement> classes = unit.types;
+    CompilationUnitElement unitElement = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unitElement);
+    List<ClassElement> classes = unitElement.types;
     EngineTestCase.assertLength(1, classes);
     List<ElementAnnotation> annotations = classes[0].metadata;
     EngineTestCase.assertLength(1, annotations);
     assertNoErrors(source);
     verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    EngineTestCase.assertSizeOfList(2, declarations);
+    Element expectedElement = (declarations[0] as TopLevelVariableDeclaration).variables.variables[0].name.staticElement;
+    EngineTestCase.assertInstanceOf((obj) => obj is PropertyInducingElement, PropertyInducingElement, expectedElement);
+    expectedElement = (expectedElement as PropertyInducingElement).getter;
+    Element actualElement = (declarations[1] as ClassDeclaration).metadata[0].name.staticElement;
+    JUnitTestCase.assertSame(expectedElement, actualElement);
   }
 
   void test_metadata_field() {
@@ -18687,6 +17959,28 @@
     verify([source]);
   }
 
+  void test_metadata_typedef() {
+    Source source = addSource(EngineTestCase.createSource(["const A = null;", "@A typedef F<A>();"]));
+    LibraryElement library = resolve(source);
+    JUnitTestCase.assertNotNull(library);
+    CompilationUnitElement unitElement = library.definingCompilationUnit;
+    JUnitTestCase.assertNotNull(unitElement);
+    List<FunctionTypeAliasElement> aliases = unitElement.functionTypeAliases;
+    EngineTestCase.assertLength(1, aliases);
+    List<ElementAnnotation> annotations = aliases[0].metadata;
+    EngineTestCase.assertLength(1, annotations);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    NodeList<CompilationUnitMember> declarations = unit.declarations;
+    EngineTestCase.assertSizeOfList(2, declarations);
+    Element expectedElement = (declarations[0] as TopLevelVariableDeclaration).variables.variables[0].name.staticElement;
+    EngineTestCase.assertInstanceOf((obj) => obj is PropertyInducingElement, PropertyInducingElement, expectedElement);
+    expectedElement = (expectedElement as PropertyInducingElement).getter;
+    Element actualElement = (declarations[1] as FunctionTypeAlias).metadata[0].name.staticElement;
+    JUnitTestCase.assertSame(expectedElement, actualElement);
+  }
+
   void test_method_fromMixin() {
     Source source = addSource(EngineTestCase.createSource([
         "class B {",
@@ -19027,6 +18321,10 @@
         final __test = new SimpleResolverTest();
         runJUnitTest(__test, __test.test_metadata_simpleParameter);
       });
+      _ut.test('test_metadata_typedef', () {
+        final __test = new SimpleResolverTest();
+        runJUnitTest(__test, __test.test_metadata_typedef);
+      });
       _ut.test('test_methodCascades', () {
         final __test = new SimpleResolverTest();
         runJUnitTest(__test, __test.test_methodCascades);
@@ -20541,9 +19839,7 @@
     addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "f() {}"]));
     addNamedSource("/lib2.dart", EngineTestCase.createSource(["library lib2;", "f() {}"]));
     resolve(source);
-    assertErrors(source, [
-        StaticWarningCode.AMBIGUOUS_IMPORT,
-        StaticTypeWarningCode.UNDEFINED_FUNCTION]);
+    assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
   }
 
   void test_expectedOneListTypeArgument() {
@@ -23383,14 +22679,14 @@
   }
 
   void test_importOfNonLibrary() {
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["part of lib;", "class A {}"]),
+        EngineTestCase.createSource([
         "library lib;",
-        "import 'part.dart' deferred as p;",
-        "var a = new p.A();"]));
-    addNamedSource("/part.dart", EngineTestCase.createSource(["part of lib;", "class A {}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.IMPORT_OF_NON_LIBRARY]);
-    verify([source]);
+        "import 'lib1.dart' deferred as p;",
+        "var a = new p.A();"])], <ErrorCode> [
+        CompileTimeErrorCode.IMPORT_OF_NON_LIBRARY,
+        ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.IMPORT_OF_NON_LIBRARY]);
   }
 
   void test_inconsistentMethodInheritanceGetterAndMethod() {
@@ -24678,152 +23974,128 @@
   }
 
   void test_typeAnnotationDeferredClass_asExpression() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "f(var v) {",
         "  v as a.A;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_catchClause() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "f(var v) {",
         "  try {",
         "  } on a.A {",
         "  }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_fieldFormalParameter() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "class C {",
         "  var v;",
         "  C(a.A this.v);",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_functionDeclaration_returnType() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
-        "a.A f() { return null; }"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
+        "a.A f() { return null; }"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
-        "f(a.A g()) {}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
+        "f(a.A g()) {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_isExpression() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "f(var v) {",
         "  bool b = v is a.A;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_methodDeclaration_returnType() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "class C {",
         "  a.A m() { return null; }",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
+        "}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_simpleFormalParameter() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
-        "f(a.A v) {}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
+        "f(a.A v) {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_typeArgumentList() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "class C<E> {}",
-        "C<a.A> c;"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
+        "C<a.A> c;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_typeArgumentList2() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
         "class C<E, F> {}",
-        "C<a.A, a.A> c;"]));
-    resolve(source);
-    assertErrors(source, [
+        "C<a.A, a.A> c;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [
         StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS,
         StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
   }
 
   void test_typeAnnotationDeferredClass_typeParameter_bound() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
-        "class C<E extends a.A> {}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
+        "class C<E extends a.A> {}"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeAnnotationDeferredClass_variableDeclarationList() {
-    addNamedSource("/lib1.dart", EngineTestCase.createSource(["library lib1;", "class A {}"]));
-    Source source = addSource(EngineTestCase.createSource([
+    resolveWithAndWithoutExperimental(<String> [
+        EngineTestCase.createSource(["library lib1;", "class A {}"]),
+        EngineTestCase.createSource([
         "library root;",
         "import 'lib1.dart' deferred as a;",
-        "a.A v;"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
-    verify([source]);
+        "a.A v;"])], <ErrorCode> [ParserErrorCode.DEFERRED_IMPORTS_NOT_SUPPORTED], <ErrorCode> [StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS]);
   }
 
   void test_typeParameterReferencedByStatic_field() {
@@ -26960,6 +26232,21 @@
     }
   }
 
+  void test_CanvasElement_getContext() {
+    String code = EngineTestCase.createSource([
+        "import 'dart:html';",
+        "main(CanvasElement canvas) {",
+        "  var context = canvas.getContext('2d');",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "context", (node) => node is SimpleIdentifier);
+    JUnitTestCase.assertEquals("CanvasRenderingContext2D", identifier.propagatedType.name);
+  }
+
   void test_forEach() {
     String code = EngineTestCase.createSource([
         "main() {",
@@ -27702,6 +26989,10 @@
 
   static dartSuite() {
     _ut.group('TypePropagationTest', () {
+      _ut.test('test_CanvasElement_getContext', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_CanvasElement_getContext);
+      });
       _ut.test('test_Future_then', () {
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_Future_then);
@@ -28350,7 +27641,6 @@
 //  ScopeBuilderTest.dartSuite();
 //  ScopeTest.dartSuite();
 //  CompileTimeErrorCodeTest.dartSuite();
-//  DeferredLoadingTest.dartSuite();
 //  ErrorResolverTest.dartSuite();
 //  HintCodeTest.dartSuite();
 //  MemberMapTest.dartSuite();
diff --git a/pkg/analyzer/test/options_test.dart b/pkg/analyzer/test/options_test.dart
index b9fdfa2..96270a9 100644
--- a/pkg/analyzer/test/options_test.dart
+++ b/pkg/analyzer/test/options_test.dart
@@ -35,6 +35,19 @@
       expect(options.shouldBatch, isTrue);
     });
 
+    test('defined variables', () {
+      CommandLineOptions options = CommandLineOptions
+          .parse(['--dart-sdk', '.', '-Dfoo=bar', 'foo.dart']);
+      expect(options.definedVariables['foo'], equals('bar'));
+      expect(options.definedVariables['bar'], isNull);
+    });
+
+    test('log', () {
+      CommandLineOptions options = CommandLineOptions
+          .parse(['--dart-sdk', '.', '--log', 'foo.dart']);
+      expect(options.log, isTrue);
+    });
+
     test('machine format', () {
       CommandLineOptions options = CommandLineOptions
           .parse(['--dart-sdk', '.', '--format=machine', 'foo.dart']);
@@ -47,10 +60,10 @@
       expect(options.disableHints, isTrue);
     });
 
-    test('perf', () {
+    test('package root', () {
       CommandLineOptions options = CommandLineOptions
-          .parse(['--dart-sdk', '.', '--perf', 'foo.dart']);
-      expect(options.perf, isTrue);
+          .parse(['--dart-sdk', '.', '-p', 'bar', 'foo.dart']);
+      expect(options.packageRootPath, equals('bar'));
     });
 
     test('package warnings', () {
@@ -59,36 +72,30 @@
       expect(options.showPackageWarnings, isTrue);
     });
 
+    test('perf', () {
+      CommandLineOptions options = CommandLineOptions
+          .parse(['--dart-sdk', '.', '--perf', 'foo.dart']);
+      expect(options.perf, isTrue);
+    });
+
     test('sdk warnings', () {
       CommandLineOptions options = CommandLineOptions
           .parse(['--dart-sdk', '.', '--warnings', 'foo.dart']);
       expect(options.showSdkWarnings, isTrue);
     });
 
-    test('warningsAreFatal', () {
-      CommandLineOptions options = CommandLineOptions
-          .parse(['--dart-sdk', '.', '--fatal-warnings', 'foo.dart']);
-      expect(options.warningsAreFatal, isTrue);
-    });
-
-    test('package root', () {
-      CommandLineOptions options = CommandLineOptions
-          .parse(['--dart-sdk', '.', '-p', 'bar', 'foo.dart']);
-      expect(options.packageRootPath, equals('bar'));
-    });
-
-    test('log', () {
-      CommandLineOptions options = CommandLineOptions
-          .parse(['--dart-sdk', '.', '--log', 'foo.dart']);
-      expect(options.log, isTrue);
-    });
-
     test('sourceFiles', () {
       CommandLineOptions options = CommandLineOptions
           .parse(['--dart-sdk', '.', '--log', 'foo.dart', 'foo2.dart', 'foo3.dart']);
       expect(options.sourceFiles, equals(['foo.dart', 'foo2.dart', 'foo3.dart']));
     });
 
+    test('warningsAreFatal', () {
+      CommandLineOptions options = CommandLineOptions
+          .parse(['--dart-sdk', '.', '--fatal-warnings', 'foo.dart']);
+      expect(options.warningsAreFatal, isTrue);
+    });
+
 //    test('notice unrecognized flags', () {
 //      CommandLineOptions options = new CommandLineOptions.parse(['--bar', '--baz',
 //        'foo.dart']);
diff --git a/pkg/async/README.md b/pkg/async/README.md
index dc34553..73a40f4 100644
--- a/pkg/async/README.md
+++ b/pkg/async/README.md
@@ -4,8 +4,16 @@
 
 ### Zipping streams
 
-The "stream_zip.dart" sub-library contains functionality to combine several streams
-of events into a single stream of tuples of events.
+The "stream_zip.dart" sub-library contains functionality
+to combine several streams of events into a single stream of tuples of events.
+
+### Results
+The "result.dart" sub-library introduces a `Result` class that can hold either
+a value or an error.
+It allows capturing an asynchronous computation which can give either a value
+or an error, into an asynchronous computation that always gives a `Result`
+value, where errors can be treated as data.
+It also allows releasing the `Result` back into an asynchronous computation.
 
 ### History.
 This package is unrelated to the discontinued `async` package with version 0.1.7.
diff --git a/pkg/async/lib/async.dart b/pkg/async/lib/async.dart
index e9d6544..69c7a28 100644
--- a/pkg/async/lib/async.dart
+++ b/pkg/async/lib/async.dart
@@ -5,3 +5,4 @@
 library dart.pkg.async;
 
 export "stream_zip.dart";
+export "result.dart";
diff --git a/pkg/async/lib/result.dart b/pkg/async/lib/result.dart
new file mode 100644
index 0000000..db04ae7
--- /dev/null
+++ b/pkg/async/lib/result.dart
@@ -0,0 +1,291 @@
+// 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.
+
+/**
+ * Capture asynchronous results into synchronous values, and release them again.
+ *
+ * Capturing a result (either a returned value or a thrown error)
+ * means converting it into a [Result] -
+ * either a [ValueResult] or an [ErrorResult].
+ *
+ * This value can release itself by writing itself either to a
+ * [EventSink] or a [Completer], or by becoming a [Future].
+ */
+library dart.pkg.async.results;
+
+import "dart:async";
+
+/**
+ * The result of a computation.
+ */
+abstract class Result<T> {
+  /**
+   * Create a `Result` with the result of calling [computation].
+   *
+   * This generates either a [ValueResult] with the value returned by
+   * calling `computation`, or an [ErrorResult] with an error thrown by
+   * the call.
+   */
+  factory Result(T computation()) {
+    try {
+      return new ValueResult(computation());
+    } catch (e, s) {
+      return new ErrorResult(e, s);
+    }
+  }
+
+  /**
+   * Create a `Result` holding a value.
+   *
+   * Alias for [ValueResult.ValueResult].
+   */
+  factory Result.value(T value) = ValueResult<T>;
+
+  /**
+   * Create a `Result` holding an error.
+   *
+   * Alias for [ErrorResult.ErrorResult].
+   */
+  factory Result.error(Object error, [StackTrace stackTrace]) =>
+      new ErrorResult(error, stackTrace);
+
+  // Helper functions.
+  static _captureValue(value) => new ValueResult(value);
+  static _captureError(error, stack) => new ErrorResult(error, stack);
+  static _release(Result v) {
+    if (v.isValue) return v.asValue.value;  // Avoid wrapping in future.
+    return v.asFuture;
+  }
+
+  /**
+   * Capture the result of a future into a `Result` future.
+   *
+   * The resulting future will never have an error.
+   * Errors have been converted to an [ErrorResult] value.
+   */
+  static Future<Result> capture(Future future) {
+    return future.then(_captureValue, onError: _captureError);
+  }
+
+  /**
+   * Release the result of a captured future.
+   *
+   * Converts the [Result] value of the given [future] to a value or error
+   * completion of the returned future.
+   *
+   * If [future] completes with an error, the returned future completes with
+   * the same error.
+   */
+  static Future release(Future<Result> future) {
+    return future.then(_release);
+  }
+
+  /**
+   * Capture the results of a stream into a stream of [Result] values.
+   *
+   * The returned stream will not have any error events.
+   * Errors from the source stream have been converted to [ErrorResult]s.
+   *
+   * Shorthand for transforming the stream using [CaptureStreamTransformer].
+   */
+  static Stream<Result> captureStream(Stream source) {
+    return source.transform(const CaptureStreamTransformer());
+  }
+
+  /**
+   * Release a stream of [result] values into a stream of the results.
+   *
+   * `Result` values of the source stream become value or error events in
+   * the retuned stream as appropriate.
+   * Errors from the source stream become errors in the returned stream.
+   *
+   * Shorthand for transforming the stream using [ReleaseStreamTransformer].
+   */
+  static Stream releaseStream(Stream<Result> source) {
+    return source.transform(const ReleaseStreamTransformer());
+  }
+
+  /**
+   * Converts a result of a result to a single result.
+   *
+   * If the result is an error, or it is a `Result` value
+   * which is then an error, then a result with that error is returned.
+   * Otherwise both levels of results are value results, and a single
+   * result with the value is returned.
+   */
+  static Result flatten(Result<Result> result) {
+    if (result.isError) return result;
+    return result.asValue.value;
+  }
+
+  /**
+   * Whether this result is a value result.
+   *
+   * Always the opposite of [isError].
+   */
+  bool get isValue;
+
+  /**
+   * Whether this result is an error result.
+   *
+   * Always the opposite of [isValue].
+   */
+  bool get isError;
+
+  /**
+   * If this is a value result, return itself.
+   *
+   * Otherwise return `null`.
+   */
+  ValueResult<T> get asValue;
+
+  /**
+   * If this is an error result, return itself.
+   *
+   * Otherwise return `null`.
+   */
+  ErrorResult get asError;
+
+  /**
+   * Complete a completer with this result.
+   */
+  void complete(Completer<T> completer);
+
+  /**
+   * Add this result to a [StreamSink].
+   */
+  void addTo(EventSink<T> sink);
+
+  /**
+   * Creates a future completed with this result as a value or an error.
+   */
+  Future<T> get asFuture;
+}
+
+/**
+ * A result representing a returned value.
+ */
+class ValueResult<T> implements Result<T> {
+  /** The returned value that this result represents. */
+  final T value;
+  /** Create a value result with the given [value]. */
+  ValueResult(this.value);
+  bool get isValue => true;
+  bool get isError => false;
+  ValueResult<T> get asValue => this;
+  ErrorResult get asError => null;
+  void complete(Completer<T> completer) {
+    completer.complete(value);
+  }
+  void addTo(EventSink<T> sink) {
+    sink.add(value);
+  }
+  Future<T> get asFuture => new Future.value(value);
+}
+
+/**
+ * A result representing a thrown error.
+ */
+class ErrorResult implements Result {
+  /** The thrown object that this result represents. */
+  final error;
+  /** The stack trace, if any, associated with the throw. */
+  final StackTrace stackTrace;
+  /** Create an error result with the given [error] and [stackTrace]. */
+  ErrorResult(this.error, this.stackTrace);
+  bool get isValue => false;
+  bool get isError => true;
+  ValueResult get asValue => null;
+  ErrorResult get asError => this;
+  void complete(Completer completer) {
+    completer.completeError(error, stackTrace);
+  }
+  void addTo(EventSink sink) {
+    sink.addError(error, stackTrace);
+  }
+  Future get asFuture => new Future.error(error, stackTrace);
+}
+
+/**
+ * A stream transformer that captures a stream of events into [Result]s.
+ *
+ * The result of the transformation is a stream of [Result] values and
+ * no error events.
+ */
+class CaptureStreamTransformer<T> implements StreamTransformer<T, Result<T>> {
+  const CaptureStreamTransformer();
+
+  Stream<Result<T>> bind(Stream<T> source) {
+    return new Stream<Result<T>>.eventTransformed(source, _createSink);
+  }
+
+  static EventSink _createSink(EventSink<Result> sink) {
+    return new CaptureSink(sink);
+  }
+}
+
+/**
+ * A stream transformer that releases a stream of result events.
+ *
+ * The result of the transformation is a stream of values and
+ * error events.
+ */
+class ReleaseStreamTransformer<T> implements StreamTransformer<Result<T>, T> {
+  const ReleaseStreamTransformer();
+
+  Stream<T> bind(Stream<Result<T>> source) {
+    return new Stream<T>.eventTransformed(source, _createSink);
+  }
+
+  static EventSink<Result> _createSink(EventSink sink) {
+    return new ReleaseSink(sink);
+  }
+}
+
+/**
+ * An event sink wrapper that captures the incoming events.
+ *
+ * Wraps an [EventSink] that expects [Result] values.
+ * Accepts any value and error result,
+ * and passes them to the wrapped sink as [Result] values.
+ *
+ * The wrapped sink will never receive an error event.
+ */
+class CaptureSink<T> implements EventSink<T> {
+  final EventSink _sink;
+
+  CaptureSink(EventSink<Result<T>> sink) : _sink = sink;
+  void add(T value) { _sink.add(new ValueResult(value)); }
+  void addError(Object error, [StackTrace stackTrace]) {
+    _sink.add(new ErrorResult(error, stackTrace));
+  }
+  void close() { _sink.close(); }
+}
+
+/**
+ * An event sink wrapper that releases the incoming result events.
+ *
+ * Wraps an output [EventSink] that expects any result.
+ * Accepts [Result] values, and puts the result value or error into the
+ * corresponding output sink add method.
+ */
+class ReleaseSink<T> implements EventSink<Result<T>> {
+  final EventSink _sink;
+  ReleaseSink(EventSink<T> sink) : _sink = sink;
+  void add(Result<T> result) {
+    if (result.isValue) {
+      _sink.add(result.asValue.value);
+    } else {
+      ErrorResult error = result.asError;
+      _sink.addError(error.error, error.stackTrace);
+    }
+  }
+  void addError(Object error, [StackTrace stackTrace]) {
+    // Errors may be added by intermediate processing, even if it is never
+    // added by CaptureSink.
+    _sink.addError(error, stackTrace);
+  }
+
+  void close() { _sink.close(); }
+}
diff --git a/pkg/async/pubspec.yaml b/pkg/async/pubspec.yaml
index f3442c2..65539f9 100644
--- a/pkg/async/pubspec.yaml
+++ b/pkg/async/pubspec.yaml
@@ -1,5 +1,5 @@
 name: async
-version: 0.9.1+1
+version: 1.0.0
 author: Dart Team <misc@dartlang.org>
 description: Utility functions and classes related to the 'dart:async' library.
 homepage: http://www.dartlang.org
diff --git a/pkg/async/test/result_test.dart b/pkg/async/test/result_test.dart
new file mode 100644
index 0000000..0f2ae0a
--- /dev/null
+++ b/pkg/async/test/result_test.dart
@@ -0,0 +1,286 @@
+// 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:collection";
+import "package:async/result.dart";
+import "package:unittest/unittest.dart";
+
+void main() {
+  StackTrace stack;
+  try { throw 0; } catch (e, s) { stack = s; }
+
+  test("create result value", () {
+    Result<int> result = new Result<int>.value(42);
+    expect(result.isValue, isTrue);
+    expect(result.isError, isFalse);
+    ValueResult value = result.asValue;
+    expect(value.value, equals(42));
+  });
+
+  test("create result value 2", () {
+    Result<int> result = new ValueResult<int>(42);
+    expect(result.isValue, isTrue);
+    expect(result.isError, isFalse);
+    ValueResult<int> value = result.asValue;
+    expect(value.value, equals(42));
+  });
+
+  test("create result error", () {
+    Result<bool> result = new Result<bool>.error("BAD", stack);
+    expect(result.isValue, isFalse);
+    expect(result.isError, isTrue);
+    ErrorResult error = result.asError;
+    expect(error.error, equals("BAD"));
+    expect(error.stackTrace, same(stack));
+  });
+
+  test("create result error 2", () {
+    Result<bool> result = new ErrorResult("BAD", stack);
+    expect(result.isValue, isFalse);
+    expect(result.isError, isTrue);
+    ErrorResult error = result.asError;
+    expect(error.error, equals("BAD"));
+    expect(error.stackTrace, same(stack));
+  });
+
+  test("create result error no stack", () {
+    Result<bool> result = new Result<bool>.error("BAD");
+    expect(result.isValue, isFalse);
+    expect(result.isError, isTrue);
+    ErrorResult error = result.asError;
+    expect(error.error, equals("BAD"));
+    expect(error.stackTrace, isNull);
+  });
+
+  test("complete with value", () {
+    Result<int> result = new ValueResult<int>(42);
+    Completer c = new Completer<int>();
+    c.future.then(expectAsync((int v) { expect(v, equals(42)); }),
+                  onError: (e, s) { fail("Unexpected error"); });
+    result.complete(c);
+  });
+
+  test("complete with error", () {
+    Result<bool> result = new ErrorResult("BAD", stack);
+    Completer c = new Completer<bool>();
+    c.future.then((bool v) { fail("Unexpected value $v"); },
+                  onError: expectAsync((e, s) {
+                    expect(e, equals("BAD"));
+                    expect(s, same(stack));
+                  }));
+    result.complete(c);
+  });
+
+  test("add sink value", () {
+    Result<int> result = new ValueResult<int>(42);
+    EventSink<int> sink = new TestSink(
+        onData: expectAsync((v) { expect(v, equals(42)); })
+    );
+    result.addTo(sink);
+  });
+
+  test("add sink error", () {
+    Result<bool> result = new ErrorResult("BAD", stack);
+    EventSink<bool> sink = new TestSink(
+        onError: expectAsync((e, s) {
+          expect(e, equals("BAD"));
+          expect(s, same(stack));
+        })
+    );
+    result.addTo(sink);
+  });
+
+  test("value as future", () {
+    Result<int> result = new ValueResult<int>(42);
+    result.asFuture.then(expectAsync((int v) { expect(v, equals(42)); }),
+                         onError: (e, s) { fail("Unexpected error"); });
+  });
+
+  test("error as future", () {
+    Result<bool> result = new ErrorResult("BAD", stack);
+    result.asFuture.then((bool v) { fail("Unexpected value $v"); },
+                         onError: expectAsync((e, s) {
+                           expect(e, equals("BAD"));
+                           expect(s, same(stack));
+                         }));
+  });
+
+  test("capture future value", () {
+    Future<int> value = new Future<int>.value(42);
+    Result.capture(value).then(expectAsync((Result result) {
+      expect(result.isValue, isTrue);
+      expect(result.isError, isFalse);
+      ValueResult value = result.asValue;
+      expect(value.value, equals(42));
+    }), onError: (e, s) {
+      fail("Unexpected error: $e");
+    });
+  });
+
+  test("capture future error", () {
+    Future<bool> value = new Future<bool>.error("BAD", stack);
+    Result.capture(value).then(expectAsync((Result result) {
+      expect(result.isValue, isFalse);
+      expect(result.isError, isTrue);
+      ErrorResult error = result.asError;
+      expect(error.error, equals("BAD"));
+      expect(error.stackTrace, same(stack));
+    }), onError: (e, s) {
+      fail("Unexpected error: $e");
+    });
+  });
+
+  test("release future value", () {
+    Future<Result<int>> future =
+        new Future<Result<int>>.value(new Result<int>.value(42));
+    Result.release(future).then(expectAsync((v) {
+      expect(v, equals(42));
+    }), onError: (e, s) {
+      fail("Unexpected error: $e");
+    });
+  });
+
+  test("release future error", () {
+    // An error in the result is unwrapped and reified by release.
+    Future<Result<bool>> future =
+        new Future<Result<bool>>.value(new Result<bool>.error("BAD", stack));
+    Result.release(future).then((v) {
+      fail("Unexpected value: $v");
+    }, onError: expectAsync((e, s) {
+      expect(e, equals("BAD"));
+      expect(s, same(stack));
+    }));
+  });
+
+  test("release future real error", () {
+    // An error in the error lane is passed through by release.
+    Future<Result<bool>> future = new Future<Result<bool>>.error("BAD", stack);
+    Result.release(future).then((v) {
+      fail("Unexpected value: $v");
+    }, onError: expectAsync((e, s) {
+      expect(e, equals("BAD"));
+      expect(s, same(stack));
+    }));
+  });
+
+  test("capture stream", () {
+    StreamController<int> c = new StreamController<int>();
+    Stream<Result> stream = Result.captureStream(c.stream);
+    var expectedList = new Queue.from([new Result.value(42),
+                                       new Result.error("BAD", stack),
+                                       new Result.value(37)]);
+    void listener(Result actual) {
+      expect(expectedList.isEmpty, isFalse);
+      expectResult(actual, expectedList.removeFirst());
+    }
+    stream.listen(expectAsync(listener, count: 3),
+                  onError: (e, s) { fail("Unexpected error: $e"); },
+                  onDone: expectAsync((){}),
+                  cancelOnError: true);
+    c.add(42);
+    c.addError("BAD", stack);
+    c.add(37);
+    c.close();
+  });
+
+  test("release stream", () {
+    StreamController<Result<int>> c = new StreamController<Result<int>>();
+    Stream<int> stream = Result.releaseStream(c.stream);
+    List events = [new Result<int>.value(42),
+                   new Result<int>.error("BAD", stack),
+                   new Result<int>.value(37)];
+    // Expect the data events, and an extra error event.
+    var expectedList = new Queue.from(events)..add(new Result.error("BAD2"));
+    void dataListener(int v) {
+      expect(expectedList.isEmpty, isFalse);
+      Result expected = expectedList.removeFirst();
+      expect(expected.isValue, isTrue);
+      expect(v, equals(expected.asValue.value));
+    }
+    void errorListener(error, StackTrace stackTrace) {
+      expect(expectedList.isEmpty, isFalse);
+      Result expected = expectedList.removeFirst();
+      expect(expected.isError, isTrue);
+      expect(error, equals(expected.asError.error));
+      expect(stackTrace, same(expected.asError.stackTrace));
+    }
+    stream.listen(expectAsync(dataListener, count: 2),
+                  onError: expectAsync(errorListener, count: 2),
+                  onDone: expectAsync((){}));
+    for (Result<int> result in events) {
+      c.add(result);  // Result value or error in data line.
+    }
+    c.addError("BAD2");  // Error in error line.
+    c.close();
+  });
+
+  test("release stream cancel on error", () {
+    StreamController<Result<int>> c = new StreamController<Result<int>>();
+    Stream<int> stream = Result.releaseStream(c.stream);
+    stream.listen(expectAsync((v) { expect(v, equals(42)); }),
+                  onError: expectAsync((e, s) {
+                    expect(e, equals("BAD"));
+                    expect(s, same(stack));
+                  }),
+                  onDone: () { fail("Unexpected done event"); },
+                  cancelOnError: true);
+    c.add(new Result.value(42));
+    c.add(new Result.error("BAD", stack));
+    c.add(new Result.value(37));
+    c.close();
+  });
+
+
+  test("flatten error 1", () {
+    Result<int> error = new Result<int>.error("BAD", stack);
+    Result<int> flattened =
+        Result.flatten(new Result<Result<int>>.error("BAD", stack));
+    expectResult(flattened, error);
+  });
+
+  test("flatten error 2", () {
+    Result<int> error = new Result<int>.error("BAD", stack);
+    Result<Result<int>> result = new Result<Result<int>>.value(error);
+    Result<int> flattened = Result.flatten(result);
+    expectResult(flattened, error);
+  });
+
+  test("flatten value", () {
+    Result<Result<int>> result =
+        new Result<Result<int>>.value(new Result<int>.value(42));
+    expectResult(Result.flatten(result), new Result<int>.value(42));
+  });
+}
+
+void expectResult(Result actual, Result expected) {
+  expect(actual.isValue, equals(expected.isValue));
+  expect(actual.isError, equals(expected.isError));
+  if (actual.isValue) {
+    expect(actual.asValue.value, equals(expected.asValue.value));
+  } else {
+    expect(actual.asError.error, equals(expected.asError.error));
+    expect(actual.asError.stackTrace, same(expected.asError.stackTrace));
+  }
+}
+
+class TestSink<T> implements EventSink<T> {
+  final Function onData;
+  final Function onError;
+  final Function onDone;
+
+  TestSink({void this.onData(T data) : _nullData,
+            void this.onError(e, StackTrace s) : _nullError,
+            void this.onDone() : _nullDone });
+
+  void add(T value) { onData(value); }
+  void addError(error, [StackTrace stack]) { onError(error, stack); }
+  void close() { onDone(); }
+
+  static void _nullData(value) { fail("Unexpected sink add: $value"); }
+  static void _nullError(e, StackTrace s) {
+    fail("Unexpected sink addError: $e");
+  }
+  static void _nullDone() { fail("Unepxected sink close"); }
+}
diff --git a/pkg/code_transformers/lib/assets.dart b/pkg/code_transformers/lib/assets.dart
index 4bafc26..9a76c87 100644
--- a/pkg/code_transformers/lib/assets.dart
+++ b/pkg/code_transformers/lib/assets.dart
@@ -64,6 +64,8 @@
       // web/, test/, example/, etc) are resolved as an asset in another
       // package. 'packages' can be used anywhere, there is no need to walk up
       // where the entrypoint file was.
+      // TODO(sigmund): this needs to change: Only resolve when index == 1 &&
+      // topFolder == segment[0], otherwise give a warning (dartbug.com/17596).
       return _extractOtherPackageId(index, segments, logger, span);
     } else if (index == 1 && segments[0] == '..') {
       // Relative URLs of the form "../../packages/foo/bar" in an asset under
diff --git a/pkg/collection/lib/wrappers.dart b/pkg/collection/lib/wrappers.dart
index c9e919d..2034174 100644
--- a/pkg/collection/lib/wrappers.dart
+++ b/pkg/collection/lib/wrappers.dart
@@ -254,6 +254,8 @@
   }
 
   Set<E> union(Set<E> other) => _setBase.union(other);
+
+  Set<E> toSet() => new DelegatingSet<E>(_setBase.toSet());
 }
 
 /**
diff --git a/pkg/collection/pubspec.yaml b/pkg/collection/pubspec.yaml
index 45cf9b7..e0d1097 100644
--- a/pkg/collection/pubspec.yaml
+++ b/pkg/collection/pubspec.yaml
@@ -1,5 +1,5 @@
 name: collection
-version: 0.9.3-dev
+version: 0.9.3
 author: Dart Team <misc@dartlang.org>
 description: Collections and utilities functions and classes related to collections.
 homepage: http://www.dartlang.org
diff --git a/pkg/csslib/pubspec.yaml b/pkg/csslib/pubspec.yaml
index 509771d..66240e7 100644
--- a/pkg/csslib/pubspec.yaml
+++ b/pkg/csslib/pubspec.yaml
@@ -1,5 +1,5 @@
 name: csslib
-version: 0.10.0-dev
+version: 0.10.0
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: A library for parsing CSS.
 homepage: https://www.dartlang.org
diff --git a/pkg/http_base/CHANGELOG.md b/pkg/http_base/CHANGELOG.md
new file mode 100644
index 0000000..64312a4
--- /dev/null
+++ b/pkg/http_base/CHANGELOG.md
@@ -0,0 +1,2 @@
+# 0.0.1
+
diff --git a/pkg/http_base/LICENSE b/pkg/http_base/LICENSE
new file mode 100644
index 0000000..5c60afe
--- /dev/null
+++ b/pkg/http_base/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2014, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/http_base/README.md b/pkg/http_base/README.md
new file mode 100644
index 0000000..ca7b74b
--- /dev/null
+++ b/pkg/http_base/README.md
@@ -0,0 +1,2 @@
+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
new file mode 100644
index 0000000..d05812e
--- /dev/null
+++ b/pkg/http_base/lib/http_base.dart
@@ -0,0 +1,126 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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';
+
+/**
+ * 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 `IllegalArgument`.
+   * 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.
+   */
+  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 status;
+
+  /**
+   * Response headers.
+   */
+  Headers get headers;
+
+  /**
+   * Response body.
+   */
+  Stream<List<int>> read();
+}
+
+
+
+/**
+ * Function for performing a HTTP request.
+ *
+ * The [Client] may use any transport mechanism it wants
+ * (e.g. HTTP/1.1, HTTP/2.0, SPDY) to perform the HTTP request.
+ *
+ * [Client]s are composable. E.g. A [Client] may add an 'Authorization'
+ * header to [request] and forward to another [Client].
+ *
+ * A [Client] 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> Client(Request request);
+
+/**
+ * Function for handling a HTTP request.
+ *
+ * The [RequestHandler] should not react on any connection specific headers
+ * in [request] and connection specific headers in it's [Response] may be
+ * ignored by a HTTP Server.
+ *
+ * [RequestHandler]s are composable. E.g. A [RequestHandler] may call another
+ * [RequestHandler] and augment the headers with e.g. a 'Set-Cookie' header.
+ *
+ * Connection specific headers:
+ *    'Connection', 'Upgrade', 'Keep-Alive', 'Transfer-Encoding'
+ */
+typedef Future<Response> HttpRequestHandler(Request request);
diff --git a/pkg/http_base/pubspec.yaml b/pkg/http_base/pubspec.yaml
new file mode 100644
index 0000000..d9f115a
--- /dev/null
+++ b/pkg/http_base/pubspec.yaml
@@ -0,0 +1,10 @@
+name: http_base
+version: 0.0.1
+author: Dart Team <misc@dartlang.org>
+homepage: http://www.dartlang.org
+description: >
+  A library with common interfaces for HTTP request objects, HTTP response
+  objects, HTTP clients and HTTP request handlers.
+environment:
+  sdk: '>=1.0.0 <2.0.0'
+
diff --git a/pkg/mime/lib/src/default_extension_map.dart b/pkg/mime/lib/src/default_extension_map.dart
index 7e74648..ae0d7df 100644
--- a/pkg/mime/lib/src/default_extension_map.dart
+++ b/pkg/mime/lib/src/default_extension_map.dart
@@ -4,8 +4,8 @@
 
 library mime.extension_map;
 
-// TODO(ajohnsen): Use sorted list and binary search?
-const Map<String, String> DEFAULT_EXTENSION_MAP = const <String, String>{
+// TODO(ajohnsen): Use const map once Issue 7559 is fixed.
+final Map<String, String> defaultExtensionMap = <String, String>{
 '123':'application/vnd.lotus-1-2-3',
 '3dml':'text/vnd.in3d.3dml',
 '3ds':'image/x-3ds',
diff --git a/pkg/mime/lib/src/magic_number.dart b/pkg/mime/lib/src/magic_number.dart
index 6c554aa..3efb2ee 100644
--- a/pkg/mime/lib/src/magic_number.dart
+++ b/pkg/mime/lib/src/magic_number.dart
@@ -27,6 +27,8 @@
 
 }
 
+const int DEFAULT_MAGIC_NUMBERS_MAX_LENGTH = 12;
+
 const List<MagicNumber> DEFAULT_MAGIC_NUMBERS = const [
   const MagicNumber('application/pdf', const [0x25, 0x50, 0x44, 0x46]),
   const MagicNumber('application/postscript', const [0x25, 0x51]),
diff --git a/pkg/mime/lib/src/mime_type.dart b/pkg/mime/lib/src/mime_type.dart
index ca4d6c5..744eead 100644
--- a/pkg/mime/lib/src/mime_type.dart
+++ b/pkg/mime/lib/src/mime_type.dart
@@ -12,8 +12,7 @@
 /**
  * The maximum number of bytes needed, to match all default magic-numbers.
  */
-// NOTE: this is not formatted AS_A_CONST to avoid a breaking change
-const int defaultMagicNumbersMaxLength = 12;
+int get defaultMagicNumbersMaxLength => _globalResolver.magicNumbersMaxLength;
 
 /**
  * Extract the extension from [path] and use that for MIME-type lookup, using
@@ -49,7 +48,7 @@
    */
   MimeTypeResolver() :
       _useDefault = true,
-      _magicNumbersMaxLength = defaultMagicNumbersMaxLength;
+      _magicNumbersMaxLength = DEFAULT_MAGIC_NUMBERS_MAX_LENGTH;
 
   /**
    * Get the maximum number of bytes required to match all magic numbers, when
@@ -82,7 +81,7 @@
     result = _extensionMap[ext];
     if (result != null) return result;
     if (_useDefault) {
-      result = DEFAULT_EXTENSION_MAP[ext];
+      result = defaultExtensionMap[ext];
       if (result != null) return result;
     }
     return null;
diff --git a/pkg/mime/pubspec.yaml b/pkg/mime/pubspec.yaml
index b44361b..54dc5a8 100644
--- a/pkg/mime/pubspec.yaml
+++ b/pkg/mime/pubspec.yaml
@@ -1,5 +1,5 @@
 name: mime
-version: 0.9.0+1
+version: 0.9.0+2
 author: Dart Team <misc@dartlang.org>
 description: Helper-package for working with MIME.
 homepage: http://www.dartlang.org
diff --git a/pkg/path/CHANGELOG.md b/pkg/path/CHANGELOG.md
index 0d48c07..22fc34f 100644
--- a/pkg/path/CHANGELOG.md
+++ b/pkg/path/CHANGELOG.md
@@ -1,3 +1,8 @@
+# 1.2.0
+
+* Added `path.prettyUri`, which produces a human-readable representation of a
+  URI.
+
 # 1.1.0
 
 * `path.fromUri` now accepts strings as well as `Uri` objects.
diff --git a/pkg/path/lib/path.dart b/pkg/path/lib/path.dart
index 524f16d..599a351 100644
--- a/pkg/path/lib/path.dart
+++ b/pkg/path/lib/path.dart
@@ -366,3 +366,26 @@
 ///     path.toUri('path/to/foo')
 ///       // -> Uri.parse('path/to/foo')
 Uri toUri(String path) => _context.toUri(path);
+
+/// Returns a terse, human-readable representation of [uri].
+///
+/// [uri] can be a [String] or a [Uri]. If it can be made relative to the
+/// current working directory, that's done. Otherwise, it's returned as-is. This
+/// gracefully handles non-`file:` URIs for [Style.posix] and [Style.windows].
+///
+/// The returned value is meant for human consumption, and may be either URI-
+/// or path-formatted.
+///
+///     // POSIX at "/root/path"
+///     path.prettyUri('file:///root/path/a/b.dart'); // -> 'a/b.dart'
+///     path.prettyUri('http://dartlang.org/'); // -> 'http://dartlang.org'
+///
+///     // Windows at "C:\root\path"
+///     path.prettyUri('file:///C:/root/path/a/b.dart'); // -> r'a\b.dart'
+///     path.prettyUri('http://dartlang.org/'); // -> 'http://dartlang.org'
+///
+///     // URL at "http://dartlang.org/root/path"
+///     path.prettyUri('http://dartlang.org/root/path/a/b.dart');
+///         // -> r'a/b.dart'
+///     path.prettyUri('file:///root/path'); // -> 'file:///root/path'
+String prettyUri(uri) => _context.prettyUri(uri);
diff --git a/pkg/path/lib/src/context.dart b/pkg/path/lib/src/context.dart
index 9c8e1e4..88ca61f 100644
--- a/pkg/path/lib/src/context.dart
+++ b/pkg/path/lib/src/context.dart
@@ -472,6 +472,48 @@
     }
   }
 
+  /// Returns a terse, human-readable representation of [uri].
+  ///
+  /// [uri] can be a [String] or a [Uri]. If it can be made relative to the
+  /// current working directory, that's done. Otherwise, it's returned as-is.
+  /// This gracefully handles non-`file:` URIs for [Style.posix] and
+  /// [Style.windows].
+  ///
+  /// The returned value is meant for human consumption, and may be either URI-
+  /// or path-formatted.
+  ///
+  ///     // POSIX
+  ///     var context = new Context(current: '/root/path');
+  ///     context.prettyUri('file:///root/path/a/b.dart'); // -> 'a/b.dart'
+  ///     context.prettyUri('http://dartlang.org/'); // -> 'http://dartlang.org'
+  ///
+  ///     // Windows
+  ///     var context = new Context(current: r'C:\root\path');
+  ///     context.prettyUri('file:///C:/root/path/a/b.dart'); // -> r'a\b.dart'
+  ///     context.prettyUri('http://dartlang.org/'); // -> 'http://dartlang.org'
+  ///
+  ///     // URL
+  ///     var context = new Context(current: 'http://dartlang.org/root/path');
+  ///     context.prettyUri('http://dartlang.org/root/path/a/b.dart');
+  ///         // -> r'a/b.dart'
+  ///     context.prettyUri('file:///root/path'); // -> 'file:///root/path'
+  String prettyUri(uri) {
+    if (uri is String) uri = Uri.parse(uri);
+    if (uri.scheme == 'file' && style == Style.url) return uri.toString();
+    if (uri.scheme != 'file' && uri.scheme != '' && style != Style.url) {
+      return uri.toString();
+    }
+
+    var path = normalize(fromUri(uri));
+    var rel = relative(path);
+    var components = split(rel);
+
+    // Only return a relative path if it's actually shorter than the absolute
+    // path. This avoids ugly things like long "../" chains to get to the root
+    // and then go back down.
+    return split(rel).length > split(path).length ? path : rel;
+  }
+
   ParsedPath _parse(String path) => new ParsedPath.parse(path, style);
 }
 
diff --git a/pkg/path/pubspec.yaml b/pkg/path/pubspec.yaml
index 8095c88..f21ac50 100644
--- a/pkg/path/pubspec.yaml
+++ b/pkg/path/pubspec.yaml
@@ -1,5 +1,5 @@
 name: path
-version: 1.1.0
+version: 1.2.0
 author: Dart Team <misc@dartlang.org>
 description: >
  A string-based path manipulation library. All of the path operations you know
@@ -8,6 +8,6 @@
 homepage: http://www.dartlang.org
 documentation: http://api.dartlang.org/docs/pkg/path
 dev_dependencies:
-  unittest: ">=0.9.0 <0.10.0"
+  unittest: ">=0.9.0 <0.12.0"
 environment:
   sdk: ">=1.0.0 <2.0.0"
diff --git a/pkg/path/test/posix_test.dart b/pkg/path/test/posix_test.dart
index 9da97c9..5b6d131 100644
--- a/pkg/path/test/posix_test.dart
+++ b/pkg/path/test/posix_test.dart
@@ -508,4 +508,30 @@
     expect(context.toUri(r'_{_}_`_^_ _"_%_'),
         Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_'));
   });
+
+  group('prettyUri', () {
+    test('with a file: URI', () {
+      expect(context.prettyUri('file:///root/path/a/b'), 'a/b');
+      expect(context.prettyUri('file:///root/path/a/../b'), 'b');
+      expect(context.prettyUri('file:///other/path/a/b'), '/other/path/a/b');
+      expect(context.prettyUri('file:///root/other'), '../other');
+    });
+
+    test('with an http: URI', () {
+      expect(context.prettyUri('http://dartlang.org/a/b'),
+          'http://dartlang.org/a/b');
+    });
+
+    test('with a relative URI', () {
+      expect(context.prettyUri('a/b'), 'a/b');
+    });
+
+    test('with a root-relative URI', () {
+      expect(context.prettyUri('/a/b'), '/a/b');
+    });
+
+    test('with a Uri object', () {
+      expect(context.prettyUri(Uri.parse('a/b')), 'a/b');
+    });
+  });
 }
diff --git a/pkg/path/test/url_test.dart b/pkg/path/test/url_test.dart
index 58c7b92..27691d8 100644
--- a/pkg/path/test/url_test.dart
+++ b/pkg/path/test/url_test.dart
@@ -741,4 +741,34 @@
     expect(context.toUri(r'_%7B_%7D_%60_%5E_%20_%22_%25_'),
         Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_'));
   });
+
+  group('prettyUri', () {
+    test('with a file: URI', () {
+      expect(context.prettyUri(Uri.parse('file:///root/path/a/b')),
+          'file:///root/path/a/b');
+    });
+
+    test('with an http: URI', () {
+      expect(context.prettyUri('http://dartlang.org/root/path/a/b'), 'a/b');
+      expect(context.prettyUri('http://dartlang.org/root/path/a/../b'), 'b');
+      expect(context.prettyUri('http://dartlang.org/other/path/a/b'),
+          'http://dartlang.org/other/path/a/b');
+      expect(context.prettyUri('http://pub.dartlang.org/root/path'),
+          'http://pub.dartlang.org/root/path');
+      expect(context.prettyUri('http://dartlang.org/root/other'),
+          '../other');
+    });
+
+    test('with a relative URI', () {
+      expect(context.prettyUri('a/b'), 'a/b');
+    });
+
+    test('with a root-relative URI', () {
+      expect(context.prettyUri('/a/b'), '/a/b');
+    });
+
+    test('with a Uri object', () {
+      expect(context.prettyUri(Uri.parse('a/b')), 'a/b');
+    });
+  });
 }
diff --git a/pkg/path/test/windows_test.dart b/pkg/path/test/windows_test.dart
index d194663..7c16e31 100644
--- a/pkg/path/test/windows_test.dart
+++ b/pkg/path/test/windows_test.dart
@@ -640,4 +640,34 @@
     expect(context.toUri(r'_{_}_`_^_ _"_%_'),
         Uri.parse('_%7B_%7D_%60_%5E_%20_%22_%25_'));
   });
+
+  group('prettyUri', () {
+    test('with a file: URI', () {
+      expect(context.prettyUri('file:///C:/root/path/a/b'), r'a\b');
+      expect(context.prettyUri('file:///C:/root/path/a/../b'), r'b');
+      expect(context.prettyUri('file:///C:/other/path/a/b'),
+          r'C:\other\path\a\b');
+      expect(context.prettyUri('file:///D:/root/path/a/b'),
+          r'D:\root\path\a\b');
+      expect(context.prettyUri('file:///C:/root/other'),
+          r'..\other');
+    });
+
+    test('with an http: URI', () {
+      expect(context.prettyUri('http://dartlang.org/a/b'),
+          'http://dartlang.org/a/b');
+    });
+
+    test('with a relative URI', () {
+      expect(context.prettyUri('a/b'), r'a\b');
+    });
+
+    test('with a root-relative URI', () {
+      expect(context.prettyUri('/D:/a/b'), r'D:\a\b');
+    });
+
+    test('with a Uri object', () {
+      expect(context.prettyUri(Uri.parse('a/b')), r'a\b');
+    });
+  });
 }
diff --git a/pkg/pkg.gyp b/pkg/pkg.gyp
index df21e10..dfea42a 100644
--- a/pkg/pkg.gyp
+++ b/pkg/pkg.gyp
@@ -18,7 +18,7 @@
             '<!@(["python", "../tools/list_pkg_directories.py", '
                 '"../third_party/pkg"])',
             '<!@(["python", "../tools/list_pkg_directories.py", '
-                '"polymer/example/"])',
+                '"polymer/e2e_test/"])',
           ],
           'outputs': [
             '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 3ae6d11..6272720 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -16,6 +16,7 @@
 
 scheduled_test/test/scheduled_server_test: Pass, Fail # 13524
 scheduled_test/test/scheduled_process_test: Pass, Slow # Issue 9231
+scheduled_test/test/scheduled_stream/stream_matcher_test: Pass, Slow
 polymer/test/build/script_compactor_test: Pass, Slow
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium) ]
@@ -28,6 +29,7 @@
 polymer/test/entered_view_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 # Issue 18931
 polymer/test/events_test: Pass, RuntimeError # Issue 18931
 polymer/test/instance_attrs_test: Pass, RuntimeError # Issue 18931
 polymer/test/js_interop_test: Pass, RuntimeError # Issue 18931
@@ -36,6 +38,8 @@
 polymer/test/prop_attr_bind_reflection_test: Pass, RuntimeError # Issue 18931
 polymer/test/prop_attr_reflection_test: Pass, RuntimeError # Issue 18931
 polymer/test/publish_attributes_test: Pass, RuntimeError # Issue 18931
+polymer/test/publish_inherited_properties_test: Pass, RuntimeError # Issue 18931
+polymer/test/register_test: Pass, RuntimeError # Issue 18931
 polymer/test/take_attributes_test: Pass, RuntimeError # Issue 18931
 polymer/test/template_distribute_dynamic_test: Pass, RuntimeError # Issue 18931
 
@@ -99,6 +103,7 @@
 
 [ $runtime == vm || $runtime == d8 || $runtime == jsshell ]
 polymer/example: Skip # Uses dart:html
+polymer/e2e_test: Skip # Uses dart:html
 polymer/test/attr_deserialize_test: Skip # uses dart:html
 polymer/test/attr_mustache_test: Skip #uses dart:html
 polymer/test/bind_test: Skip # uses dart:html
@@ -169,22 +174,21 @@
 
 [ $runtime == vm && $system == windows ]
 intl/test/find_default_locale_standalone_test: Fail # Issue 8110
+analysis_server/test/resource_test: RuntimeError # Issue 19014
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
 # These tests are runtime negative but statically positive, so we skip
 # them in the analyzer.
 mock/test/mock_regexp_negative_test: Skip
 mock/test/mock_stepwise_negative_test: Skip
-polymer/example/canonicalization: Skip
-polymer/example/canonicalization2: Skip
-polymer/example/canonicalization3: Skip
+polymer/e2e_test/canonicalization: Skip
+polymer/e2e_test/experimental_boot: Skip
 
 third_party/angular_tests/browser_test: StaticWarning # Issue 15890
 
 [ $compiler == dart2js && $runtime == none]
-polymer/example/canonicalization: Skip
-polymer/example/canonicalization2: Skip
-polymer/example/canonicalization3: Skip
+polymer/e2e_test/canonicalization: Skip
+polymer/e2e_test/experimental_boot: Skip
 
 [ $compiler == dart2js && $csp ]
 polymer/test/noscript_test: Fail # Issue 17326
@@ -205,6 +209,14 @@
 crypto/test/sha256_test: Slow, Pass
 crypto/test/sha1_test: Slow, Pass
 polymer/example/component: Fail # Issue 13198
+polymer/e2e_test/canonicalization/test/dev1_test: Fail, OK # tests development only behavior
+polymer/e2e_test/canonicalization/test/dev2_test: Fail, OK # tests development only behavior
+polymer/e2e_test/canonicalization/test/dev3_test: Fail, OK # tests development only behavior
+polymer/e2e_test/canonicalization/test/dir/dev1_test: Fail, OK # tests development only behavior
+polymer/e2e_test/canonicalization/test/dir/dev2_test: Fail, OK # tests development only behavior
+polymer/e2e_test/bad_import1: RuntimeError # Issue 17596
+polymer/e2e_test/bad_import2: RuntimeError # Issue 17596
+polymer/e2e_test/bad_import3: Fail, OK # tests broken import
 polymer/test/mirror_loader_test: Skip # tests development only behavior
 
 [ $compiler == dart2js && $runtime == chromeOnAndroid ]
@@ -310,6 +322,12 @@
 unittest/test/unittest_test_returning_future_test: Fail # 13921
 unittest/test/unittest_test_returning_future_using_runasync_test: Fail # 13921
 unittest/test/unittest_testcases_immutable_test: Fail # 13921
+polymer/e2e_test/canonicalization/test/deploy1_test: Fail, OK # tests deploy only behavior
+polymer/e2e_test/canonicalization/test/deploy2_test: Fail, OK # tests deploy only behavior
+polymer/e2e_test/canonicalization/test/deploy3_test: Fail, OK # tests deploy only behavior
+polymer/e2e_test/canonicalization/test/dir/dev2_test: RuntimeError # Issue 17596
+polymer/e2e_test/canonicalization/test/dir/deploy1_test: Fail, OK # tests deploy only behavior
+polymer/e2e_test/canonicalization/test/dir/deploy2_test: Fail, OK # tests deploy only behavior
 polymer/test/custom_event_test: Pass, Crash # 14360
 
 [ $compiler == none && ( $runtime == dartium || $runtime == drt ) && $checked ]
diff --git a/pkg/polymer/e2e_test/README.txt b/pkg/polymer/e2e_test/README.txt
new file mode 100644
index 0000000..222ef1b
--- /dev/null
+++ b/pkg/polymer/e2e_test/README.txt
@@ -0,0 +1,4 @@
+This folder contains end-to-end tests that involve calling pub-build on an
+entire package. We have these tests here and not in 'polymer/test/' because we
+wanted to create an entire package struture and test using HTML imports to load
+code from a package's lib/ folder.
diff --git a/pkg/polymer/example/canonicalization2/lib/a.dart b/pkg/polymer/e2e_test/bad_import1/lib/a.dart
similarity index 74%
copy from pkg/polymer/example/canonicalization2/lib/a.dart
copy to pkg/polymer/e2e_test/bad_import1/lib/a.dart
index dfbe3ca..842c5de 100644
--- a/pkg/polymer/example/canonicalization2/lib/a.dart
+++ b/pkg/polymer/e2e_test/bad_import1/lib/a.dart
@@ -2,15 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library canonicalization.a;
+library bad_import1.a;
 
 import 'package:polymer/polymer.dart';
-import 'package:canonicalization/c.dart';
-import 'd.dart';
 
 int a = 0;
 @initMethod initA() {
   a++;
-  c++;
-  d++;
 }
diff --git a/pkg/polymer/example/canonicalization/lib/b.html b/pkg/polymer/e2e_test/bad_import1/lib/a.html
similarity index 76%
copy from pkg/polymer/example/canonicalization/lib/b.html
copy to pkg/polymer/e2e_test/bad_import1/lib/a.html
index dc9e034..c359e83 100644
--- a/pkg/polymer/example/canonicalization/lib/b.html
+++ b/pkg/polymer/e2e_test/bad_import1/lib/a.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart;component=1' src='b.dart'></script>
+<script type='application/dart' src='a.dart'></script>
diff --git a/pkg/polymer/example/canonicalization3/lib/g.html b/pkg/polymer/e2e_test/bad_import1/lib/b.html
similarity index 71%
copy from pkg/polymer/example/canonicalization3/lib/g.html
copy to pkg/polymer/e2e_test/bad_import1/lib/b.html
index ab73db5..8ca5140 100644
--- a/pkg/polymer/example/canonicalization3/lib/g.html
+++ b/pkg/polymer/e2e_test/bad_import1/lib/b.html
@@ -5,6 +5,7 @@
 -->
 <!--
 Because this file is under lib/, this URL is broken. It should be either
-'b.html' or '../../packages/canonicalization3/b.html'.
+'a.html' or '../../packages/bad_import1/a.html'.
  -->
-<link rel="import" href="packages/canonicalization3/b.html">
+<link rel="import" href="../packages/bad_import1/a.html">
+
diff --git a/pkg/polymer/e2e_test/bad_import1/pubspec.yaml b/pkg/polymer/e2e_test/bad_import1/pubspec.yaml
new file mode 100644
index 0000000..5d18ba5
--- /dev/null
+++ b/pkg/polymer/e2e_test/bad_import1/pubspec.yaml
@@ -0,0 +1,8 @@
+name: bad_import1
+dependencies:
+  polymer: any
+dev_dependencies:
+  unittest: any
+transformers:
+  - polymer:
+      entry_points: test/import_test.html
diff --git a/pkg/polymer/e2e_test/bad_import1/test/import_test.dart b/pkg/polymer/e2e_test/bad_import1/test/import_test.dart
new file mode 100644
index 0000000..8bd79cf
--- /dev/null
+++ b/pkg/polymer/e2e_test/bad_import1/test/import_test.dart
@@ -0,0 +1,22 @@
+// 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.
+
+/// Tests how canonicalization works when using the deployed app.
+library bad_import1.import_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:polymer/polymer.dart';
+
+import 'package:bad_import1/a.dart';
+main() {
+  initPolymer();
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('html import', () {
+    expect(a, 0, reason: 'html import was not resolved correctly.');
+  });
+}
diff --git a/pkg/polymer/example/canonicalization/test/dir/dir1_test.html b/pkg/polymer/e2e_test/bad_import1/test/import_test.html
similarity index 72%
copy from pkg/polymer/example/canonicalization/test/dir/dir1_test.html
copy to pkg/polymer/e2e_test/bad_import1/test/import_test.html
index cc1b5c3..bdb8935 100644
--- a/pkg/polymer/example/canonicalization/test/dir/dir1_test.html
+++ b/pkg/polymer/e2e_test/bad_import1/test/import_test.html
@@ -9,11 +9,11 @@
   <head>
     <title>Tests canonicalization at deployment time</title>
     <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <link rel="import" href="packages/canonicalization/b.html">
+    <link rel="import" href="packages/bad_import1/b.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart;component=1" src="dir1_test.dart"></script>
+    <script type="application/dart" onerror="scriptTagOnErrorCallback(null)"
+        src="import_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization2/lib/a.dart b/pkg/polymer/e2e_test/bad_import2/lib/a.dart
similarity index 74%
copy from pkg/polymer/example/canonicalization2/lib/a.dart
copy to pkg/polymer/e2e_test/bad_import2/lib/a.dart
index dfbe3ca..8167c9b 100644
--- a/pkg/polymer/example/canonicalization2/lib/a.dart
+++ b/pkg/polymer/e2e_test/bad_import2/lib/a.dart
@@ -2,15 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library canonicalization.a;
+library bad_import2.a;
 
 import 'package:polymer/polymer.dart';
-import 'package:canonicalization/c.dart';
-import 'd.dart';
 
 int a = 0;
 @initMethod initA() {
   a++;
-  c++;
-  d++;
 }
diff --git a/pkg/polymer/example/canonicalization/lib/b.html b/pkg/polymer/e2e_test/bad_import2/lib/a.html
similarity index 76%
copy from pkg/polymer/example/canonicalization/lib/b.html
copy to pkg/polymer/e2e_test/bad_import2/lib/a.html
index dc9e034..c359e83 100644
--- a/pkg/polymer/example/canonicalization/lib/b.html
+++ b/pkg/polymer/e2e_test/bad_import2/lib/a.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart;component=1' src='b.dart'></script>
+<script type='application/dart' src='a.dart'></script>
diff --git a/pkg/polymer/example/canonicalization3/lib/g.html b/pkg/polymer/e2e_test/bad_import2/lib/b.html
similarity index 71%
rename from pkg/polymer/example/canonicalization3/lib/g.html
rename to pkg/polymer/e2e_test/bad_import2/lib/b.html
index ab73db5..10d8ebe 100644
--- a/pkg/polymer/example/canonicalization3/lib/g.html
+++ b/pkg/polymer/e2e_test/bad_import2/lib/b.html
@@ -5,6 +5,7 @@
 -->
 <!--
 Because this file is under lib/, this URL is broken. It should be either
-'b.html' or '../../packages/canonicalization3/b.html'.
+'a.html' or '../../packages/bad_import2/a.html'.
  -->
-<link rel="import" href="packages/canonicalization3/b.html">
+<link rel="import" href="packages/bad_import2/a.html">
+
diff --git a/pkg/polymer/e2e_test/bad_import2/pubspec.yaml b/pkg/polymer/e2e_test/bad_import2/pubspec.yaml
new file mode 100644
index 0000000..5619b8d
--- /dev/null
+++ b/pkg/polymer/e2e_test/bad_import2/pubspec.yaml
@@ -0,0 +1,8 @@
+name: bad_import2
+dependencies:
+  polymer: any
+dev_dependencies:
+  unittest: any
+transformers:
+  - polymer:
+      entry_points: test/import_test.html
diff --git a/pkg/polymer/e2e_test/bad_import2/test/import_test.dart b/pkg/polymer/e2e_test/bad_import2/test/import_test.dart
new file mode 100644
index 0000000..7f1ebd6
--- /dev/null
+++ b/pkg/polymer/e2e_test/bad_import2/test/import_test.dart
@@ -0,0 +1,22 @@
+// 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.
+
+/// Tests how canonicalization works when using the deployed app.
+library bad_import2.import_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:polymer/polymer.dart';
+
+import 'package:bad_import2/a.dart';
+main() {
+  initPolymer();
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('html import', () {
+    expect(a, 0, reason: 'html import was not resolved correctly.');
+  });
+}
diff --git a/pkg/polymer/example/canonicalization/test/dir/dir1_test.html b/pkg/polymer/e2e_test/bad_import2/test/import_test.html
similarity index 72%
copy from pkg/polymer/example/canonicalization/test/dir/dir1_test.html
copy to pkg/polymer/e2e_test/bad_import2/test/import_test.html
index cc1b5c3..6ad4382 100644
--- a/pkg/polymer/example/canonicalization/test/dir/dir1_test.html
+++ b/pkg/polymer/e2e_test/bad_import2/test/import_test.html
@@ -9,11 +9,11 @@
   <head>
     <title>Tests canonicalization at deployment time</title>
     <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <link rel="import" href="packages/canonicalization/b.html">
+    <link rel="import" href="packages/bad_import2/b.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart;component=1" src="dir1_test.dart"></script>
+    <script type="application/dart" onerror="scriptTagOnErrorCallback(null)"
+        src="import_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization2/lib/a.dart b/pkg/polymer/e2e_test/bad_import3/lib/a.dart
similarity index 74%
copy from pkg/polymer/example/canonicalization2/lib/a.dart
copy to pkg/polymer/e2e_test/bad_import3/lib/a.dart
index dfbe3ca..a0a05cb 100644
--- a/pkg/polymer/example/canonicalization2/lib/a.dart
+++ b/pkg/polymer/e2e_test/bad_import3/lib/a.dart
@@ -2,15 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library canonicalization.a;
+library bad_import3.a;
 
 import 'package:polymer/polymer.dart';
-import 'package:canonicalization/c.dart';
-import 'd.dart';
 
 int a = 0;
 @initMethod initA() {
   a++;
-  c++;
-  d++;
 }
diff --git a/pkg/polymer/example/canonicalization/lib/b.html b/pkg/polymer/e2e_test/bad_import3/lib/a.html
similarity index 76%
copy from pkg/polymer/example/canonicalization/lib/b.html
copy to pkg/polymer/e2e_test/bad_import3/lib/a.html
index dc9e034..c359e83 100644
--- a/pkg/polymer/example/canonicalization/lib/b.html
+++ b/pkg/polymer/e2e_test/bad_import3/lib/a.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart;component=1' src='b.dart'></script>
+<script type='application/dart' src='a.dart'></script>
diff --git a/pkg/polymer/example/canonicalization3/lib/g.html b/pkg/polymer/e2e_test/bad_import3/lib/b.html
similarity index 71%
copy from pkg/polymer/example/canonicalization3/lib/g.html
copy to pkg/polymer/e2e_test/bad_import3/lib/b.html
index ab73db5..6d94044 100644
--- a/pkg/polymer/example/canonicalization3/lib/g.html
+++ b/pkg/polymer/e2e_test/bad_import3/lib/b.html
@@ -5,6 +5,7 @@
 -->
 <!--
 Because this file is under lib/, this URL is broken. It should be either
-'b.html' or '../../packages/canonicalization3/b.html'.
+'a.html' or '../../packages/bad_import3/a.html'.
  -->
-<link rel="import" href="packages/canonicalization3/b.html">
+<link rel="import" href="broken_packages/bad_import3/a.html">
+
diff --git a/pkg/polymer/e2e_test/bad_import3/pubspec.yaml b/pkg/polymer/e2e_test/bad_import3/pubspec.yaml
new file mode 100644
index 0000000..32c5e7c
--- /dev/null
+++ b/pkg/polymer/e2e_test/bad_import3/pubspec.yaml
@@ -0,0 +1,8 @@
+name: bad_import3
+dependencies:
+  polymer: any
+dev_dependencies:
+  unittest: any
+transformers:
+  - polymer:
+      entry_points: test/import_test.html
diff --git a/pkg/polymer/e2e_test/bad_import3/test/import_test.dart b/pkg/polymer/e2e_test/bad_import3/test/import_test.dart
new file mode 100644
index 0000000..13b6473
--- /dev/null
+++ b/pkg/polymer/e2e_test/bad_import3/test/import_test.dart
@@ -0,0 +1,22 @@
+// 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.
+
+/// Tests how canonicalization works when using the deployed app.
+library bad_import3.import_test;
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:polymer/polymer.dart';
+
+import 'package:bad_import3/a.dart';
+main() {
+  initPolymer();
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('html import', () {
+    expect(a, 0, reason: 'html import was not resolved correctly.');
+  });
+}
diff --git a/pkg/polymer/example/canonicalization/test/dir/dir1_test.html b/pkg/polymer/e2e_test/bad_import3/test/import_test.html
similarity index 72%
copy from pkg/polymer/example/canonicalization/test/dir/dir1_test.html
copy to pkg/polymer/e2e_test/bad_import3/test/import_test.html
index cc1b5c3..e19725c 100644
--- a/pkg/polymer/example/canonicalization/test/dir/dir1_test.html
+++ b/pkg/polymer/e2e_test/bad_import3/test/import_test.html
@@ -9,11 +9,11 @@
   <head>
     <title>Tests canonicalization at deployment time</title>
     <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <link rel="import" href="packages/canonicalization/b.html">
+    <link rel="import" href="packages/bad_import3/b.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart;component=1" src="dir1_test.dart"></script>
+    <script type="application/dart" onerror="scriptTagOnErrorCallback(null)"
+        src="import_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization/lib/a.dart b/pkg/polymer/e2e_test/canonicalization/lib/a.dart
similarity index 100%
rename from pkg/polymer/example/canonicalization/lib/a.dart
rename to pkg/polymer/e2e_test/canonicalization/lib/a.dart
diff --git a/pkg/polymer/example/canonicalization/lib/b.html b/pkg/polymer/e2e_test/canonicalization/lib/a.html
similarity index 76%
copy from pkg/polymer/example/canonicalization/lib/b.html
copy to pkg/polymer/e2e_test/canonicalization/lib/a.html
index dc9e034..c359e83 100644
--- a/pkg/polymer/example/canonicalization/lib/b.html
+++ b/pkg/polymer/e2e_test/canonicalization/lib/a.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart;component=1' src='b.dart'></script>
+<script type='application/dart' src='a.dart'></script>
diff --git a/pkg/polymer/example/canonicalization/lib/b.dart b/pkg/polymer/e2e_test/canonicalization/lib/b.dart
similarity index 100%
rename from pkg/polymer/example/canonicalization/lib/b.dart
rename to pkg/polymer/e2e_test/canonicalization/lib/b.dart
diff --git a/pkg/polymer/example/canonicalization/lib/b.html b/pkg/polymer/e2e_test/canonicalization/lib/b.html
similarity index 76%
copy from pkg/polymer/example/canonicalization/lib/b.html
copy to pkg/polymer/e2e_test/canonicalization/lib/b.html
index dc9e034..2a42437 100644
--- a/pkg/polymer/example/canonicalization/lib/b.html
+++ b/pkg/polymer/e2e_test/canonicalization/lib/b.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart;component=1' src='b.dart'></script>
+<script type='application/dart' src='b.dart'></script>
diff --git a/pkg/polymer/example/canonicalization/lib/c.dart b/pkg/polymer/e2e_test/canonicalization/lib/c.dart
similarity index 100%
rename from pkg/polymer/example/canonicalization/lib/c.dart
rename to pkg/polymer/e2e_test/canonicalization/lib/c.dart
diff --git a/pkg/polymer/example/canonicalization/lib/d.dart b/pkg/polymer/e2e_test/canonicalization/lib/d.dart
similarity index 100%
rename from pkg/polymer/example/canonicalization/lib/d.dart
rename to pkg/polymer/e2e_test/canonicalization/lib/d.dart
diff --git a/pkg/polymer/example/canonicalization/lib/e.html b/pkg/polymer/e2e_test/canonicalization/lib/e.html
similarity index 100%
rename from pkg/polymer/example/canonicalization/lib/e.html
rename to pkg/polymer/e2e_test/canonicalization/lib/e.html
diff --git a/pkg/polymer/example/canonicalization/lib/f.html b/pkg/polymer/e2e_test/canonicalization/lib/f.html
similarity index 100%
rename from pkg/polymer/example/canonicalization/lib/f.html
rename to pkg/polymer/e2e_test/canonicalization/lib/f.html
diff --git a/pkg/polymer/example/canonicalization/pubspec.yaml b/pkg/polymer/e2e_test/canonicalization/pubspec.yaml
similarity index 100%
rename from pkg/polymer/example/canonicalization/pubspec.yaml
rename to pkg/polymer/e2e_test/canonicalization/pubspec.yaml
diff --git a/pkg/polymer/e2e_test/canonicalization/test/deploy1_test.dart b/pkg/polymer/e2e_test/canonicalization/test/deploy1_test.dart
new file mode 100644
index 0000000..f67247a
--- /dev/null
+++ b/pkg/polymer/e2e_test/canonicalization/test/deploy1_test.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library canonicalization.test.deploy1_test;
+export 'deploy_common.dart';
diff --git a/pkg/polymer/example/canonicalization/test/canonicalization1_test.html b/pkg/polymer/e2e_test/canonicalization/test/deploy1_test.html
similarity index 86%
copy from pkg/polymer/example/canonicalization/test/canonicalization1_test.html
copy to pkg/polymer/e2e_test/canonicalization/test/deploy1_test.html
index e7d15c1..685f10b 100644
--- a/pkg/polymer/example/canonicalization/test/canonicalization1_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/deploy1_test.html
@@ -14,7 +14,6 @@
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart;component=1"
-            src="canonicalization1_test.dart"></script>
+    <script type="application/dart" src="deploy1_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/e2e_test/canonicalization/test/deploy2_test.dart b/pkg/polymer/e2e_test/canonicalization/test/deploy2_test.dart
new file mode 100644
index 0000000..903ef59
--- /dev/null
+++ b/pkg/polymer/e2e_test/canonicalization/test/deploy2_test.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library canonicalization.test.deploy2_test;
+export 'deploy_common.dart';
diff --git a/pkg/polymer/example/canonicalization/test/canonicalization2_test.html b/pkg/polymer/e2e_test/canonicalization/test/deploy2_test.html
similarity index 79%
rename from pkg/polymer/example/canonicalization/test/canonicalization2_test.html
rename to pkg/polymer/e2e_test/canonicalization/test/deploy2_test.html
index 935acb6..511d592 100644
--- a/pkg/polymer/example/canonicalization/test/canonicalization2_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/deploy2_test.html
@@ -10,12 +10,11 @@
     <title>Tests canonicalization during the development cycle</title>
     <link rel="import" href="packages/polymer/polymer.html">
     <link rel="import" href="packages/canonicalization/a.html">
-    <!-- similar to canonicalization1_test, but 'e' imports 'b' -->
+    <!-- similar to test #1, but 'e' imports 'b' -->
     <link rel="import" href="packages/canonicalization/e.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart;component=1"
-            src="canonicalization2_test.dart"></script>
+    <script type="application/dart" src="deploy2_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/e2e_test/canonicalization/test/deploy3_test.dart b/pkg/polymer/e2e_test/canonicalization/test/deploy3_test.dart
new file mode 100644
index 0000000..ff27b2d
--- /dev/null
+++ b/pkg/polymer/e2e_test/canonicalization/test/deploy3_test.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library canonicalization.test.deploy3_test;
+export 'deploy_common.dart';
diff --git a/pkg/polymer/example/canonicalization/test/canonicalization3_test.html b/pkg/polymer/e2e_test/canonicalization/test/deploy3_test.html
similarity index 79%
rename from pkg/polymer/example/canonicalization/test/canonicalization3_test.html
rename to pkg/polymer/e2e_test/canonicalization/test/deploy3_test.html
index 50f7c6c..74864d9 100644
--- a/pkg/polymer/example/canonicalization/test/canonicalization3_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/deploy3_test.html
@@ -10,12 +10,11 @@
     <title>Tests canonicalization at deployment time</title>
     <link rel="import" href="packages/polymer/polymer.html">
     <link rel="import" href="packages/canonicalization/a.html">
-    <!-- similar to canonicalization1_test, but 'f' imports 'b' -->
+    <!-- similar to test #1, but 'f' imports 'b' -->
     <link rel="import" href="packages/canonicalization/f.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart;component=1"
-            src="canonicalization3_test.dart"></script>
+    <script type="application/dart" src="deploy3_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization/test/common.dart b/pkg/polymer/e2e_test/canonicalization/test/deploy_common.dart
similarity index 69%
rename from pkg/polymer/example/canonicalization/test/common.dart
rename to pkg/polymer/e2e_test/canonicalization/test/deploy_common.dart
index 9c0c153..ee5a947 100644
--- a/pkg/polymer/example/canonicalization/test/common.dart
+++ b/pkg/polymer/e2e_test/canonicalization/test/deploy_common.dart
@@ -3,19 +3,20 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Tests how canonicalization works when using the deployed app.
-library canonicalization.test.common;
+library canonicalization.test.deploy_common;
 
 import 'package:unittest/unittest.dart';
 import 'package:unittest/html_config.dart';
 import 'package:polymer/polymer.dart';
 
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
+import 'package:canonicalization/a.dart' show a;
+import 'packages/canonicalization/b.dart' show b;
+import 'package:canonicalization/c.dart' show c;
+import 'package:canonicalization/d.dart' as d1 show d;
+import 'packages/canonicalization/d.dart' as d2 show d;
 
-tests() {
+main() {
+  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
@@ -26,10 +27,9 @@
 
     // We shouldn't be using 'packages/' above, so that's ok.
     expect(b, 0, reason:
-      'we pick the "package:" url as the canonical url for script tags.');
+        'we pick the "package:" url as the canonical url for script tags.');
     expect(c, 2, reason: 'c was always imported with "package:" urls.');
     expect(d1.d, 2, reason: 'both a and b are loaded using package: urls');
-
     expect(d2.d, 0, reason: 'both a and b are loaded using package: urls');
   });
 }
diff --git a/pkg/polymer/e2e_test/canonicalization/test/dev1_test.dart b/pkg/polymer/e2e_test/canonicalization/test/dev1_test.dart
new file mode 100644
index 0000000..2c46121
--- /dev/null
+++ b/pkg/polymer/e2e_test/canonicalization/test/dev1_test.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library canonicalization.test.dev1_test;
+export 'dev_common.dart';
diff --git a/pkg/polymer/example/canonicalization/test/canonicalization1_test.html b/pkg/polymer/e2e_test/canonicalization/test/dev1_test.html
similarity index 86%
rename from pkg/polymer/example/canonicalization/test/canonicalization1_test.html
rename to pkg/polymer/e2e_test/canonicalization/test/dev1_test.html
index e7d15c1..948d1f8 100644
--- a/pkg/polymer/example/canonicalization/test/canonicalization1_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/dev1_test.html
@@ -14,7 +14,6 @@
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart;component=1"
-            src="canonicalization1_test.dart"></script>
+    <script type="application/dart" src="dev1_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/e2e_test/canonicalization/test/dev2_test.dart b/pkg/polymer/e2e_test/canonicalization/test/dev2_test.dart
new file mode 100644
index 0000000..0fbd350
--- /dev/null
+++ b/pkg/polymer/e2e_test/canonicalization/test/dev2_test.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library canonicalization.test.dev2_test;
+export 'dev_common.dart';
diff --git a/pkg/polymer/example/canonicalization/test/canonicalization2_test.html b/pkg/polymer/e2e_test/canonicalization/test/dev2_test.html
similarity index 79%
copy from pkg/polymer/example/canonicalization/test/canonicalization2_test.html
copy to pkg/polymer/e2e_test/canonicalization/test/dev2_test.html
index 935acb6..19d4263 100644
--- a/pkg/polymer/example/canonicalization/test/canonicalization2_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/dev2_test.html
@@ -10,12 +10,11 @@
     <title>Tests canonicalization during the development cycle</title>
     <link rel="import" href="packages/polymer/polymer.html">
     <link rel="import" href="packages/canonicalization/a.html">
-    <!-- similar to canonicalization1_test, but 'e' imports 'b' -->
+    <!-- similar to test #1, but 'e' imports 'b' -->
     <link rel="import" href="packages/canonicalization/e.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart;component=1"
-            src="canonicalization2_test.dart"></script>
+    <script type="application/dart" src="dev2_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/e2e_test/canonicalization/test/dev3_test.dart b/pkg/polymer/e2e_test/canonicalization/test/dev3_test.dart
new file mode 100644
index 0000000..d3fea55
--- /dev/null
+++ b/pkg/polymer/e2e_test/canonicalization/test/dev3_test.dart
@@ -0,0 +1,6 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library canonicalization.test.dev3_test;
+export 'dev_common.dart';
diff --git a/pkg/polymer/example/canonicalization/test/canonicalization3_test.html b/pkg/polymer/e2e_test/canonicalization/test/dev3_test.html
similarity index 79%
copy from pkg/polymer/example/canonicalization/test/canonicalization3_test.html
copy to pkg/polymer/e2e_test/canonicalization/test/dev3_test.html
index 50f7c6c..6aaee9f 100644
--- a/pkg/polymer/example/canonicalization/test/canonicalization3_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/dev3_test.html
@@ -10,12 +10,11 @@
     <title>Tests canonicalization at deployment time</title>
     <link rel="import" href="packages/polymer/polymer.html">
     <link rel="import" href="packages/canonicalization/a.html">
-    <!-- similar to canonicalization1_test, but 'f' imports 'b' -->
+    <!-- similar to test #1, but 'f' imports 'b' -->
     <link rel="import" href="packages/canonicalization/f.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart;component=1"
-            src="canonicalization3_test.dart"></script>
+    <script type="application/dart" src="dev3_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/e2e_test/canonicalization/test/dev_common.dart b/pkg/polymer/e2e_test/canonicalization/test/dev_common.dart
new file mode 100644
index 0000000..c25172e
--- /dev/null
+++ b/pkg/polymer/e2e_test/canonicalization/test/dev_common.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// Tests how canonicalization works when developing in Dartium.
+library canonicalization.test.dev_common;
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:polymer/polymer.dart';
+
+import 'package:canonicalization/a.dart' show a;
+import 'packages/canonicalization/b.dart' show b;
+import 'package:canonicalization/c.dart' show c;
+import 'package:canonicalization/d.dart' as d1 show d;
+import 'packages/canonicalization/d.dart' as d2 show d;
+
+main() {
+  initPolymer();
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('canonicalization', () {
+    expect(a, 1, reason: 'Dartium loads "a" via a "package:" url.');
+
+    // We shouldn't be using 'packages/', but we do just to check that Dartium
+    // can't infer a "package:" url for it.
+    expect(b, 1, reason: 'Dartium picks the relative url for "b".');
+    expect(c, 2, reason: '"c" was always imported with "package:" urls.');
+    expect(d1.d, 1, reason: '"a" loads via "package:", but "b" does not.');
+    expect(d2.d, 1, reason: '"b" loads via a relative url, but "a" does not.');
+  });
+}
diff --git a/pkg/polymer/example/canonicalization/test/dir/dir2_test.dart b/pkg/polymer/e2e_test/canonicalization/test/dir/deploy1_test.dart
similarity index 66%
rename from pkg/polymer/example/canonicalization/test/dir/dir2_test.dart
rename to pkg/polymer/e2e_test/canonicalization/test/dir/deploy1_test.dart
index d4c55dc..ccecd7e 100644
--- a/pkg/polymer/example/canonicalization/test/dir/dir2_test.dart
+++ b/pkg/polymer/e2e_test/canonicalization/test/dir/deploy1_test.dart
@@ -3,9 +3,5 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Tests canonicalization at deployment time from a subdir.
-library canonicalization.test.dir2_test;
-
-import 'package:polymer/polymer.dart';
-import '../common.dart';
-
-@initMethod main() => tests();
+library canonicalization.test.dir.deploy1_test;
+export 'deploy_common.dart';
diff --git a/pkg/polymer/example/canonicalization/test/dir/dir1_test.html b/pkg/polymer/e2e_test/canonicalization/test/dir/deploy1_test.html
similarity index 89%
copy from pkg/polymer/example/canonicalization/test/dir/dir1_test.html
copy to pkg/polymer/e2e_test/canonicalization/test/dir/deploy1_test.html
index cc1b5c3..a65b92ea 100644
--- a/pkg/polymer/example/canonicalization/test/dir/dir1_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/dir/deploy1_test.html
@@ -14,6 +14,6 @@
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart;component=1" src="dir1_test.dart"></script>
+    <script type="application/dart" src="deploy1_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization/test/dir/dir2_test.dart b/pkg/polymer/e2e_test/canonicalization/test/dir/deploy2_test.dart
similarity index 66%
copy from pkg/polymer/example/canonicalization/test/dir/dir2_test.dart
copy to pkg/polymer/e2e_test/canonicalization/test/dir/deploy2_test.dart
index d4c55dc..e2f632e 100644
--- a/pkg/polymer/example/canonicalization/test/dir/dir2_test.dart
+++ b/pkg/polymer/e2e_test/canonicalization/test/dir/deploy2_test.dart
@@ -3,9 +3,5 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Tests canonicalization at deployment time from a subdir.
-library canonicalization.test.dir2_test;
-
-import 'package:polymer/polymer.dart';
-import '../common.dart';
-
-@initMethod main() => tests();
+library canonicalization.test.dir.deploy2_test;
+export 'deploy_common.dart';
diff --git a/pkg/polymer/example/canonicalization/test/dir/dir2_test.html b/pkg/polymer/e2e_test/canonicalization/test/dir/deploy2_test.html
similarity index 89%
rename from pkg/polymer/example/canonicalization/test/dir/dir2_test.html
rename to pkg/polymer/e2e_test/canonicalization/test/dir/deploy2_test.html
index 43415b8..f2646b4 100644
--- a/pkg/polymer/example/canonicalization/test/dir/dir2_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/dir/deploy2_test.html
@@ -14,6 +14,6 @@
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart;component=1" src="dir2_test.dart"></script>
+    <script type="application/dart" src="deploy2_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization/test/common.dart b/pkg/polymer/e2e_test/canonicalization/test/dir/deploy_common.dart
similarity index 60%
copy from pkg/polymer/example/canonicalization/test/common.dart
copy to pkg/polymer/e2e_test/canonicalization/test/dir/deploy_common.dart
index 9c0c153..a3f1b6a 100644
--- a/pkg/polymer/example/canonicalization/test/common.dart
+++ b/pkg/polymer/e2e_test/canonicalization/test/dir/deploy_common.dart
@@ -2,20 +2,24 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// Tests how canonicalization works when using the deployed app.
-library canonicalization.test.common;
+/// Tests how canonicalization works when using the deployed app. This is
+/// identical to the code in ../dir/deploy_common.dart but we need to copy it
+/// here because the 'packages/...' URLs below should be relative from the
+/// entrypoint directory.
+library canonicalization.test.dir.deploy_common;
 
 import 'package:unittest/unittest.dart';
 import 'package:unittest/html_config.dart';
 import 'package:polymer/polymer.dart';
 
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
+import 'package:canonicalization/a.dart' show a;
+import 'packages/canonicalization/b.dart' show b;
+import 'package:canonicalization/c.dart' show c;
+import 'package:canonicalization/d.dart' as d1 show d;
+import 'packages/canonicalization/d.dart' as d2 show d;
 
-tests() {
+main() {
+  initPolymer();
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
@@ -26,10 +30,9 @@
 
     // We shouldn't be using 'packages/' above, so that's ok.
     expect(b, 0, reason:
-      'we pick the "package:" url as the canonical url for script tags.');
+        'we pick the "package:" url as the canonical url for script tags.');
     expect(c, 2, reason: 'c was always imported with "package:" urls.');
     expect(d1.d, 2, reason: 'both a and b are loaded using package: urls');
-
     expect(d2.d, 0, reason: 'both a and b are loaded using package: urls');
   });
 }
diff --git a/pkg/polymer/example/canonicalization/test/dir/dir2_test.dart b/pkg/polymer/e2e_test/canonicalization/test/dir/dev1_test.dart
similarity index 66%
copy from pkg/polymer/example/canonicalization/test/dir/dir2_test.dart
copy to pkg/polymer/e2e_test/canonicalization/test/dir/dev1_test.dart
index d4c55dc..ed64858 100644
--- a/pkg/polymer/example/canonicalization/test/dir/dir2_test.dart
+++ b/pkg/polymer/e2e_test/canonicalization/test/dir/dev1_test.dart
@@ -3,9 +3,5 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Tests canonicalization at deployment time from a subdir.
-library canonicalization.test.dir2_test;
-
-import 'package:polymer/polymer.dart';
-import '../common.dart';
-
-@initMethod main() => tests();
+library canonicalization.test.dir.dev1_test;
+export 'dev_common.dart';
diff --git a/pkg/polymer/example/canonicalization/test/dir/dir1_test.html b/pkg/polymer/e2e_test/canonicalization/test/dir/dev1_test.html
similarity index 89%
rename from pkg/polymer/example/canonicalization/test/dir/dir1_test.html
rename to pkg/polymer/e2e_test/canonicalization/test/dir/dev1_test.html
index cc1b5c3..85f4b1f 100644
--- a/pkg/polymer/example/canonicalization/test/dir/dir1_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/dir/dev1_test.html
@@ -14,6 +14,6 @@
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart;component=1" src="dir1_test.dart"></script>
+    <script type="application/dart" src="dev1_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization/test/dir/dir2_test.dart b/pkg/polymer/e2e_test/canonicalization/test/dir/dev2_test.dart
similarity index 66%
copy from pkg/polymer/example/canonicalization/test/dir/dir2_test.dart
copy to pkg/polymer/e2e_test/canonicalization/test/dir/dev2_test.dart
index d4c55dc..3593124 100644
--- a/pkg/polymer/example/canonicalization/test/dir/dir2_test.dart
+++ b/pkg/polymer/e2e_test/canonicalization/test/dir/dev2_test.dart
@@ -3,9 +3,5 @@
 // BSD-style license that can be found in the LICENSE file.
 
 /// Tests canonicalization at deployment time from a subdir.
-library canonicalization.test.dir2_test;
-
-import 'package:polymer/polymer.dart';
-import '../common.dart';
-
-@initMethod main() => tests();
+library canonicalization.test.dir.dev2_test;
+export 'dev_common.dart';
diff --git a/pkg/polymer/example/canonicalization/test/dir/dir2_test.html b/pkg/polymer/e2e_test/canonicalization/test/dir/dev2_test.html
similarity index 89%
copy from pkg/polymer/example/canonicalization/test/dir/dir2_test.html
copy to pkg/polymer/e2e_test/canonicalization/test/dir/dev2_test.html
index 43415b8..dbff6a4 100644
--- a/pkg/polymer/example/canonicalization/test/dir/dir2_test.html
+++ b/pkg/polymer/e2e_test/canonicalization/test/dir/dev2_test.html
@@ -14,6 +14,6 @@
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart;component=1" src="dir2_test.dart"></script>
+    <script type="application/dart" src="dev2_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/e2e_test/canonicalization/test/dir/dev_common.dart b/pkg/polymer/e2e_test/canonicalization/test/dir/dev_common.dart
new file mode 100644
index 0000000..11427fd
--- /dev/null
+++ b/pkg/polymer/e2e_test/canonicalization/test/dir/dev_common.dart
@@ -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.
+
+/// Tests how canonicalization works when developing in Dartium. This is
+/// identical to the code in ../dir/deploy_common.dart but we need to copy it
+/// here because the 'packages/...' URLs below should be relative from the
+/// entrypoint directory.
+library canonicalization.test.dir.dev_common;
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:polymer/polymer.dart';
+
+import 'package:canonicalization/a.dart' show a;
+import 'packages/canonicalization/b.dart' show b;
+import 'package:canonicalization/c.dart' show c;
+import 'package:canonicalization/d.dart' as d1 show d;
+import 'packages/canonicalization/d.dart' as d2 show d;
+
+main() {
+  initPolymer();
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('canonicalization', () {
+    expect(a, 1, reason: 'Dartium loads "a" via a "package:" url.');
+
+    // We shouldn't be using 'packages/', but we do just to check that Dartium
+    // can't infer a "package:" url for it.
+    expect(b, 1, reason: 'Dartium picks the relative url for "b".');
+    expect(c, 2, reason: '"c" was always imported with "package:" urls.');
+    expect(d1.d, 1, reason: '"a" loads via "package:", but "b" does not.');
+    expect(d2.d, 1, reason: '"b" loads via a relative url, but "a" does not.');
+  });
+}
diff --git a/pkg/polymer/example/canonicalization2/lib/a.dart b/pkg/polymer/e2e_test/experimental_boot/lib/a.dart
similarity index 81%
rename from pkg/polymer/example/canonicalization2/lib/a.dart
rename to pkg/polymer/e2e_test/experimental_boot/lib/a.dart
index dfbe3ca..adc2b48 100644
--- a/pkg/polymer/example/canonicalization2/lib/a.dart
+++ b/pkg/polymer/e2e_test/experimental_boot/lib/a.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library canonicalization.a;
+library experimental_boot.a;
 
 import 'package:polymer/polymer.dart';
-import 'package:canonicalization/c.dart';
+import 'package:experimental_boot/c.dart';
 import 'd.dart';
 
 int a = 0;
diff --git a/pkg/polymer/example/canonicalization/lib/b.html b/pkg/polymer/e2e_test/experimental_boot/lib/a.html
similarity index 76%
copy from pkg/polymer/example/canonicalization/lib/b.html
copy to pkg/polymer/e2e_test/experimental_boot/lib/a.html
index dc9e034..c359e83 100644
--- a/pkg/polymer/example/canonicalization/lib/b.html
+++ b/pkg/polymer/e2e_test/experimental_boot/lib/a.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart;component=1' src='b.dart'></script>
+<script type='application/dart' src='a.dart'></script>
diff --git a/pkg/polymer/example/canonicalization2/lib/b.dart b/pkg/polymer/e2e_test/experimental_boot/lib/b.dart
similarity index 81%
rename from pkg/polymer/example/canonicalization2/lib/b.dart
rename to pkg/polymer/e2e_test/experimental_boot/lib/b.dart
index fbdccf6..cbcfa0f 100644
--- a/pkg/polymer/example/canonicalization2/lib/b.dart
+++ b/pkg/polymer/e2e_test/experimental_boot/lib/b.dart
@@ -2,10 +2,10 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library canonicalization.b;
+library experimental_boot.b;
 
 import 'package:polymer/polymer.dart';
-import 'package:canonicalization/c.dart';
+import 'package:experimental_boot/c.dart';
 import 'd.dart';
 
 int b = 0;
diff --git a/pkg/polymer/example/canonicalization/lib/b.html b/pkg/polymer/e2e_test/experimental_boot/lib/b.html
similarity index 76%
copy from pkg/polymer/example/canonicalization/lib/b.html
copy to pkg/polymer/e2e_test/experimental_boot/lib/b.html
index dc9e034..2a42437 100644
--- a/pkg/polymer/example/canonicalization/lib/b.html
+++ b/pkg/polymer/e2e_test/experimental_boot/lib/b.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart;component=1' src='b.dart'></script>
+<script type='application/dart' src='b.dart'></script>
diff --git a/pkg/polymer/example/canonicalization2/lib/c.dart b/pkg/polymer/e2e_test/experimental_boot/lib/c.dart
similarity index 88%
rename from pkg/polymer/example/canonicalization2/lib/c.dart
rename to pkg/polymer/e2e_test/experimental_boot/lib/c.dart
index 362f3e3..d103877 100644
--- a/pkg/polymer/example/canonicalization2/lib/c.dart
+++ b/pkg/polymer/e2e_test/experimental_boot/lib/c.dart
@@ -2,6 +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.
 
-library canonicalization.c;
+library experimental_boot.c;
 
 int c = 0;
diff --git a/pkg/polymer/example/canonicalization2/lib/d.dart b/pkg/polymer/e2e_test/experimental_boot/lib/d.dart
similarity index 88%
rename from pkg/polymer/example/canonicalization2/lib/d.dart
rename to pkg/polymer/e2e_test/experimental_boot/lib/d.dart
index 7d2a58e..cbc4282 100644
--- a/pkg/polymer/example/canonicalization2/lib/d.dart
+++ b/pkg/polymer/e2e_test/experimental_boot/lib/d.dart
@@ -2,6 +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.
 
-library canonicalization.d;
+library experimental_boot.d;
 
 int d = 0;
diff --git a/pkg/polymer/example/canonicalization/lib/e.html b/pkg/polymer/e2e_test/experimental_boot/lib/e.html
similarity index 100%
copy from pkg/polymer/example/canonicalization/lib/e.html
copy to pkg/polymer/e2e_test/experimental_boot/lib/e.html
diff --git a/pkg/polymer/example/canonicalization/lib/b.html b/pkg/polymer/e2e_test/experimental_boot/lib/f.html
similarity index 76%
rename from pkg/polymer/example/canonicalization/lib/b.html
rename to pkg/polymer/e2e_test/experimental_boot/lib/f.html
index dc9e034..f391682 100644
--- a/pkg/polymer/example/canonicalization/lib/b.html
+++ b/pkg/polymer/e2e_test/experimental_boot/lib/f.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart;component=1' src='b.dart'></script>
+<link rel="import" href="../../packages/experimental_boot/b.html">
diff --git a/pkg/polymer/e2e_test/experimental_boot/pubspec.yaml b/pkg/polymer/e2e_test/experimental_boot/pubspec.yaml
new file mode 100644
index 0000000..2b68609
--- /dev/null
+++ b/pkg/polymer/e2e_test/experimental_boot/pubspec.yaml
@@ -0,0 +1,5 @@
+name: experimental_boot
+dependencies:
+  polymer: any
+dev_dependencies:
+  unittest: any
diff --git a/pkg/polymer/e2e_test/experimental_boot/test/double_init_code.html b/pkg/polymer/e2e_test/experimental_boot/test/double_init_code.html
new file mode 100644
index 0000000..6a6cfdb
--- /dev/null
+++ b/pkg/polymer/e2e_test/experimental_boot/test/double_init_code.html
@@ -0,0 +1 @@
+<script type="application/dart" src="double_init_test.dart"></script>
diff --git a/pkg/polymer/e2e_test/experimental_boot/test/double_init_test.dart b/pkg/polymer/e2e_test/experimental_boot/test/double_init_test.dart
new file mode 100644
index 0000000..fe6a2f2
--- /dev/null
+++ b/pkg/polymer/e2e_test/experimental_boot/test/double_init_test.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 experimental_boot.test.double_init_test;
+
+import 'dart:async';
+import 'dart:js' as js;
+
+import 'package:polymer/polymer.dart';
+import 'package:unittest/html_config.dart';
+import 'package:unittest/unittest.dart';
+
+@initMethod
+init() {
+  useHtmlConfiguration();
+  test('can\'t call initPolymer when using polymer_experimental', () {
+    expect(() => initPolymer(), throwsA("Initialization was already done."));
+  });
+}
diff --git a/pkg/polymer/e2e_test/experimental_boot/test/double_init_test.html b/pkg/polymer/e2e_test/experimental_boot/test/double_init_test.html
new file mode 100644
index 0000000..e3b3e22
--- /dev/null
+++ b/pkg/polymer/e2e_test/experimental_boot/test/double_init_test.html
@@ -0,0 +1,11 @@
+<!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-->
+<link rel="import" href="packages/polymer/polymer_experimental.html">
+<link rel="import" href="double_init_code.html">
+<script src="/root_dart/tools/testing/dart/test_controller.js"></script>
diff --git a/pkg/polymer/example/canonicalization/test/common.dart b/pkg/polymer/e2e_test/experimental_boot/test/import_test.dart
similarity index 63%
copy from pkg/polymer/example/canonicalization/test/common.dart
copy to pkg/polymer/e2e_test/experimental_boot/test/import_test.dart
index 9c0c153..f949f4c 100644
--- a/pkg/polymer/example/canonicalization/test/common.dart
+++ b/pkg/polymer/e2e_test/experimental_boot/test/import_test.dart
@@ -1,35 +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.
-
-/// Tests how canonicalization works when using the deployed app.
-library canonicalization.test.common;
+library experimental_boot.test.import_test;
 
 import 'package:unittest/unittest.dart';
 import 'package:unittest/html_config.dart';
 import 'package:polymer/polymer.dart';
 
-import 'package:canonicalization/a.dart';
-import 'packages/canonicalization/b.dart';
-import 'package:canonicalization/c.dart';
-import 'package:canonicalization/d.dart' as d1;
-import 'packages/canonicalization/d.dart' as d2;
+import 'package:experimental_boot/a.dart' show a;
+import 'packages/experimental_boot/b.dart' show b;
+import 'package:experimental_boot/c.dart' show c;
+import 'package:experimental_boot/d.dart' as d1 show d;
+import 'packages/experimental_boot/d.dart' as d2 show d;
 
-tests() {
+@initMethod
+main() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
 
-  test('canonicalization', () {
+  test('canonicalization with experimental bootstrap', () {
     expect(a, 1, reason:
       'deploy picks the "package:" url as the canonical url for script tags.');
 
     // We shouldn't be using 'packages/' above, so that's ok.
     expect(b, 0, reason:
-      'we pick the "package:" url as the canonical url for script tags.');
+        'we pick the "package:" url as the canonical url for script tags.');
     expect(c, 2, reason: 'c was always imported with "package:" urls.');
     expect(d1.d, 2, reason: 'both a and b are loaded using package: urls');
-
     expect(d2.d, 0, reason: 'both a and b are loaded using package: urls');
   });
 }
diff --git a/pkg/polymer/e2e_test/experimental_boot/test/import_test.html b/pkg/polymer/e2e_test/experimental_boot/test/import_test.html
new file mode 100644
index 0000000..fac8aee
--- /dev/null
+++ b/pkg/polymer/e2e_test/experimental_boot/test/import_test.html
@@ -0,0 +1,17 @@
+<!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>Tests canonicalization using the experimental bootstrap</title>
+    <link rel="import" href="packages/polymer/polymer_experimental.html">
+    <link rel="import" href="packages/experimental_boot/a.html">
+    <link rel="import" href="packages/experimental_boot/f.html">
+    <link rel="import" href="load_dart_code.html">
+    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
+  </head>
+</html>
diff --git a/pkg/polymer/e2e_test/experimental_boot/test/load_dart_code.html b/pkg/polymer/e2e_test/experimental_boot/test/load_dart_code.html
new file mode 100644
index 0000000..a5c7a4c
--- /dev/null
+++ b/pkg/polymer/e2e_test/experimental_boot/test/load_dart_code.html
@@ -0,0 +1,10 @@
+<!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.
+-->
+<!-- We don't load the script directly in import_test.html because
+polymer_experimental doesn't allow script tags in the main document. -->
+<script type="application/dart" src="import_test.dart"></script>
+
diff --git a/pkg/polymer/example/canonicalization2/lib/a.dart b/pkg/polymer/e2e_test/good_import/lib/a.dart
similarity index 74%
copy from pkg/polymer/example/canonicalization2/lib/a.dart
copy to pkg/polymer/e2e_test/good_import/lib/a.dart
index dfbe3ca..842c5de 100644
--- a/pkg/polymer/example/canonicalization2/lib/a.dart
+++ b/pkg/polymer/e2e_test/good_import/lib/a.dart
@@ -2,15 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library canonicalization.a;
+library bad_import1.a;
 
 import 'package:polymer/polymer.dart';
-import 'package:canonicalization/c.dart';
-import 'd.dart';
 
 int a = 0;
 @initMethod initA() {
   a++;
-  c++;
-  d++;
 }
diff --git a/pkg/polymer/example/canonicalization/lib/b.html b/pkg/polymer/e2e_test/good_import/lib/a.html
similarity index 76%
copy from pkg/polymer/example/canonicalization/lib/b.html
copy to pkg/polymer/e2e_test/good_import/lib/a.html
index dc9e034..c359e83 100644
--- a/pkg/polymer/example/canonicalization/lib/b.html
+++ b/pkg/polymer/e2e_test/good_import/lib/a.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart;component=1' src='b.dart'></script>
+<script type='application/dart' src='a.dart'></script>
diff --git a/pkg/polymer/example/canonicalization/lib/b.html b/pkg/polymer/e2e_test/good_import/lib/b.html
similarity index 76%
copy from pkg/polymer/example/canonicalization/lib/b.html
copy to pkg/polymer/e2e_test/good_import/lib/b.html
index dc9e034..f4ae9c4 100644
--- a/pkg/polymer/example/canonicalization/lib/b.html
+++ b/pkg/polymer/e2e_test/good_import/lib/b.html
@@ -3,4 +3,4 @@
 for details. All rights reserved. Use of this source code is governed by a
 BSD-style license that can be found in the LICENSE file.
 -->
-<script type='application/dart;component=1' src='b.dart'></script>
+<link rel="import" href="../../packages/good_import/a.html">
diff --git a/pkg/polymer/e2e_test/good_import/pubspec.yaml b/pkg/polymer/e2e_test/good_import/pubspec.yaml
new file mode 100644
index 0000000..6e0ca1f
--- /dev/null
+++ b/pkg/polymer/e2e_test/good_import/pubspec.yaml
@@ -0,0 +1,8 @@
+name: good_import
+dependencies:
+  polymer: any
+dev_dependencies:
+  unittest: any
+transformers:
+  - polymer:
+      entry_points: test/import_test.html
diff --git a/pkg/polymer/e2e_test/good_import/test/import_test.dart b/pkg/polymer/e2e_test/good_import/test/import_test.dart
new file mode 100644
index 0000000..a9efbd3
--- /dev/null
+++ b/pkg/polymer/e2e_test/good_import/test/import_test.dart
@@ -0,0 +1,22 @@
+// 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.
+
+/// Tests how canonicalization works when using the deployed app.
+library canonicalization.bad_lib_import_negative;
+
+import 'package:unittest/unittest.dart';
+import 'package:unittest/html_config.dart';
+import 'package:polymer/polymer.dart';
+
+import 'package:good_import/a.dart';
+main() {
+  initPolymer();
+  useHtmlConfiguration();
+
+  setUp(() => Polymer.onReady);
+
+  test('html import', () {
+    expect(a, 1, reason: 'html import is resolved correctly.');
+  });
+}
diff --git a/pkg/polymer/example/canonicalization/test/dir/dir1_test.html b/pkg/polymer/e2e_test/good_import/test/import_test.html
similarity index 72%
copy from pkg/polymer/example/canonicalization/test/dir/dir1_test.html
copy to pkg/polymer/e2e_test/good_import/test/import_test.html
index cc1b5c3..b888eb9 100644
--- a/pkg/polymer/example/canonicalization/test/dir/dir1_test.html
+++ b/pkg/polymer/e2e_test/good_import/test/import_test.html
@@ -9,11 +9,11 @@
   <head>
     <title>Tests canonicalization at deployment time</title>
     <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization/a.html">
-    <link rel="import" href="packages/canonicalization/b.html">
+    <link rel="import" href="packages/good_import/b.html">
     <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
   </head>
   <body>
-    <script type="application/dart;component=1" src="dir1_test.dart"></script>
+    <script type="application/dart" onerror="scriptTagOnErrorCallback(null)"
+        src="import_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/example/canonicalization/lib/a.html b/pkg/polymer/example/canonicalization/lib/a.html
deleted file mode 100644
index ea93598..0000000
--- a/pkg/polymer/example/canonicalization/lib/a.html
+++ /dev/null
@@ -1,6 +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.
--->
-<script type='application/dart;component=1' src='a.dart'></script>
diff --git a/pkg/polymer/example/canonicalization/test/canonicalization1_test.dart b/pkg/polymer/example/canonicalization/test/canonicalization1_test.dart
deleted file mode 100644
index 1130a8f..0000000
--- a/pkg/polymer/example/canonicalization/test/canonicalization1_test.dart
+++ /dev/null
@@ -1,10 +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 canonicalization.test.canonizalization1_test;
-
-import 'package:polymer/polymer.dart';
-import 'common.dart';
-
-@initMethod main() => tests();
diff --git a/pkg/polymer/example/canonicalization/test/canonicalization2_test.dart b/pkg/polymer/example/canonicalization/test/canonicalization2_test.dart
deleted file mode 100644
index 3ca67a0..0000000
--- a/pkg/polymer/example/canonicalization/test/canonicalization2_test.dart
+++ /dev/null
@@ -1,10 +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 canonicalization.test.canonizalization2_test;
-
-import 'package:polymer/polymer.dart';
-import 'common.dart';
-
-@initMethod main() => tests();
diff --git a/pkg/polymer/example/canonicalization/test/canonicalization3_test.dart b/pkg/polymer/example/canonicalization/test/canonicalization3_test.dart
deleted file mode 100644
index 962c3d8..0000000
--- a/pkg/polymer/example/canonicalization/test/canonicalization3_test.dart
+++ /dev/null
@@ -1,10 +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 canonicalization.test.canonizalization3_test;
-
-import 'package:polymer/polymer.dart';
-import 'common.dart';
-
-@initMethod main() => tests();
diff --git a/pkg/polymer/example/canonicalization/test/dir/dir1_test.dart b/pkg/polymer/example/canonicalization/test/dir/dir1_test.dart
deleted file mode 100644
index 32d3ae3..0000000
--- a/pkg/polymer/example/canonicalization/test/dir/dir1_test.dart
+++ /dev/null
@@ -1,11 +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.
-
-/// Tests canonicalization at deployment time from a subdir.
-library canonicalization.test.dir1_test;
-
-import 'package:polymer/polymer.dart';
-import '../common.dart';
-
-@initMethod main() => tests();
diff --git a/pkg/polymer/example/canonicalization2/lib/a.html b/pkg/polymer/example/canonicalization2/lib/a.html
deleted file mode 100644
index ea93598..0000000
--- a/pkg/polymer/example/canonicalization2/lib/a.html
+++ /dev/null
@@ -1,6 +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.
--->
-<script type='application/dart;component=1' src='a.dart'></script>
diff --git a/pkg/polymer/example/canonicalization2/lib/b.html b/pkg/polymer/example/canonicalization2/lib/b.html
deleted file mode 100644
index dc9e034..0000000
--- a/pkg/polymer/example/canonicalization2/lib/b.html
+++ /dev/null
@@ -1,6 +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.
--->
-<script type='application/dart;component=1' src='b.dart'></script>
diff --git a/pkg/polymer/example/canonicalization2/lib/g.html b/pkg/polymer/example/canonicalization2/lib/g.html
deleted file mode 100644
index 3897dba..0000000
--- a/pkg/polymer/example/canonicalization2/lib/g.html
+++ /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.
--->
-<!--
-Because this file is under lib/, this URL is broken. It should be either
-'b.html' or '../../packages/canonicalization2/b.html'.
- -->
-<link rel="import" href="../packages/canonicalization2/b.html">
diff --git a/pkg/polymer/example/canonicalization2/pubspec.yaml b/pkg/polymer/example/canonicalization2/pubspec.yaml
deleted file mode 100644
index 868710f..0000000
--- a/pkg/polymer/example/canonicalization2/pubspec.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-name: canonicalization2
-dependencies:
-  polymer:
-    path: ../../
-dev_dependencies:
-  unittest: any
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart
deleted file mode 100644
index 69cd3693..0000000
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.dart
+++ /dev/null
@@ -1,39 +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.
-
-/// Tests how canonicalization works when using the deployed app.
-library canonicalization.dev2_test;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'package:polymer/polymer.dart';
-
-import 'package:canonicalization2/a.dart';
-import 'packages/canonicalization2/b.dart';
-import 'package:canonicalization2/c.dart';
-import 'package:canonicalization2/d.dart' as d1;
-import 'packages/canonicalization2/d.dart' as d2;
-
-@initMethod
-main() {
-  useHtmlConfiguration();
-
-  setUp(() => Polymer.onReady);
-
-  test('canonicalization', () {
-    // "package:" urls work the same during development and deployment
-    expect(a, 1, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-
-    // relative urls do not. true, we shouldn't be using 'packages/' above, so
-    // that's ok.
-    expect(b, 0, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-    expect(c, 2, reason: 'c was always imported with "package:" urls.');
-    expect(d1.d, 2, reason: 'both a and b are loaded using package: urls');
-
-    // same here
-    expect(d2.d, 0, reason: 'both a and b are loaded using package: urls');
-  });
-}
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html b/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html
deleted file mode 100644
index e026952..0000000
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import2_negative_test.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!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>Tests canonicalization at deployment time</title>
-    <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization2/a.html">
-    <link rel="import" href="packages/canonicalization2/g.html">
-    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  </head>
-  <body>
-    <script type="application/dart;component=1"
-            onerror="scriptTagOnErrorCallback(null)"
-            src="bad_lib_import2_negative_test.dart"></script>
-  </body>
-</html>
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart
deleted file mode 100644
index b9611b7..0000000
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.dart
+++ /dev/null
@@ -1,39 +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.
-
-/// Tests how canonicalization works when using the deployed app.
-library canonicalization.bad_lib_import_negative;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'package:polymer/polymer.dart';
-
-import 'package:canonicalization2/a.dart';
-import 'packages/canonicalization2/b.dart';
-import 'package:canonicalization2/c.dart';
-import 'package:canonicalization2/d.dart' as d1;
-import 'packages/canonicalization2/d.dart' as d2;
-
-@initMethod
-main() {
-  useHtmlConfiguration();
-
-  setUp(() => Polymer.onReady);
-
-  test('canonicalization', () {
-    // "package:" urls work the same during development and deployment
-    expect(a, 1, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-
-    // relative urls do not. true, we shouldn't be using 'packages/' above, so
-    // that's ok.
-    expect(b, 0, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-    expect(c, 2, reason: 'c was always imported with "package:" urls.');
-    expect(d1.d, 2, reason: 'both a and b are loaded using package: urls');
-
-    // same here
-    expect(d2.d, 0, reason: 'both a and b are loaded using package: urls');
-  });
-}
diff --git a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html b/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html
deleted file mode 100644
index 52c8beb..0000000
--- a/pkg/polymer/example/canonicalization2/test/bad_lib_import_negative_test.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!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>Tests canonicalization at deployment time</title>
-    <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization2/a.html">
-    <link rel="import" href="packages/canonicalization2/g.html">
-    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  </head>
-  <body>
-    <script type="application/dart;component=1"
-            onerror="scriptTagOnErrorCallback(null)"
-            src="bad_lib_import_negative_test.dart"></script>
-  </body>
-</html>
diff --git a/pkg/polymer/example/canonicalization3/lib/a.dart b/pkg/polymer/example/canonicalization3/lib/a.dart
deleted file mode 100644
index dfbe3ca..0000000
--- a/pkg/polymer/example/canonicalization3/lib/a.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library canonicalization.a;
-
-import 'package:polymer/polymer.dart';
-import 'package:canonicalization/c.dart';
-import 'd.dart';
-
-int a = 0;
-@initMethod initA() {
-  a++;
-  c++;
-  d++;
-}
diff --git a/pkg/polymer/example/canonicalization3/lib/a.html b/pkg/polymer/example/canonicalization3/lib/a.html
deleted file mode 100644
index ea93598..0000000
--- a/pkg/polymer/example/canonicalization3/lib/a.html
+++ /dev/null
@@ -1,6 +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.
--->
-<script type='application/dart;component=1' src='a.dart'></script>
diff --git a/pkg/polymer/example/canonicalization3/lib/b.dart b/pkg/polymer/example/canonicalization3/lib/b.dart
deleted file mode 100644
index fbdccf6..0000000
--- a/pkg/polymer/example/canonicalization3/lib/b.dart
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library canonicalization.b;
-
-import 'package:polymer/polymer.dart';
-import 'package:canonicalization/c.dart';
-import 'd.dart';
-
-int b = 0;
-@initMethod initB() {
-  b++;
-  c++;
-  d++;
-}
diff --git a/pkg/polymer/example/canonicalization3/lib/b.html b/pkg/polymer/example/canonicalization3/lib/b.html
deleted file mode 100644
index dc9e034..0000000
--- a/pkg/polymer/example/canonicalization3/lib/b.html
+++ /dev/null
@@ -1,6 +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.
--->
-<script type='application/dart;component=1' src='b.dart'></script>
diff --git a/pkg/polymer/example/canonicalization3/lib/c.dart b/pkg/polymer/example/canonicalization3/lib/c.dart
deleted file mode 100644
index 362f3e3..0000000
--- a/pkg/polymer/example/canonicalization3/lib/c.dart
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library canonicalization.c;
-
-int c = 0;
diff --git a/pkg/polymer/example/canonicalization3/lib/d.dart b/pkg/polymer/example/canonicalization3/lib/d.dart
deleted file mode 100644
index 7d2a58e..0000000
--- a/pkg/polymer/example/canonicalization3/lib/d.dart
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library canonicalization.d;
-
-int d = 0;
diff --git a/pkg/polymer/example/canonicalization3/pubspec.yaml b/pkg/polymer/example/canonicalization3/pubspec.yaml
deleted file mode 100644
index c11ac90..0000000
--- a/pkg/polymer/example/canonicalization3/pubspec.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
-name: canonicalization3
-dependencies:
-  polymer:
-    path: ../../
-dev_dependencies:
-  unittest: any
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart
deleted file mode 100644
index 7cec7ae..0000000
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.dart
+++ /dev/null
@@ -1,39 +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.
-
-/// Tests how canonicalization works when using the deployed app.
-library canonicalization.dev3_test;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'package:polymer/polymer.dart';
-
-import 'package:canonicalization3/a.dart';
-import 'packages/canonicalization3/b.dart';
-import 'package:canonicalization3/c.dart';
-import 'package:canonicalization3/d.dart' as d1;
-import 'packages/canonicalization3/d.dart' as d2;
-
-@initMethod
-main() {
-  useHtmlConfiguration();
-
-  setUp(() => Polymer.onReady);
-
-  test('canonicalization', () {
-    // "package:" urls work the same during development and deployment
-    expect(a, 1, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-
-    // relative urls do not. true, we shouldn't be using 'packages/' above, so
-    // that's ok.
-    expect(b, 0, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-    expect(c, 2, reason: 'c was always imported with "package:" urls.');
-    expect(d1.d, 2, reason: 'both a and b are loaded using package: urls');
-
-    // same here
-    expect(d2.d, 0, reason: 'both a and b are loaded using package: urls');
-  });
-}
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html b/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html
deleted file mode 100644
index 56127b3..0000000
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import2_negative_test.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!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>Tests canonicalization at deployment time</title>
-    <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization3/a.html">
-    <link rel="import" href="packages/canonicalization3/g.html">
-    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  </head>
-  <body>
-    <script type="application/dart;component=1"
-            onerror="scriptTagOnErrorCallback(null)"
-            src="bad_lib_import2_negative_test.dart"></script>
-  </body>
-</html>
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart
deleted file mode 100644
index 04c3a90..0000000
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.dart
+++ /dev/null
@@ -1,39 +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.
-
-/// Tests how canonicalization works when using the deployed app.
-library canonicalization.bad_lib_import_negative;
-
-import 'package:unittest/unittest.dart';
-import 'package:unittest/html_config.dart';
-import 'package:polymer/polymer.dart';
-
-import 'package:canonicalization3/a.dart';
-import 'packages/canonicalization3/b.dart';
-import 'package:canonicalization3/c.dart';
-import 'package:canonicalization3/d.dart' as d1;
-import 'packages/canonicalization3/d.dart' as d2;
-
-@initMethod
-main() {
-  useHtmlConfiguration();
-
-  setUp(() => Polymer.onReady);
-
-  test('canonicalization', () {
-    // "package:" urls work the same during development and deployment
-    expect(a, 1, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-
-    // relative urls do not. true, we shouldn't be using 'packages/' above, so
-    // that's ok.
-    expect(b, 0, reason:
-      'deploy picks the "package:" url as the canonical url for script tags.');
-    expect(c, 2, reason: 'c was always imported with "package:" urls.');
-    expect(d1.d, 2, reason: 'both a and b are loaded using package: urls');
-
-    // same here
-    expect(d2.d, 0, reason: 'both a and b are loaded using package: urls');
-  });
-}
diff --git a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html b/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html
deleted file mode 100644
index cf81c09..0000000
--- a/pkg/polymer/example/canonicalization3/test/bad_lib_import_negative_test.html
+++ /dev/null
@@ -1,21 +0,0 @@
-<!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>Tests canonicalization at deployment time</title>
-    <link rel="import" href="packages/polymer/polymer.html">
-    <link rel="import" href="packages/canonicalization3/a.html">
-    <link rel="import" href="packages/canonicalization3/g.html">
-    <script src="/root_dart/tools/testing/dart/test_controller.js"></script>
-  </head>
-  <body>
-    <script type="application/dart;component=1"
-            onerror="scriptTagOnErrorCallback(null)"
-            src="bad_lib_import_negative_test.dart"></script>
-  </body>
-</html>
diff --git a/pkg/polymer/example/component/news/test/news_index_test.dart b/pkg/polymer/example/component/news/test/news_index_test.dart
index 192601b..6e0c660 100644
--- a/pkg/polymer/example/component/news/test/news_index_test.dart
+++ b/pkg/polymer/example/component/news/test/news_index_test.dart
@@ -8,8 +8,8 @@
 import 'package:unittest/html_config.dart';
 
 /// This test runs the news example and checks the state of the initial page.
-@initMethod
 main() {
+  initPolymer();
   useHtmlConfiguration();
 
   extractLinks(nodes) => nodes.where((n) => n is Element)
diff --git a/pkg/polymer/example/component/news/test/news_index_test.html b/pkg/polymer/example/component/news/test/news_index_test.html
index c46e48e..1f5ded0 100644
--- a/pkg/polymer/example/component/news/test/news_index_test.html
+++ b/pkg/polymer/example/component/news/test/news_index_test.html
@@ -21,6 +21,6 @@
     <li><a href="//example.com/stories/4">Awesome story</a></li>
     <li class="breaking"><a href="//example.com/stories/5">Horrible story</a></li>
 </ul>
-<script type="application/dart;component=1" src="news_index_test.dart"></script>
+<script type="application/dart" src="news_index_test.dart"></script>
 </body>
 </html>
diff --git a/pkg/polymer/example/component/news/web/index.html b/pkg/polymer/example/component/news/web/index.html
index 4eb17fc..b9e56c9 100644
--- a/pkg/polymer/example/component/news/web/index.html
+++ b/pkg/polymer/example/component/news/web/index.html
@@ -6,7 +6,6 @@
 <html>
 <head>
     <title>Simple Web Components Example</title>
-    <link rel="import" href="packages/polymer/polymer.html">
     <link rel="import" href="news-component.html">
 </head>
 <body>
@@ -19,5 +18,7 @@
     <li><a href="//example.com/stories/4">Awesome story</a></li>
     <li class="breaking"><a href="//example.com/stories/5">Horrible story</a></li>
 </ul>
+  <script type="application/dart">export 'package:polymer/init.dart';</script>
+  <script src='packages/browser/dart.js'></script>
 </body>
 </html>
diff --git a/pkg/polymer/example/component/news/web/news-component.html b/pkg/polymer/example/component/news/web/news-component.html
index 4d81d73..4d86f22 100644
--- a/pkg/polymer/example/component/news/web/news-component.html
+++ b/pkg/polymer/example/component/news/web/news-component.html
@@ -24,7 +24,7 @@
       </ul>
     </div>
   </template>
-  <script type="application/dart;component=1">
+  <script type="application/dart">
     import 'dart:html';
     import 'package:polymer/polymer.dart';
 
diff --git a/pkg/polymer/example/scoped_style/my_test.html b/pkg/polymer/example/scoped_style/my_test.html
index 9816fae..c759c66 100644
--- a/pkg/polymer/example/scoped_style/my_test.html
+++ b/pkg/polymer/example/scoped_style/my_test.html
@@ -5,7 +5,7 @@
     </style>
     <p>Inside element, should be red</p>
   </template>
-  <script type="application/dart;component=1">
+  <script type="application/dart">
     import 'package:polymer/polymer.dart';
 
     @CustomTag('my-test')
diff --git a/pkg/polymer/lib/boot.dart b/pkg/polymer/lib/boot.dart
deleted file mode 100644
index 652709d..0000000
--- a/pkg/polymer/lib/boot.dart
+++ /dev/null
@@ -1,170 +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.
-
-/// Bootstrap to initialize polymer applications. This library is not in use
-/// yet but it will replace boot.js in the near future (see dartbug.com/18007).
-///
-/// This script contains logic to bootstrap polymer apps during development. It
-/// internally discovers special Dart script tags through HTML imports, and
-/// constructs a new entrypoint for the application that is then launched in an
-/// isolate.
-///
-/// For each script tag found, we will load the corresponding Dart library and
-/// execute all methods annotated with `@initMethod` and register all classes
-/// labeled with `@CustomTag`. We keep track of the order of imports and execute
-/// initializers in the same order.
-///
-/// All polymer applications use this bootstrap logic. It is included
-/// automatically when you include the polymer.html import:
-///
-///    <link rel="import" href="packages/polymer/polymer.html">
-///
-/// There are two important changes compared to previous versions of polymer
-/// (0.10.0-pre.6 and older):
-///
-///   * Use 'application/dart;component=1' instead of 'application/dart':
-///   Dartium already limits to have a single script tag per document, but it
-///   will be changing semantics soon and make them even stricter. Multiple
-///   script tags are not going to be running on the same isolate after this
-///   change. For polymer applications we'll use a parameter on the script tags
-///   mime-type to prevent Dartium from loading them separately. Instead this
-///   bootstrap script combines those special script tags and creates the
-///   application Dartium needs to run.
-///
-//    If you had:
-///
-///      <polymer-element name="x-foo"> ...
-///      <script type="application/dart" src="x_foo.dart'></script>
-///
-///   Now you need to write:
-///
-///      <polymer-element name="x-foo"> ...
-///      <script type="application/dart;component=1" src="x_foo.dart'></script>
-///
-///   * `initPolymer` is gone: we used to initialize applications in two
-///   possible ways: using init.dart or invoking initPolymer in your main. Any
-///   of these initialization patterns can be replaced to use an `@initMethod`
-///   instead. For example, If you need to run some initialization code before
-///   any other code is executed, include a "application/dart;component=1"
-///   script tag that contains an initializer method with the body of your old
-///   main, and make sure this tag is placed above other html-imports that load
-///   the rest of the application. Initialization methods are executed in the
-///   order in which they are discovered in the HTML document.
-library polymer.src.boot;
-
-import 'dart:html';
-import 'dart:mirrors';
-
-main() {
-  var scripts = _discoverScripts(document, window.location.href);
-  var sb = new StringBuffer()..write('library bootstrap;\n\n');
-  int count = 0;
-  for (var s in scripts) {
-    sb.writeln("import '$s' as prefix_$count;");
-    count++;
-  }
-  sb.writeln("import 'package:polymer/src/mirror_loader.dart';");
-  sb.write('\nmain() => startPolymerInDevelopment([\n');
-  for (var s in scripts) {
-    sb.writeln("  '$s',");
-  }
-  sb.write(']);\n');
-  var isolateUri = _asDataUri(sb.toString());
-  spawnDomUri(Uri.parse(isolateUri), [], '');
-}
-
-/// Internal state used in [_discoverScripts].
-class _State {
-  /// Documents that we have visited thus far.
-  final Set<Document> seen = new Set();
-
-  /// Scripts that have been discovered, in tree order.
-  final List<String> scripts = [];
-
-  /// Whether we've seen a type="application/dart" script tag, since we expect
-  /// to have only one of those.
-  bool scriptSeen = false;
-}
-
-/// Walks the HTML import structure to discover all script tags that are
-/// implicitly loaded. This code is only used in Dartium and should only be
-/// called after all HTML imports are resolved. Polymer ensures this by asking
-/// users to put their Dart script tags after all HTML imports (this is checked
-/// by the linter, and Dartium will otherwise show an error message).
-List<String> _discoverScripts(Document doc, String baseUri, [_State state]) {
-  if (state == null) state = new _State();
-  if (doc == null) {
-    print('warning: $baseUri not found.');
-    return state.scripts;
-  }
-  if (!state.seen.add(doc)) return state.scripts;
-
-  for (var node in doc.querySelectorAll('script,link[rel="import"]')) {
-    if (node is LinkElement) {
-      _discoverScripts(node.import, node.href, state);
-    } else if (node is ScriptElement) {
-      if (node.type == 'application/dart;component=1') {
-        if (node.src != '' ||
-            node.text != "export 'package:polymer/boot.dart';") {
-          state.scripts.add(_getScriptUrl(node));
-        }
-      }
-
-      if (node.type == 'application/dart') {
-        if (state.scriptSeen) {
-          print('Dartium currently only allows a single Dart script tag '
-              'per application, and in the future it will run them in '
-              'separtate isolates.  To prepare for this Dart script '
-              'tags need to be updated to use the mime-type '
-              '"application/dart;component=1" instead of "application/dart":');
-        }
-        state.scriptSeen = true;
-      }
-    }
-  }
-  return state.scripts;
-}
-
-// TODO(sigmund): explore other (cheaper) ways to resolve URIs relative to the
-// root library (see dartbug.com/12612)
-final _rootUri = currentMirrorSystem().isolate.rootLibrary.uri;
-
-/// Returns a URI that can be used to load the contents of [script] in a Dart
-/// import. This is either the source URI if [script] has a `src` attribute, or
-/// a base64 encoded `data:` URI if the [script] contents are inlined.
-String _getScriptUrl(script) {
-  var uriString = script.src;
-  if (uriString != '') {
-    var uri = _rootUri.resolve(uriString);
-    if (!_isHttpStylePackageUrl(uri)) return '$uri';
-    // Use package: urls if available. This rule here is more permissive than
-    // how we translate urls in polymer-build, but we expect Dartium to limit
-    // the cases where there are differences. The polymer-build issues an error
-    // when using packages/ inside lib without properly stepping out all the way
-    // to the packages folder. If users don't create symlinks in the source
-    // tree, then Dartium will also complain because it won't find the file seen
-    // in an HTML import.
-    var packagePath = uri.path.substring(
-        uri.path.lastIndexOf('packages/') + 'packages/'.length);
-    return 'package:$packagePath';
-  }
-
-  return _asDataUri(script.text);
-}
-
-/// Whether [uri] is an http URI that contains a 'packages' segment, and
-/// therefore could be converted into a 'package:' URI.
-bool _isHttpStylePackageUrl(Uri uri) {
-  var uriPath = uri.path;
-  return uri.scheme == _rootUri.scheme &&
-      // Don't process cross-domain uris.
-      uri.authority == _rootUri.authority &&
-      uriPath.endsWith('.dart') &&
-      (uriPath.contains('/packages/') || uriPath.startsWith('packages/'));
-}
-
-/// Returns a base64 `data:` uri with the contents of [s].
-// TODO(sigmund): change back to application/dart: using text/javascript seems
-// wrong but it hides a warning in Dartium (dartbug.com/18000).
-_asDataUri(s) => 'data:text/javascript;base64,${window.btoa(s)}';
diff --git a/pkg/polymer/lib/boot.js b/pkg/polymer/lib/boot.js
index a4a148e..62d72a7 100644
--- a/pkg/polymer/lib/boot.js
+++ b/pkg/polymer/lib/boot.js
@@ -2,55 +2,35 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// Bootstrap to initialize polymer applications. This library is will be
-/// replaced by boot.dart in the near future (see dartbug.com/18007).
+/// Experimental bootstrap to initialize polymer applications. This library is
+/// not used by default, and may be replaced by Dart code in the near future.
 ///
 /// This script contains logic to bootstrap polymer apps during development. It
-/// internally discovers special Dart script tags through HTML imports, and
-/// constructs a new entrypoint for the application that is then launched in an
-/// isolate.
+/// internally discovers Dart script tags through HTML imports, and constructs
+/// a new entrypoint for the application that is then launched in an isolate.
 ///
 /// For each script tag found, we will load the corresponding Dart library and
 /// execute all methods annotated with `@initMethod` and register all classes
 /// labeled with `@CustomTag`. We keep track of the order of imports and execute
 /// initializers in the same order.
 ///
-/// All polymer applications use this bootstrap logic. It is included
-/// automatically when you include the polymer.html import:
+/// You can this experimental bootstrap logic by including the
+/// polymer_experimental.html import, instead of polymer.html:
 ///
-///    <link rel="import" href="packages/polymer/polymer.html">
+///    <link rel="import" href="packages/polymer/polymer_experimental.html">
 ///
-/// There are two important changes compared to previous versions of polymer
-/// (0.10.0-pre.6 and older):
-///
-///   * Use 'application/dart;component=1' instead of 'application/dart':
-///   Dartium already limits to have a single script tag per document, but it
-///   will be changing semantics soon and make them even stricter. Multiple
-///   script tags are not going to be running on the same isolate after this
-///   change. For polymer applications we'll use a parameter on the script tags
-///   mime-type to prevent Dartium from loading them separately. Instead this
-///   bootstrap script combines those special script tags and creates the
-///   application Dartium needs to run.
-///
-//    If you had:
-///
-///      <polymer-element name="x-foo"> ...
-///      <script type="application/dart" src="x_foo.dart'></script>
-///
-///   Now you need to write:
-///
-///      <polymer-element name="x-foo"> ...
-///      <script type="application/dart;component=1" src="x_foo.dart'></script>
-///
-///   * `initPolymer` is gone: we used to initialize applications in two
-///   possible ways: using `init.dart` or invoking initPolymer in your main. Any
-///   of these initialization patterns can be replaced to use an `@initMethod`
-///   instead. For example, If you need to run some initialization code before
-///   any other code is executed, include a "application/dart;component=1"
-///   script tag that contains an initializer method with the body of your old
-///   main, and make sure this tag is placed above other html-imports that load
-///   the rest of the application. Initialization methods are executed in the
-///   order in which they are discovered in the HTML document.
+/// This bootstrap replaces `initPolymer` so Dart code might need to be changed
+/// too. If you loaded init.dart directly, you can remove it. But if you invoke
+/// initPolymer in your main, you should remove that call and change to use
+/// `@initMethod` instead. The current bootstrap doesn't support having Dart
+/// script tags in the main page, so you may need to move some code into an HTML
+/// import. For example, If you need to run some initialization code before any
+/// other code is executed, include an HTML import to an html file with a
+/// "application/dart" script tag that contains an initializer
+/// method with the body of your old main, and make sure this tag is placed
+/// above other html-imports that load the rest of the application.
+/// Initialization methods are executed in the order in which they are
+/// discovered in the HTML document.
 (function() {
   // Only run in Dartium.
   if (navigator.userAgent.indexOf('(Dart)') === -1) return;
@@ -91,7 +71,7 @@
         '}\n');
   }
 
-  function discoverScripts(content, state) {
+  function discoverScripts(content, state, importedDoc) {
     if (!state) {
       // internal state tracking documents we've visited, the resulting list of
       // scripts, and any tags with the incorrect mime-type.
@@ -111,12 +91,12 @@
 
         if (state.seen[node.href]) continue;
         state.seen[node.href] = node;
-        discoverScripts(node.import, state);
+        discoverScripts(node.import, state, true);
       } else if (node instanceof HTMLScriptElement) {
-        if (node.type == 'application/dart;component=1') {
+        if (node.type != 'application/dart') continue;
+        if (importedDoc) {
           state.scripts.push(getScriptUrl(node));
-        }
-        if (node.type == 'application/dart') {
+        } else {
           state.badTags.push(node);
         }
       }
@@ -133,11 +113,11 @@
 
     var results = discoverScripts(document);
     if (results.badTags.length > 0) {
-      console.warn('Dartium currently only allows a single Dart script tag '
-        + 'per application, and in the future it will run them in '
-        + 'separtate isolates.  To prepare for this all the following '
-        + 'script tags need to be updated to use the mime-type '
-        + '"application/dart;component=1" instead of "application/dart":');
+      console.warn('The experimental polymer boostrap does not support '
+        + 'having script tags in the main document. You can move the script '
+        + 'tag to an HTML import instead. Also make sure your script tag '
+        + 'doesn\'t have a main, but a top-level method marked with '
+        + '@initMethod instead');
       for (var i = 0; i < results.badTags.length; i++) {
         console.warn(results.badTags[i]);
       }
diff --git a/pkg/polymer/lib/polymer.dart b/pkg/polymer/lib/polymer.dart
index 3634266..efa6d5f 100644
--- a/pkg/polymer/lib/polymer.dart
+++ b/pkg/polymer/lib/polymer.dart
@@ -52,8 +52,9 @@
 // *** Important Note ***
 // This import is automatically replaced when calling pub build by the
 // mirrors_remover transformer. The transformer will remove any dependencies on
-// dart:mirrors in deployed polymer apps. This should be updated in sync with
-// changed in lib/src/build/mirrors_remover.dart.
+// dart:mirrors in deployed polymer apps. This and the import to
+// mirror_loader.dart below should be updated in sync with changed in
+// lib/src/build/mirrors_remover.dart.
 //
 // Technically this annotation is not needed now that we have codegen for
 // expressions, but our test bots don't run pub-build yet. Until then, tests
@@ -69,12 +70,14 @@
 
 import 'package:logging/logging.dart' show Logger, Level;
 import 'package:observe/observe.dart';
+import 'package:observe/src/dirty_check.dart' show dirtyCheckZone;
 import 'package:polymer_expressions/polymer_expressions.dart'
     show PolymerExpressions;
 import 'package:smoke/smoke.dart' as smoke;
 import 'package:template_binding/template_binding.dart';
 
 import 'deserialize.dart' as deserialize;
+import 'src/mirror_loader.dart' as loader; // ** see important note above
 
 export 'package:observe/observe.dart';
 export 'package:observe/html.dart';
diff --git a/pkg/polymer/lib/polymer.html b/pkg/polymer/lib/polymer.html
index 5cbaf79..9a90ea1 100644
--- a/pkg/polymer/lib/polymer.html
+++ b/pkg/polymer/lib/polymer.html
@@ -24,9 +24,3 @@
 
 <!-- Teach dart2js about Shadow DOM polyfill objects. -->
 <script src="../../packages/web_components/dart_support.js"></script>
-
-<!-- Bootstrap the user application in a new isolate. -->
-<script src="boot.js"></script>
-<!-- TODO(sigmund): replace boot.js by boot.dart (dartbug.com/18007)
-<script type="application/dart">export "package:polymer/boot.dart";</script>
- -->
diff --git a/pkg/polymer/lib/polymer_experimental.html b/pkg/polymer/lib/polymer_experimental.html
new file mode 100644
index 0000000..f2909de
--- /dev/null
+++ b/pkg/polymer/lib/polymer_experimental.html
@@ -0,0 +1,9 @@
+<!--
+ 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.
+-->
+<link rel="import" href="polymer.html">
+
+<!-- Experimental: bootstrap the user application in a new isolate. -->
+<script src="boot.js"></script>
diff --git a/pkg/polymer/lib/src/build/common.dart b/pkg/polymer/lib/src/build/common.dart
index e25a8a0..2d89f19 100644
--- a/pkg/polymer/lib/src/build/common.dart
+++ b/pkg/polymer/lib/src/build/common.dart
@@ -211,3 +211,5 @@
 /// Regex to split names in the 'attributes' attribute, which supports 'a b c',
 /// 'a,b,c', or even 'a b,c'. This is the same as in `lib/src/declaration.dart`.
 final ATTRIBUTES_REGEX = new RegExp(r'\s|,');
+
+const POLYMER_EXPERIMENTAL_HTML = 'packages/polymer/polymer_experimental.html';
diff --git a/pkg/polymer/lib/src/build/import_inliner.dart b/pkg/polymer/lib/src/build/import_inliner.dart
index e785315..c5624d1 100644
--- a/pkg/polymer/lib/src/build/import_inliner.dart
+++ b/pkg/polymer/lib/src/build/import_inliner.dart
@@ -29,6 +29,7 @@
   final seen = new Set<AssetId>();
   final scriptIds = <AssetId>[];
   final extractedFiles = new Set<AssetId>();
+  bool experimentalBootstrap = false;
 
   /// The number of extracted inline Dart scripts. Used as a counter to give
   /// unique-ish filenames.
@@ -47,8 +48,9 @@
 
     return readPrimaryAsHtml(transform).then((doc) {
       document = doc;
-      // Add the main script's ID, or null if none is present.
-      // This will be used by ScriptCompactor.
+      experimentalBootstrap = document.querySelectorAll('link').any((link) =>
+          link.attributes['rel'] == 'import' &&
+          link.attributes['href'] == POLYMER_EXPERIMENTAL_HTML);
       changed = _extractScripts(document, docId);
       return _visitImports(document);
     }).then((importsFound) {
@@ -63,8 +65,11 @@
 
       // We produce a secondary asset with extra information for later phases.
       transform.addOutput(new Asset.fromString(
-          docId.addExtension('.scriptUrls'),
-          JSON.encode(scriptIds, toEncodable: (id) => id.serialize())));
+          docId.addExtension('._data'),
+          JSON.encode({
+            'experimental_bootstrap': experimentalBootstrap,
+            'script_ids': scriptIds,
+          }, toEncodable: (id) => id.serialize())));
     });
   }
 
@@ -125,8 +130,7 @@
       var type = node.attributes['type'];
       var rel = node.attributes['rel'];
       if (tag == 'style' || tag == 'script' &&
-            (type == null || type == TYPE_JS || type == TYPE_DART_APP ||
-             type == TYPE_DART_COMPONENT) ||
+            (type == null || type == TYPE_JS || type == TYPE_DART) ||
           tag == 'link' && (rel == 'stylesheet' || rel == 'import')) {
         // Move the node into the body, where its contents will be placed.
         doc.body.insertBefore(node, insertionPoint);
@@ -158,15 +162,14 @@
     });
   }
 
-  /// Remove "application/dart;component=1" scripts and remember their
-  /// [AssetId]s for later use.
+  /// Remove all Dart scripts and remember their [AssetId]s for later use.
   ///
   /// Dartium only allows a single script tag per page, so we can't inline
   /// the script tags. Instead we remove them entirely.
   Future<bool> _removeScripts(Document doc) {
     bool changed = false;
     return Future.forEach(doc.querySelectorAll('script'), (script) {
-      if (script.attributes['type'] == TYPE_DART_COMPONENT) {
+      if (script.attributes['type'] == TYPE_DART) {
         changed = true;
         script.remove();
         var src = script.attributes['src'];
@@ -197,16 +200,8 @@
   /// This also validates that there weren't any duplicate scripts.
   bool _extractScripts(Document doc, AssetId sourceId) {
     bool changed = false;
-    bool first = true;
     for (var script in doc.querySelectorAll('script')) {
-      var type = script.attributes['type'];
-      if (type != TYPE_DART_COMPONENT && type != TYPE_DART_APP) continue;
-
-      // only one Dart script per document is supported in Dartium.
-      if (type == TYPE_DART_APP) {
-        if (!first) logger.warning(COMPONENT_WARNING, span: script.sourceSpan);
-        first = false;
-      }
+      if (script.attributes['type'] != TYPE_DART) continue;
 
       var src = script.attributes['src'];
       if (src != null) continue;
@@ -274,8 +269,7 @@
       new _HtmlInliner(options, transform).apply();
 }
 
-const TYPE_DART_APP = 'application/dart';
-const TYPE_DART_COMPONENT = 'application/dart;component=1';
+const TYPE_DART = 'application/dart';
 const TYPE_JS = 'text/javascript';
 
 /// Internally adjusts urls in the html that we are about to inline.
@@ -297,13 +291,11 @@
     });
     if (node.localName == 'style') {
       node.text = visitCss(node.text);
-    } else if (node.localName == 'script') {
-      var type = node.attributes['type'];
+    } else if (node.localName == 'script' &&
+        node.attributes['type'] == TYPE_DART) {
       // TODO(jmesserly): we might need to visit JS too to handle ES Harmony
       // modules.
-      if (type == TYPE_DART_APP || type == TYPE_DART_COMPONENT) {
-        node.text = visitInlineDart(node.text);
-      }
+      node.text = visitInlineDart(node.text);
     }
     super.visitElement(node);
   }
@@ -410,10 +402,3 @@
 ];
 
 _getSpan(SourceFile file, AstNode node) => file.span(node.offset, node.end);
-
-const COMPONENT_WARNING =
-    'More than one Dart script per HTML document is not supported, but in the '
-    'near future Dartium will execute each tag as a separate isolate. If this '
-    'code is meant to load definitions that are part of the same application '
-    'you should switch it to use the "application/dart;component=1" mime-type '
-    'instead.';
diff --git a/pkg/polymer/lib/src/build/linter.dart b/pkg/polymer/lib/src/build/linter.dart
index 668d969..c8e8a18 100644
--- a/pkg/polymer/lib/src/build/linter.dart
+++ b/pkg/polymer/lib/src/build/linter.dart
@@ -76,8 +76,7 @@
       var href = tag.attributes['href'];
       var span = tag.sourceSpan;
       var id = uriToAssetId(sourceId, href, logger, span);
-      if (id == null ||
-          (id.package == 'polymer' && id.path == 'lib/init.html')) continue;
+      if (id == null) continue;
       importIds.add(assetExists(id, transform).then((exists) {
         if (exists) return id;
         if (sourceId == transform.primaryInput.id) {
@@ -141,6 +140,7 @@
   bool _inPolymerElement = false;
   bool _dartTagSeen = false;
   bool _polymerHtmlSeen = false;
+  bool _polymerExperimentalHtmlSeen = false;
   bool _isEntrypoint;
   Map<String, _ElementSummary> _elements;
 
@@ -170,9 +170,13 @@
   void run(Document doc) {
     visit(doc);
 
-    if (_isEntrypoint && !_polymerHtmlSeen) {
+    if (_isEntrypoint && !_polymerHtmlSeen && !_polymerExperimentalHtmlSeen) {
       _logger.warning(USE_POLYMER_HTML, span: doc.body.sourceSpan);
     }
+
+    if (_isEntrypoint && !_dartTagSeen && !_polymerExperimentalHtmlSeen) {
+      _logger.warning(USE_INIT_DART, span: doc.body.sourceSpan);
+    }
   }
 
   /// Produce warnings for invalid link-rel tags.
@@ -181,8 +185,7 @@
     if (rel != 'import' && rel != 'stylesheet') return;
 
     if (rel == 'import' && _dartTagSeen) {
-      _logger.warning(
-          "Move HTML imports above your Dart script tag.",
+      _logger.warning("Move HTML imports above your Dart script tag.",
           span: node.sourceSpan);
     }
 
@@ -194,6 +197,8 @@
 
     if (href == 'packages/polymer/polymer.html') {
       _polymerHtmlSeen = true;
+    } else if (href == POLYMER_EXPERIMENTAL_HTML) {
+      _polymerExperimentalHtmlSeen = true;
     }
     // TODO(sigmund): warn also if href can't be resolved.
   }
@@ -251,21 +256,29 @@
 
   /// Checks for multiple Dart script tags in the same page, which is invalid.
   void _validateScriptElement(Element node) {
+    var scriptType = node.attributes['type'];
+    var isDart = scriptType == 'application/dart';
     var src = node.attributes['src'];
+
+    if (isDart) {
+      if (_dartTagSeen) _logger.warning(ONLY_ONE_TAG, span: node.sourceSpan);
+      if (_isEntrypoint && _polymerExperimentalHtmlSeen) {
+        _logger.warning(NO_DART_SCRIPT_AND_EXPERIMENTAL, span: node.sourceSpan);
+      }
+      _dartTagSeen = true;
+    }
+
     if (src == null) return;
-    var type = node.attributes['type'];
-    bool isDart = type == 'application/dart;component=1' ||
-        type == 'application/dart';
 
     if (src.endsWith('.dart') && !isDart) {
-      _logger.warning('Wrong script type, expected type="application/dart" '
-          'or type="application/dart;component=1".', span: node.sourceSpan);
+      _logger.warning('Wrong script type, expected type="application/dart".',
+          span: node.sourceSpan);
       return;
     }
 
     if (!src.endsWith('.dart') && isDart) {
-      _logger.warning('"$type" scripts should use the .dart file extension.',
-          span: node.sourceSpan);
+      _logger.warning('"application/dart" scripts should use the .dart file '
+          'extension.', span: node.sourceSpan);
       return;
     }
 
@@ -377,10 +390,22 @@
   }
 }
 
-const String USE_POLYMER_HTML =
-    'To run a polymer application you need to include the following HTML '
-    'import: <link rel="import" href="packages/polymer/polymer.html">. This '
-    'will include the common polymer logic needed to boostrap your '
-    'application. The old style of initializing polymer with boot.js or '
-    'initPolymer are now deprecated. ';
+const String ONLY_ONE_TAG =
+    'Only one "application/dart" script tag per document is allowed.';
 
+const String USE_POLYMER_HTML =
+    'Besides the initPolymer invocation, to run a polymer application you need '
+    'to include the following HTML import: '
+    '<link rel="import" href="packages/polymer/polymer.html">. This will '
+    'include the common polymer logic needed to boostrap your application.';
+
+const String USE_INIT_DART =
+    'To run a polymer application, you need to call "initPolymer". You can '
+    'either include a generic script tag that does this for you:'
+    '\'<script type="application/dart">export "package:polymer/init.dart";'
+    '</script>\' or add your own script tag and call that function. '
+    'Make sure the script tag is placed after all HTML imports.';
+
+const String NO_DART_SCRIPT_AND_EXPERIMENTAL =
+    'The experimental bootstrap feature doesn\'t support script tags on '
+    'the main document (for now).';
diff --git a/pkg/polymer/lib/src/build/mirrors_remover.dart b/pkg/polymer/lib/src/build/mirrors_remover.dart
index 19f6fd6..2eb3294 100644
--- a/pkg/polymer/lib/src/build/mirrors_remover.dart
+++ b/pkg/polymer/lib/src/build/mirrors_remover.dart
@@ -32,9 +32,13 @@
       var end = code.indexOf('show MirrorsUsed;', start);
       if (end == -1) _error();
       end = code.indexOf('\n', end);
+      var loaderImport = code.indexOf(
+          "import 'src/mirror_loader.dart' as loader;", end);
+      if (loaderImport == -1) _error();
       var sb = new StringBuffer()
           ..write(code.substring(0, start))
-          ..write(code.substring(end));
+          ..write(code.substring(end)
+              .replaceAll('src/mirror_loader.dart', 'src/static_loader.dart'));
 
       transform.addOutput(new Asset.fromString(id, sb.toString()));
     });
diff --git a/pkg/polymer/lib/src/build/script_compactor.dart b/pkg/polymer/lib/src/build/script_compactor.dart
index 765c463..efd3571 100644
--- a/pkg/polymer/lib/src/build/script_compactor.dart
+++ b/pkg/polymer/lib/src/build/script_compactor.dart
@@ -74,6 +74,9 @@
   /// included on each custom element definition).
   List<AssetId> entryLibraries;
 
+  /// Whether we are using the experimental bootstrap logic.
+  bool experimentalBootstrap;
+
   /// Initializers that will register custom tags or invoke `initMethod`s.
   final List<_Initializer> initializers = [];
 
@@ -111,12 +114,14 @@
 
   /// Populates [entryLibraries] as a list containing the asset ids of each
   /// library loaded on a script tag. The actual work of computing this is done
-  /// in an earlier phase and emited in the `entrypoint.scriptUrls` asset.
+  /// in an earlier phase and emited in the `entrypoint._data` asset.
   Future _loadEntryLibraries(_) =>
-      transform.readInputAsString(docId.addExtension('.scriptUrls'))
-          .then((libraryIds) {
-        entryLibraries = (JSON.decode(libraryIds) as Iterable)
-            .map((data) => new AssetId.deserialize(data)).toList();
+      transform.readInputAsString(docId.addExtension('._data')).then((data) {
+        var map = JSON.decode(data);
+        experimentalBootstrap = map['experimental_bootstrap'];
+        entryLibraries = map['script_ids']
+              .map((id) => new AssetId.deserialize(id))
+              .toList();
       });
 
   /// Removes unnecessary script tags, and identifies the main entry point Dart
@@ -128,7 +133,7 @@
         tag.remove();
         continue;
       }
-      if (tag.attributes['type'] == 'application/dart;component=1') {
+      if (tag.attributes['type'] == 'application/dart') {
         logger.warning('unexpected script. The '
           'ScriptCompactor transformer should run after running the '
           'ImportInliner', span: tag.sourceSpan);
@@ -350,7 +355,11 @@
     generator.writeTopLevelDeclarations(code);
     code.writeln('\nvoid main() {');
     generator.writeInitCall(code);
-    code.write('  startPolymer([');
+    if (experimentalBootstrap) {
+      code.write('  startPolymer([');
+    } else {
+      code.write('  configureForDeployment([');
+    }
 
     // Include initializers to switch from mirrors_loader to static_loader.
     if (!initializers.isEmpty) {
@@ -361,9 +370,12 @@
       }
       code.writeln('    ]);');
     } else {
-      logger.warning(NO_INITIALIZERS_ERROR);
+      if (experimentalBootstrap) logger.warning(NO_INITIALIZERS_ERROR);
       code.writeln(']);');
     }
+    if (!experimentalBootstrap) {
+      code.writeln('  i${entryLibraries.length - 1}.main();');
+    }
     code.writeln('}');
     transform.addOutput(new Asset.fromString(bootstrapId, code.toString()));
 
diff --git a/pkg/polymer/lib/src/declaration.dart b/pkg/polymer/lib/src/declaration.dart
index c3eb0b5..e79f8bd 100644
--- a/pkg/polymer/lib/src/declaration.dart
+++ b/pkg/polymer/lib/src/declaration.dart
@@ -448,7 +448,7 @@
 
   // In deploy mode we should never do a sync XHR; link rel=stylesheet will
   // be inlined into a <style> tag by ImportInliner.
-  if (_deployMode) return '';
+  if (loader.deployMode) return '';
 
   // TODO(jmesserly): sometimes the href property is wrong after deployment.
   var href = sheet.href;
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.html b/pkg/polymer/lib/src/js/polymer/polymer.html
index ae23866..7a92125 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.html
+++ b/pkg/polymer/lib/src/js/polymer/polymer.html
@@ -5,4 +5,4 @@
 -->
 <script src="polymer.js"></script>
 <!-- <link rel="import" href="../polymer-dev/polymer.html"> -->
-<link rel="import" href="polymer-body.html">
\ No newline at end of file
+<link rel="import" href="polymer-body.html">
diff --git a/pkg/polymer/lib/src/loader.dart b/pkg/polymer/lib/src/loader.dart
index 13e8b1c..fb28836 100644
--- a/pkg/polymer/lib/src/loader.dart
+++ b/pkg/polymer/lib/src/loader.dart
@@ -20,32 +20,38 @@
   const InitMethodAnnotation();
 }
 
-/// This method is deprecated. It used to be where polymer initialization
-/// happens, now this is done automatically from bootstrap.dart.
-@deprecated
+/// Initializes a polymer application as follows:
+///   * if running in development mode, set up a dirty-checking zone that polls
+///     for observable changes
+///   * initialize template binding and polymer-element
+///   * for each library included transitively from HTML and HTML imports,
+///   register custom elements declared there (labeled with [CustomTag]) and
+///   invoke the initialization method on it (top-level functions annotated with
+///   [initMethod]).
 Zone initPolymer() {
-  window.console.error(_ERROR);
-  return Zone.current;
+  if (loader.deployMode) {
+    startPolymer(loader.initializers, loader.deployMode);
+    return Zone.current;
+  }
+  return dirtyCheckZone()..run(
+      () => startPolymer(loader.initializers, loader.deployMode));
 }
 
-const _ERROR = '''
-initPolymer is now deprecated. To initialize a polymer app:
-  * add to your page: <link rel="import" href="packages/polymer/polymer.html">
-  * replace "application/dart" mime-types with "application/dart;component=1"
-  * if you use "init.dart", remove it
-  * if you have a main, change it into a method annotated with @initMethod
-''';
-
 /// True if we're in deployment mode.
 bool _deployMode = false;
 
+bool _startPolymerCalled = false;
+
 /// Starts polymer by running all [initializers] and hooking the polymer.js
 /// code. **Note**: this function is not meant to be invoked directly by
-/// application developers. It is invoked by a bootstrap entry point that is
-/// automatically generated. During development, this entry point is generated
-/// dynamically in `boot.js`. Similarly, pub-build generates this entry point
-/// for deployment.
+/// application developers. It is invoked either by [initPolymer] or, if you are
+/// using the experimental bootstrap API, this would be invoked by an entry
+/// point that is automatically generated somehow. In particular, during
+/// development, the entry point would be generated dynamically in `boot.js`.
+/// Similarly, pub-build would generate the entry point for deployment.
 void startPolymer(List<Function> initializers, [bool deployMode = true]) {
+  if (_startPolymerCalled) throw 'Initialization was already done.';
+  _startPolymerCalled = true;
   _hookJsPolymer();
   _deployMode = deployMode;
 
@@ -54,6 +60,15 @@
   }
 }
 
+/// Configures [initPolymer] making it optimized for deployment to the internet.
+/// With this setup the initializer list is supplied instead of searched for
+/// at runtime. Additionally, after this method is called [initPolymer] omits
+/// the [Zone] that automatically invokes [Observable.dirtyCheck].
+void configureForDeployment(List<Function> initializers) {
+  loader.initializers = initializers;
+  loader.deployMode = true;
+}
+
 /// To ensure Dart can interoperate with polymer-element registered by
 /// polymer.js, we need to be able to execute Dart code if we are registering
 /// a Dart class for that element. We trigger Dart logic by patching
diff --git a/pkg/polymer/lib/src/mirror_loader.dart b/pkg/polymer/lib/src/mirror_loader.dart
index 6e8a2bd..c0cea5c 100644
--- a/pkg/polymer/lib/src/mirror_loader.dart
+++ b/pkg/polymer/lib/src/mirror_loader.dart
@@ -22,10 +22,11 @@
 import 'dart:mirrors';
 
 import 'package:logging/logging.dart' show Logger;
-import 'package:polymer/polymer.dart';
 import 'package:observe/src/dirty_check.dart';
+import 'package:polymer/polymer.dart';
 
 
+/// Used by code generated from the experimental polymer bootstrap in boot.js.
 void startPolymerInDevelopment(List<String> librariesToLoad) {
   dirtyCheckZone()..run(() {
     startPolymer(discoverInitializers(librariesToLoad), false);
@@ -36,11 +37,16 @@
 /// list by crawling HTML imports, searching for script tags, and including an
 /// initializer for each type tagged with a [CustomTag] annotation and for each
 /// top-level method annotated with [initMethod].
+List<Function> initializers = discoverInitializers(
+    discoverLibrariesToLoad(document, window.location.href));
+
+/// True if we're in deployment mode.
+bool deployMode = false;
 
 /// Discovers what script tags are loaded from HTML pages and collects the
 /// initializers of their corresponding libraries.
 // Visible for testing only.
-List<Function> discoverInitializers(List<String> librariesToLoad) {
+List<Function> discoverInitializers(Iterable<String> librariesToLoad) {
   var initializers = [];
   for (var lib in librariesToLoad) {
     try {
@@ -54,6 +60,114 @@
   return initializers;
 }
 
+/// Walks the HTML import structure to discover all script tags that are
+/// implicitly loaded. This code is only used in Dartium and should only be
+/// called after all HTML imports are resolved. Polymer ensures this by asking
+/// users to put their Dart script tags after all HTML imports (this is checked
+/// by the linter, and Dartium will otherwise show an error message).
+List<_ScriptInfo> _discoverScripts(Document doc, String baseUri, [_State state]) {
+  if (state == null) state = new _State();
+  if (doc == null) {
+    print('warning: $baseUri not found.');
+    return state.scripts;
+  }
+  if (!state.seen.add(doc)) return state.scripts;
+
+  for (var node in doc.querySelectorAll('script,link[rel="import"]')) {
+    if (node is LinkElement) {
+      _discoverScripts(node.import, node.href, state);
+    } else if (node is ScriptElement && node.type == 'application/dart') {
+      state.scripts.add(_scriptInfoFor(node, baseUri));
+    }
+  }
+  return state.scripts;
+}
+
+/// Internal state used in [_discoverScripts].
+class _State {
+  /// Documents that we have visited thus far.
+  final Set<Document> seen = new Set();
+
+  /// Scripts that have been discovered, in tree order.
+  final List<_ScriptInfo> scripts = [];
+}
+
+/// Holds information about a Dart script tag.
+class _ScriptInfo {
+  /// The original URL seen in the tag fully resolved.
+  final String resolvedUrl;
+
+  /// Whether there was no URL, but code inlined instead.
+  bool get isInline => text != null;
+
+  /// Whether it seems to be a 'package:' URL (starts with the package-root).
+  bool get isPackage => packageUrl != null;
+
+  /// The equivalent 'package:' URL, if any.
+  final String packageUrl;
+
+  /// The inlined text, if any.
+  final String text;
+
+  /// Returns a base64 `data:` uri with the contents of [text].
+  // TODO(sigmund): change back to application/dart: using text/javascript seems
+  // wrong but it hides a warning in Dartium (dartbug.com/18000).
+  String get dataUrl => 'data:text/javascript;base64,${window.btoa(text)}';
+
+  /// URL to import the contents of the original script from Dart. This is
+  /// either the source URL if the script tag had a `src` attribute, or a base64
+  /// encoded `data:` URL if the script contents are inlined, or a `package:`
+  /// URL if the script can be resolved via a package URL.
+  String get importUrl =>
+      isInline ? dataUrl : (isPackage ? packageUrl : resolvedUrl);
+
+  _ScriptInfo(this.resolvedUrl, {this.packageUrl, this.text});
+}
+
+
+// TODO(sigmund): explore other (cheaper) ways to resolve URIs relative to the
+// root library (see dartbug.com/12612)
+final _rootUri = currentMirrorSystem().isolate.rootLibrary.uri;
+
+/// Returns [_ScriptInfo] for [script] which was seen in [baseUri].
+_ScriptInfo _scriptInfoFor(script, baseUri) {
+  var uriString = script.src;
+  if (uriString != '') {
+    var uri = _rootUri.resolve(uriString);
+    if (!_isHttpStylePackageUrl(uri)) return new _ScriptInfo('$uri');
+    // Use package: urls if available. This rule here is more permissive than
+    // how we translate urls in polymer-build, but we expect Dartium to limit
+    // the cases where there are differences. The polymer-build issues an error
+    // when using packages/ inside lib without properly stepping out all the way
+    // to the packages folder. If users don't create symlinks in the source
+    // tree, then Dartium will also complain because it won't find the file seen
+    // in an HTML import.
+    var packagePath = uri.path.substring(
+        uri.path.lastIndexOf('packages/') + 'packages/'.length);
+    return new _ScriptInfo('$uri', packageUrl: 'package:$packagePath');
+  }
+
+  return new _ScriptInfo(baseUri, text: script.text);
+}
+
+/// Whether [uri] is an http URI that contains a 'packages' segment, and
+/// therefore could be converted into a 'package:' URI.
+bool _isHttpStylePackageUrl(Uri uri) {
+  var uriPath = uri.path;
+  return uri.scheme == _rootUri.scheme &&
+      // Don't process cross-domain uris.
+      uri.authority == _rootUri.authority &&
+      uriPath.endsWith('.dart') &&
+      (uriPath.contains('/packages/') || uriPath.startsWith('packages/'));
+}
+
+Iterable<String> discoverLibrariesToLoad(Document doc, String baseUri) =>
+    _discoverScripts(doc, baseUri).map(
+        (info) => _packageUrlExists(info) ? info.packageUrl : info.resolvedUrl);
+
+bool _packageUrlExists(_ScriptInfo info) =>
+    info.isPackage && _libs[Uri.parse(info.packageUrl)] != null;
+
 /// All libraries in the current isolate.
 final _libs = currentMirrorSystem().libraries;
 
diff --git a/pkg/polymer/lib/src/static_loader.dart b/pkg/polymer/lib/src/static_loader.dart
new file mode 100644
index 0000000..7c248aa
--- /dev/null
+++ b/pkg/polymer/lib/src/static_loader.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.
+
+/// Alternative implementation for loading initializers that avoids using
+/// mirrors. Unlike `mirror_loader` this is used for deployed applications to
+/// avoid any dependence on the mirror system.
+library polymer.src.static_loader;
+
+/// Set of initializers that are invoked by `initPolymer`.  This is initialized
+/// with code automatically generated by the polymer transformers. The
+/// initialization code is injected in the entrypoint of the application.
+List<Function> initializers;
+
+/// True if we're in deployment mode.
+// TODO(sigmund): make this a const and remove the assignment in
+// configureForDevelopment when our testing infrastructure supports calling pub
+// build.
+bool deployMode = true;
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index 4a43d08..f7bb7cc 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.10.0-pre.12
+version: 0.10.0-pre.13
 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
@@ -12,7 +12,7 @@
   barback: '>=0.9.0 <0.15.0'
   browser: '>=0.10.0 <0.11.0'
   code_transformers: '>=0.1.0 <0.2.0'
-  html5lib: '>=0.10.0 <0.11.0'
+  html5lib: '>=0.11.0 <0.12.0'
   logging: '>=0.9.0 <0.10.0'
   observe: '>=0.10.0-pre.0 <0.11.0'
   path: '>=0.9.0 <2.0.0'
diff --git a/pkg/polymer/test/attr_deserialize_test.dart b/pkg/polymer/test/attr_deserialize_test.dart
index 55060e1..6274fdb 100644
--- a/pkg/polymer/test/attr_deserialize_test.dart
+++ b/pkg/polymer/test/attr_deserialize_test.dart
@@ -19,8 +19,7 @@
   @published Object json;
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
@@ -47,4 +46,4 @@
         "{here: is, some: json, x: 123} ",
         reason: 'text should match expected HTML template');
   });
-}
+});
diff --git a/pkg/polymer/test/attr_deserialize_test.html b/pkg/polymer/test/attr_deserialize_test.html
index 8179078..35ef320 100644
--- a/pkg/polymer/test/attr_deserialize_test.html
+++ b/pkg/polymer/test/attr_deserialize_test.html
@@ -25,7 +25,6 @@
         json="{'here': 'is', 'some': 'json', 'x': 123}">
     </my-element>
 
-    <script type="application/dart;component=1"
-            src="attr_deserialize_test.dart"></script>
+    <script type="application/dart" src="attr_deserialize_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/attr_mustache_test.dart b/pkg/polymer/test/attr_mustache_test.dart
index d8cb940..19fb79e 100644
--- a/pkg/polymer/test/attr_mustache_test.dart
+++ b/pkg/polymer/test/attr_mustache_test.dart
@@ -44,8 +44,7 @@
   @observable var src = 'testSource';
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
@@ -55,4 +54,4 @@
     final xtarget = xtest.shadowRoot.querySelector('#target');
     return xtarget.foundSrc;
   });
-}
+});
diff --git a/pkg/polymer/test/attr_mustache_test.html b/pkg/polymer/test/attr_mustache_test.html
index 9dc8b7e..42c3b3d 100644
--- a/pkg/polymer/test/attr_mustache_test.html
+++ b/pkg/polymer/test/attr_mustache_test.html
@@ -23,7 +23,6 @@
       </template>
     </polymer-element>
 
-  <script type="application/dart;component=1"
-          src="attr_mustache_test.dart"></script>
+  <script type="application/dart" src="attr_mustache_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/bind_test.dart b/pkg/polymer/test/bind_test.dart
index 512575a..b3a80c4 100644
--- a/pkg/polymer/test/bind_test.dart
+++ b/pkg/polymer/test/bind_test.dart
@@ -43,11 +43,10 @@
   }
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
 
   test('ready called', () => (querySelector('x-foo') as XFoo).onTestDone);
-}
+});
diff --git a/pkg/polymer/test/bind_test.html b/pkg/polymer/test/bind_test.html
index 82aa2d9..7221cce 100644
--- a/pkg/polymer/test/bind_test.html
+++ b/pkg/polymer/test/bind_test.html
@@ -34,6 +34,6 @@
       </template>
     </polymer-element>
 
-    <script type="application/dart;component=1" src="bind_test.dart"></script>
+    <script type="application/dart" src="bind_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/build/all_phases_test.dart b/pkg/polymer/test/build/all_phases_test.dart
index 2427976..5ec31f3 100644
--- a/pkg/polymer/test/build/all_phases_test.dart
+++ b/pkg/polymer/test/build/all_phases_test.dart
@@ -6,8 +6,8 @@
 
 import 'package:code_transformers/tests.dart' show testingDartSdkDirectory;
 import 'package:polymer/src/build/common.dart';
-import 'package:polymer/src/build/import_inliner.dart' show COMPONENT_WARNING;
-import 'package:polymer/src/build/linter.dart' show USE_POLYMER_HTML;
+import 'package:polymer/src/build/linter.dart' show USE_POLYMER_HTML,
+    USE_INIT_DART, ONLY_ONE_TAG;
 import 'package:polymer/src/build/script_compactor.dart' show MAIN_HEADER;
 import 'package:polymer/transformer.dart';
 import 'package:smoke/codegen/generator.dart' show DEFAULT_IMPORTS;
@@ -23,7 +23,8 @@
   testPhases('no changes', phases, {
       'a|web/test.html': '<!DOCTYPE html><html></html>',
     }, {}, [
-      'warning: $USE_POLYMER_HTML'
+      'warning: $USE_POLYMER_HTML',
+      'warning: $USE_INIT_DART'
     ]);
 
   testPhases('observable changes', phases, {
@@ -38,7 +39,7 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '<link rel="import" href="packages/polymer/polymer.html">'
-          '<script type="application/dart;component=1" src="a.dart"></script>',
+          '<script type="application/dart" src="a.dart"></script>',
       'a|web/a.dart': _sampleInput('A', 'foo'),
     }, {
       'a|web/test.html':
@@ -64,20 +65,21 @@
                 declarations: {
                   smoke_0.XA: const {},
                 }));
-            startPolymer([
+            configureForDeployment([
                 i0.m_foo,
                 () => Polymer.register('x-A', i0.XA),
               ]);
+            i0.main();
           }
           '''.replaceAll('\n          ', '\n'),
       'a|web/a.dart': _sampleOutput('A', 'foo'),
-    });
+    }, []);
 
   testPhases('single inline script', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '<link rel="import" href="packages/polymer/polymer.html">'
-          '<script type="application/dart;component=1">'
+          '<script type="application/dart">'
           '${_sampleInput("B", "bar")}</script>',
     }, {
       'a|web/test.html':
@@ -103,93 +105,38 @@
                 declarations: {
                   smoke_0.XB: const {},
                 }));
-            startPolymer([
+            configureForDeployment([
                 i0.m_bar,
                 () => Polymer.register('x-B', i0.XB),
               ]);
+            i0.main();
           }
           '''.replaceAll('\n          ', '\n'),
       'a|web/test.html.0.dart':
           _sampleOutput("B", "bar"),
     });
 
-  testPhases('several application scripts', phases, {
+  testPhases('several scripts', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '<link rel="import" href="packages/polymer/polymer.html">'
-          '<script type="application/dart;component=1" src="a.dart"></script>'
+          '<link rel="import" href="packages/polymer/polymer.html">\n'
+          '<script type="application/dart" src="a.dart"></script>\n'
           '<script type="application/dart">'
           '${_sampleInput("B", "bar")}</script>'
-          '</head><body><div>'
+          '</head><body><div>\n'
           '<script type="application/dart">'
           '${_sampleInput("C", "car")}</script>'
-          '</div>'
+          '</div>\n'
           '<script type="application/dart" src="d.dart"></script>',
       'a|web/a.dart': _sampleInput('A', 'foo'),
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
-          '$WEB_COMPONENTS_TAG'
+          '$WEB_COMPONENTS_TAG\n\n'
           '</head><body>'
-          '<script src="test.html.0.dart.js"></script>'
-          '<div>'                   
-          '<script src="test.html.1.dart.js"></script>'
-          '</div>'
-          '<script src="d.dart.js"></script>'
+          '<div>\n</div>\n'
           '<script src="test.html_bootstrap.dart.js"></script>'
           '</body></html>',
-
-      'a|web/test.html_bootstrap.dart':
-          '''$MAIN_HEADER
-          import 'a.dart' as i0;
-          ${DEFAULT_IMPORTS.join('\n')}
-          import 'a.dart' as smoke_0;
-          import 'package:polymer/polymer.dart' as smoke_1;
-
-          void main() {
-            useGeneratedCode(new StaticConfiguration(
-                checkedMode: false,
-                parents: {
-                  smoke_0.XA: smoke_1.PolymerElement,
-                },
-                declarations: {
-                  smoke_0.XA: const {},
-                }));
-            startPolymer([
-                i0.m_foo,
-                () => Polymer.register('x-A', i0.XA),
-              ]);
-          }
-          '''.replaceAll('\n          ', '\n'),
-      'a|web/a.dart': _sampleOutput('A', 'foo'),
-    }, [
-      // These should not be emitted multiple times. See:
-      // https://code.google.com/p/dart/issues/detail?id=17197
-      'warning: $COMPONENT_WARNING (web/test.html 14 27)',
-      'warning: $COMPONENT_WARNING (web/test.html 28 15)'
-    ]);
-
-  testPhases('several component scripts', phases, {
-      'a|web/test.html':
-          '<!DOCTYPE html><html><head>'
-          '<link rel="import" href="packages/polymer/polymer.html">'
-          '<script type="application/dart;component=1" src="a.dart"></script>'
-          '<script type="application/dart;component=1">'
-          '${_sampleInput("B", "bar")}</script>'
-          '</head><body><div>'
-          '<script type="application/dart;component=1">'
-          '${_sampleInput("C", "car")}</script>'
-          '</div>',
-      'a|web/a.dart': _sampleInput('A', 'foo'),
-    }, {
-      'a|web/test.html':
-          '<!DOCTYPE html><html><head>'
-          '$WEB_COMPONENTS_TAG'
-          '</head><body>'
-          '<div></div>'
-          '<script src="test.html_bootstrap.dart.js"></script>'
-          '</body></html>',
-
       'a|web/test.html_bootstrap.dart':
           '''$MAIN_HEADER
           import 'a.dart' as i0;
@@ -214,7 +161,7 @@
                   smoke_2.XB: const {},
                   smoke_3.XC: const {},
                 }));
-            startPolymer([
+            configureForDeployment([
                 i0.m_foo,
                 () => Polymer.register('x-A', i0.XA),
                 i1.m_bar,
@@ -222,23 +169,31 @@
                 i2.m_car,
                 () => Polymer.register('x-C', i2.XC),
               ]);
+            i2.main();
           }
           '''.replaceAll('\n          ', '\n'),
       'a|web/a.dart': _sampleOutput('A', 'foo'),
-    }, []);
+    }, [
+      // These should not be emitted multiple times. See:
+      // https://code.google.com/p/dart/issues/detail?id=17197
+      'warning: $ONLY_ONE_TAG (web/test.html 2 0)',
+      'warning: $ONLY_ONE_TAG (web/test.html 18 0)',
+      'warning: $ONLY_ONE_TAG (web/test.html 34 0)',
+      'warning: Script file at "d.dart" not found. (web/test.html 34 0)',
+    ]);
 
   testPhases('with imports', phases, {
       'a|web/index.html':
           '<!DOCTYPE html><html><head>'
           '<link rel="import" href="packages/polymer/polymer.html">'
-          '<link rel="import" href="test2.html">'
+          '<link rel="import" href="packages/a/test2.html">'
           '</head><body>'
-          '<script type="application/dart;component=1" src="b.dart"></script>',
+          '<script type="application/dart" src="b.dart"></script>',
       'a|web/b.dart': _sampleInput('B', 'bar'),
-      'a|web/test2.html':
+      'a|lib/test2.html':
           '<!DOCTYPE html><html><head></head><body>'
           '<polymer-element name="x-a">1'
-          '<script type="application/dart;component=1">'
+          '<script type="application/dart">'
           '${_sampleInput("A", "foo")}</script>'
           '</polymer-element></html>',
     }, {
@@ -268,6 +223,63 @@
                   smoke_2.XB: const {},
                   smoke_0.XA: const {},
                 }));
+            configureForDeployment([
+                i0.m_foo,
+                () => Polymer.register('x-A', i0.XA),
+                i1.m_bar,
+                () => Polymer.register('x-B', i1.XB),
+              ]);
+            i1.main();
+          }
+          '''.replaceAll('\n          ', '\n'),
+      'a|web/index.html.0.dart': _sampleOutput("A", "foo"),
+      'a|web/b.dart': _sampleOutput('B', 'bar'),
+    }, []);
+
+  testPhases('experimental bootstrap', phases, {
+      'a|web/index.html':
+          '<!DOCTYPE html><html><head>'
+          '<link rel="import" '
+          'href="packages/polymer/polymer_experimental.html">'
+          '<link rel="import" href="packages/a/test2.html">'
+          '<link rel="import" href="packages/a/load_b.html">',
+      'a|lib/b.dart': _sampleInput('B', 'bar'),
+      'a|lib/test2.html':
+          '<!DOCTYPE html><html><head></head><body>'
+          '<polymer-element name="x-a">1'
+          '<script type="application/dart">'
+          '${_sampleInput("A", "foo")}</script>'
+          '</polymer-element></html>',
+      'a|lib/load_b.html':
+          '<!DOCTYPE html><html><head></head><body>'
+          '<script type="application/dart" src="b.dart"></script>',
+    }, {
+      'a|web/index.html':
+          '<!DOCTYPE html><html><head>'
+          '$WEB_COMPONENTS_TAG'
+          '</head><body><polymer-element name="x-a">1</polymer-element>'
+          '<script src="index.html_bootstrap.dart.js"></script>'
+          '</body></html>',
+      'a|web/index.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'index.html.0.dart' as i0;
+          import 'package:a/b.dart' as i1;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'index.html.0.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
+          import 'package:a/b.dart' as smoke_2;
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                parents: {
+                  smoke_0.XA: smoke_1.PolymerElement,
+                  smoke_2.XB: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_0.XA: const {},
+                  smoke_2.XB: const {},
+                }));
             startPolymer([
                 i0.m_foo,
                 () => Polymer.register('x-A', i0.XA),
@@ -277,8 +289,8 @@
           }
           '''.replaceAll('\n          ', '\n'),
       'a|web/index.html.0.dart': _sampleOutput("A", "foo"),
-      'a|web/b.dart': _sampleOutput('B', 'bar'),
-    });
+      'a|lib/b.dart': _sampleOutput('B', 'bar'),
+    }, []);
 }
 
 String _sampleInput(String className, String fieldName) => '''
@@ -296,6 +308,7 @@
   X${className}.created() : super.created();
 }
 @initMethod m_$fieldName() {}
+main() {}
 ''';
 
 
@@ -321,5 +334,6 @@
   X${className}.created() : super.created();
 }
 @initMethod m_$fieldName() {}
+main() {}
 ''';
 }
diff --git a/pkg/polymer/test/build/code_extractor.dart b/pkg/polymer/test/build/code_extractor.dart
index 813d13d..d9ffad2 100644
--- a/pkg/polymer/test/build/code_extractor.dart
+++ b/pkg/polymer/test/build/code_extractor.dart
@@ -20,22 +20,8 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head></head><body>'
-          '<script type="application/dart" src="test.html.0.dart"></script>'
           '</body></html>',
-
-      'a|web/test.html.0.dart':
-          'library a.web.test_html_0;\nmain() { }',
-    });
-
-  testPhases('component script, no library in script', phases, {
-      'a|web/test.html':
-          '<!DOCTYPE html><html><head>'
-          '<script type="application/dart;component=1">main() { }</script>',
-    }, {
-      'a|web/test.html':
-          '<!DOCTYPE html><html><head></head><body>'
-          '</body></html>',
-
+      'a|web/test.html._data': expectedData(['web/test.html.0.dart']),
       'a|web/test.html.0.dart':
           'library a.web.test_html_0;\nmain() { }',
     });
@@ -47,9 +33,8 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head></head><body>'
-          '<script type="application/dart" src="test.html.0.dart"></script>'
           '</body></html>',
-
+      'a|web/test.html._data': expectedData(['web/test.html.0.dart']),
       'a|web/test.html.0.dart':
           'library f;\nmain() { }',
     });
@@ -57,18 +42,14 @@
   testPhases('under lib/ directory not transformed', phases, {
       'a|lib/test.html':
           '<!DOCTYPE html><html><head>'
-          '<script type="application/dart">library f;\nmain() { }</script>'
-          '<script type="application/dart;component=1">'
-          'library g;\nmain() { }</script>',
+          '<script type="application/dart">library f;\nmain() { }</script>',
     }, {
       'a|lib/test.html':
           '<!DOCTYPE html><html><head>'
           '<script type="application/dart">library f;\nmain() { }</script>'
-          '<script type="application/dart;component=1">'
-          'library g;\nmain() { }</script>',
     });
 
-  testPhases('multiple scripts allowed', phases, {
+  testPhases('multiple scripts - removed', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '<script type="application/dart">library a1;\nmain1() { }</script>'
@@ -76,64 +57,15 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head></head><body>'
-          '<script type="application/dart" src="test.html.0.dart"></script>'
-          '<script type="application/dart" src="test.html.1.dart"></script>'
           '</body></html>',
-
+      'a|web/test.html._data': expectedData(
+          ['web/test.html.0.dart', 'web/test.html.1.dart']),
       'a|web/test.html.0.dart':
           'library a1;\nmain1() { }',
       'a|web/test.html.1.dart':
           'library a2;\nmain2() { }',
     });
 
-  testPhases('component scripts removed', phases, {
-      'a|web/test.html':
-          '<!DOCTYPE html><html><head>'
-          '<script type="application/dart;component=1">'
-          'library a1;\nmain1() { }</script>'
-          '<script type="application/dart;component=1">'
-          'library a2;\nmain2() { }</script>',
-    }, {
-      'a|web/test.html':
-          '<!DOCTYPE html><html><head></head><body>'
-          '</body></html>',
-      'a|web/test.html.scriptUrls': JSON.encode([
-          ["a", "web/test.html.0.dart"],
-          ["a", "web/test.html.1.dart"]]),
-      'a|web/test.html.0.dart':
-          'library a1;\nmain1() { }',
-      'a|web/test.html.1.dart':
-          'library a2;\nmain2() { }',
-    });
-
-  testPhases('multiple deeper scripts', phases, {
-      'a|web/test.html':
-          '<!DOCTYPE html><html><head>'
-          '<script type="application/dart">main1() { }</script>'
-          '</head><body><div>'
-          '<script type="application/dart">main2() { }</script>'
-          '</div><div><div>'
-          '<script type="application/dart">main3() { }</script>'
-          '</div></div>'
-    }, {
-      'a|web/test.html':
-          '<!DOCTYPE html><html><head>'
-          '</head><body>'
-          '<script type="application/dart" src="test.html.0.dart"></script>'
-          '<div>'
-          '<script type="application/dart" src="test.html.1.dart"></script>'
-          '</div><div><div>'
-          '<script type="application/dart" src="test.html.2.dart"></script>'
-          '</div></div></body></html>',
-
-      'a|web/test.html.0.dart':
-          'library a.web.test_html_0;\nmain1() { }',
-      'a|web/test.html.1.dart':
-          'library a.web.test_html_1;\nmain2() { }',
-      'a|web/test.html.2.dart':
-          'library a.web.test_html_2;\nmain3() { }',
-    });
-
   testPhases('multiple imported scripts', phases, {
       'a|web/test.html':
           '<link rel="import" href="test2.html">'
@@ -141,28 +73,40 @@
           '<link rel="import" href="packages/a/foo/test.html">'
           '<link rel="import" href="packages/b/test.html">',
       'a|web/test2.html':
-          '<script type="application/dart;component=1">main1() { }',
+          '<script type="application/dart">main1() { }',
       'a|web/bar/test.html':
-          '<script type="application/dart;component=1">main2() { }',
+          '<script type="application/dart">main2() { }',
       'a|lib/foo/test.html':
-          '<script type="application/dart;component=1">main3() { }',
+          '<script type="application/dart">main3() { }',
       'b|lib/test.html':
-          '<script type="application/dart;component=1">main4() { }'
+          '<script type="application/dart">main4() { }'
     }, {
       'a|web/test.html':
           '<html><head></head><body></body></html>',
-      'a|web/test.html.scriptUrls': JSON.encode([
-        ["a", "web/test.html.0.dart"],
-        ["a", "web/test.html.1.dart"],
-        ["a", "web/test.html.2.dart"],
-        ["a", "web/test.html.3.dart"],
-      ]),
+      'a|web/test.html._data': expectedData(["web/test.html.0.dart",
+          "web/test.html.1.dart", "web/test.html.2.dart",
+          "web/test.html.3.dart"]),
       'a|web/test.html.0.dart': 'library a.web.test2_html_0;\nmain1() { }',
       'a|web/test.html.1.dart': 'library a.web.bar.test_html_1;\nmain2() { }',
       'a|web/test.html.2.dart': 'library a.foo.test_html_2;\nmain3() { }',
       'a|web/test.html.3.dart': 'library b.test_html_3;\nmain4() { }'
     });
 
+  testPhases('experimental bootstrap', phases, {
+      'a|web/test.html':
+          '<link rel="import" '
+          'href="packages/polymer/polymer_experimental.html">'
+          '<link rel="import" href="test2.html">',
+      'a|web/test2.html':
+          '<script type="application/dart">main1() { }',
+    }, {
+      'a|web/test.html':
+          '<html><head></head><body></body></html>',
+      'a|web/test.html._data': expectedData(["web/test.html.0.dart"],
+          experimental: true),
+      'a|web/test.html.0.dart': 'library a.web.test2_html_0;\nmain1() { }',
+    });
+
   group('fixes import/export/part URIs', dartUriTests);
   group('validates script-tag URIs', validateUriTests);
 }
@@ -185,10 +129,8 @@
         '</body></html>',
     }, {
       'a|web/test.html':
-          '<!DOCTYPE html><html><head></head><body>'
-          '<script type="application/dart" src="test.html.0.dart"></script>'
-          '</body></html>',
-      'a|web/test.html.scriptUrls': '[]',
+          '<!DOCTYPE html><html><head></head><body></body></html>',
+      'a|web/test.html._data': expectedData(['web/test.html.0.dart']),
       'a|web/test.html.0.dart':
           "library a.web.test2.foo_html_0;\n"
           "import 'package:qux/qux.dart';"
@@ -197,44 +139,8 @@
           "part 'test2/baz.dart';",
       'a|web/test2/foo.html':
           '<!DOCTYPE html><html><head></head><body>'
-          '<script type="application/dart" src="foo.html.0.dart"></script>'
           '</body></html>',
-      'a|web/test2/foo.html.scriptUrls': '[]',
-      'a|web/test2/foo.html.0.dart':
-          "library a.web.test2.foo_html_0;\n"
-          "import 'package:qux/qux.dart';"
-          "import 'foo.dart';"
-          "export 'bar.dart';"
-          "part 'baz.dart';",
-    });
-
-  testPhases('from web folder, component', phases, {
-      'a|web/test.html':
-          '<!DOCTYPE html><html><head>'
-          '<link rel="import" href="test2/foo.html">'
-          '</head><body></body></html>',
-      'a|web/test2/foo.html':
-        '<!DOCTYPE html><html><head></head><body>'
-        '<script type="application/dart;component=1">'
-        "import 'package:qux/qux.dart';"
-        "import 'foo.dart';"
-        "export 'bar.dart';"
-        "part 'baz.dart';"
-        '</script>'
-        '</body></html>',
-    }, {
-      'a|web/test.html':
-          '<!DOCTYPE html><html><head></head><body></body></html>',
-      'a|web/test.html.scriptUrls': '[["a","web/test.html.0.dart"]]',
-      'a|web/test.html.0.dart':
-          "library a.web.test2.foo_html_0;\n"
-          "import 'package:qux/qux.dart';"
-          "import 'test2/foo.dart';"
-          "export 'test2/bar.dart';"
-          "part 'test2/baz.dart';",
-      'a|web/test2/foo.html':
-          '<!DOCTYPE html><html><head></head><body></body></html>',
-      'a|web/test2/foo.html.scriptUrls': '[["a","web/test2/foo.html.0.dart"]]',
+      'a|web/test2/foo.html._data': expectedData(['web/test2/foo.html.0.dart']),
       'a|web/test2/foo.html.0.dart':
           "library a.web.test2.foo_html_0;\n"
           "import 'package:qux/qux.dart';"
@@ -250,7 +156,7 @@
           '</head><body></body></html>',
       'a|lib/test2/foo.html':
         '<!DOCTYPE html><html><head></head><body>'
-        '<script type="application/dart;component=1">'
+        '<script type="application/dart">'
         "import 'package:qux/qux.dart';"
         "import 'foo.dart';"
         "export 'bar.dart';"
@@ -260,7 +166,7 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head></head><body></body></html>',
-      'a|web/test.html.scriptUrls': '[["a","web/test.html.0.dart"]]',
+      'a|web/test.html._data': expectedData(['web/test.html.0.dart']),
       'a|web/test.html.0.dart':
           "library a.test2.foo_html_0;\n"
           "import 'package:qux/qux.dart';"
@@ -269,7 +175,7 @@
           "part 'package:a/test2/baz.dart';",
       'a|lib/test2/foo.html':
           '<!DOCTYPE html><html><head></head><body>'
-          '<script type="application/dart;component=1">'
+          '<script type="application/dart">'
           "import 'package:qux/qux.dart';"
           "import 'foo.dart';"
           "export 'bar.dart';"
@@ -285,7 +191,7 @@
           '</head><body></body></html>',
       'b|lib/test2/foo.html':
         '<!DOCTYPE html><html><head></head><body>'
-        '<script type="application/dart;component=1">'
+        '<script type="application/dart">'
         "import 'package:qux/qux.dart';"
         "import 'foo.dart';"
         "export 'bar.dart';"
@@ -295,7 +201,7 @@
     }, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head></head><body></body></html>',
-      'a|web/test.html.scriptUrls': '[["a","web/test.html.0.dart"]]',
+      'a|web/test.html._data': expectedData(['web/test.html.0.dart']),
       'a|web/test.html.0.dart':
           "library b.test2.foo_html_0;\n"
           "import 'package:qux/qux.dart';"
@@ -304,7 +210,7 @@
           "part 'package:b/test2/baz.dart';",
       'b|lib/test2/foo.html':
           '<!DOCTYPE html><html><head></head><body>'
-          '<script type="application/dart;component=1">'
+          '<script type="application/dart">'
           "import 'package:qux/qux.dart';"
           "import 'foo.dart';"
           "export 'bar.dart';"
@@ -319,31 +225,31 @@
   testPhases('script is inline', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><body>'
-          '<script type="application/dart;component=1">'
+          '<script type="application/dart">'
           'main(){}'
           '</script>'
           '</body></html>',
     }, {
-      'a|web/test.html.scriptUrls': '[["a","web/test.html.0.dart"]]',
+      'a|web/test.html._data': expectedData(['web/test.html.0.dart']),
     }, []);
 
   testPhases('script src is valid', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><body>'
-          '<script type="application/dart;component=1" src="a.dart"></script>'
+          '<script type="application/dart" src="a.dart"></script>'
           '</body></html>',
       'a|web/a.dart': 'main() {}',
     }, {
-      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/test.html._data': expectedData(['web/a.dart']),
     }, []);
 
   testPhases('script src is invalid', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><body>\n'
-          '<script type="application/dart;component=1" src="a.dart"></script>'
+          '<script type="application/dart" src="a.dart"></script>'
           '</body></html>',
     }, {
-      'a|web/test.html.scriptUrls': '[]',
+      'a|web/test.html._data': EMPTY_DATA,
     }, [
       'warning: Script file at "a.dart" not found. (web/test.html 1 0)',
     ]);
@@ -351,15 +257,15 @@
   testPhases('many script src around, valid and invalid', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><body>'
-          '<script type="application/dart;component=1" src="a.dart"></script>'
-          '\n<script type="application/dart;component=1" src="b.dart"></script>'
-          '\n<script type="application/dart;component=1" src="c.dart"></script>'
-          '\n<script type="application/dart;component=1" src="d.dart"></script>'
+          '<script type="application/dart" src="a.dart"></script>'
+          '\n<script type="application/dart" src="b.dart"></script>'
+          '\n<script type="application/dart" src="c.dart"></script>'
+          '\n<script type="application/dart" src="d.dart"></script>'
           '</body></html>',
       'a|web/a.dart': 'main() {}',
       'a|web/c.dart': 'main() {}',
     }, {
-      'a|web/test.html.scriptUrls': '[["a","web/a.dart"],["a","web/c.dart"]]',
+      'a|web/test.html._data': expectedData(['web/a.dart', 'web/c.dart']),
     }, [
       'warning: Script file at "b.dart" not found. (web/test.html 1 0)',
       'warning: Script file at "d.dart" not found. (web/test.html 3 0)',
diff --git a/pkg/polymer/test/build/common.dart b/pkg/polymer/test/build/common.dart
index 17c254a..7e824e1 100644
--- a/pkg/polymer/test/build/common.dart
+++ b/pkg/polymer/test/build/common.dart
@@ -137,14 +137,31 @@
   });
 }
 
+solo_testPhases(String testName, List<List<Transformer>> phases,
+    Map<String, String> inputFiles, Map<String, String> expectedFiles,
+    [List<String> expectedMessages]) =>
+  testPhases(testName, phases, inputFiles, expectedFiles, expectedMessages,
+      true);
+
+/// Generate an expected ._data file, where all files are assumed to be in the
+/// same [package].
+String expectedData(List<String> urls, {package: 'a', experimental: false}) {
+  var ids = urls.map((e) => '["$package","$e"]').join(',');
+  return '{"experimental_bootstrap":$experimental,"script_ids":[$ids]}';
+}
+
+const EMPTY_DATA = '{"experimental_bootstrap":false,"script_ids":[]}';
+
 const WEB_COMPONENTS_TAG =
     '<script src="packages/web_components/platform.js"></script>\n'
     '<script src="packages/web_components/dart_support.js"></script>\n';
 
+const INTEROP_TAG = '<script src="packages/browser/interop.js"></script>\n';
 const DART_JS_TAG = '<script src="packages/browser/dart.js"></script>';
 
 const POLYMER_MOCKS = const {
-  'polymer|lib/polymer.html': '<!DOCTYPE html><html></html>',
+  'polymer|lib/polymer.html': '<!DOCTYPE html><html>',
+  'polymer|lib/polymer_experimental.html': '<!DOCTYPE html><html>',
   'polymer|lib/polymer.dart':
       'library polymer;\n'
       'import "dart:html";\n'
diff --git a/pkg/polymer/test/build/import_inliner_test.dart b/pkg/polymer/test/build/import_inliner_test.dart
index 6684c5b..ec2be6a 100644
--- a/pkg/polymer/test/build/import_inliner_test.dart
+++ b/pkg/polymer/test/build/import_inliner_test.dart
@@ -27,7 +27,7 @@
       'a|web/test.html': '<!DOCTYPE html><html></html>',
     }, {
       'a|web/test.html': '<!DOCTYPE html><html></html>',
-      'a|web/test.html.scriptUrls': '[]',
+      'a|web/test.html._data': EMPTY_DATA,
     });
 
   testPhases('empty import', phases, {
@@ -43,11 +43,11 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '</head><body></body></html>',
-      'a|web/test.html.scriptUrls': '[]',
+      'a|web/test.html._data': EMPTY_DATA,
       'a|web/test2.html':
           '<!DOCTYPE html><html><head>'
           '</head><body></body></html>',
-      'a|web/test2.html.scriptUrls': '[]',
+      'a|web/test2.html._data': EMPTY_DATA,
     });
 
   testPhases('shallow, no elements', phases, {
@@ -62,11 +62,11 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '</head><body></body></html>',
-      'a|web/test.html.scriptUrls': '[]',
+      'a|web/test.html._data': EMPTY_DATA,
       'a|web/test2.html':
           '<!DOCTYPE html><html><head>'
           '</head></html>',
-      'a|web/test2.html.scriptUrls': '[]',
+      'a|web/test2.html._data': EMPTY_DATA,
     });
 
   testPhases('shallow, elements, one import', phases,
@@ -84,11 +84,11 @@
           '</head><body>'
           '<polymer-element>2</polymer-element>'
           '</body></html>',
-      'a|web/test.html.scriptUrls': '[]',
+      'a|web/test.html._data': EMPTY_DATA,
       'a|web/test2.html':
           '<!DOCTYPE html><html><head>'
           '</head><body><polymer-element>2</polymer-element></html>',
-      'a|web/test2.html.scriptUrls': '[]',
+      'a|web/test2.html._data': EMPTY_DATA,
     });
 
   testPhases('preserves order of scripts', phases,
@@ -114,58 +114,26 @@
           '<polymer-element>2</polymer-element>'
           '<script>/*forth*/</script>'
           '</body></html>',
-      'a|web/test.html.scriptUrls': '[]',
+      'a|web/test.html._data': EMPTY_DATA,
       'a|web/test2.html':
           '<!DOCTYPE html><html><head><script>/*third*/</script>'
           '</head><body><polymer-element>2</polymer-element></html>',
-      'a|web/test2.html.scriptUrls': '[]',
+      'a|web/test2.html._data': EMPTY_DATA,
       'a|web/second.js': '/*second*/'
     });
 
-  testPhases('preserves order of scripts, including Dart scripts', phases,
+  testPhases('preserves order of scripts, extract Dart scripts', phases,
     {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '<script type="text/javascript">/*first*/</script>'
           '<script src="second.js"></script>'
           '<link rel="import" href="test2.html">'
+          '<script type="application/dart">/*fifth*/</script>'
+          '</head></html>',
+      'a|web/test2.html':
+          '<!DOCTYPE html><html><head><script>/*third*/</script>'
           '<script type="application/dart">/*forth*/</script>'
-          '</head></html>',
-      'a|web/test2.html':
-          '<!DOCTYPE html><html><head><script>/*third*/</script>'
-          '</head><body><polymer-element>2</polymer-element></html>',
-      'a|web/second.js': '/*second*/'
-    }, {
-      'a|web/test.html':
-          '<!DOCTYPE html><html><head>'
-          '</head><body>'
-          '<script type="text/javascript">/*first*/</script>'
-          '<script src="second.js"></script>'
-          '<script>/*third*/</script>'
-          '<polymer-element>2</polymer-element>'
-          '<script type="application/dart" src="test.html.0.dart"></script>'
-          '</body></html>',
-      'a|web/test.html.scriptUrls': '[]',
-      'a|web/test.html.0.dart': 'library a.web.test_html_0;\n/*forth*/',
-      'a|web/test2.html':
-          '<!DOCTYPE html><html><head><script>/*third*/</script>'
-          '</head><body><polymer-element>2</polymer-element></html>',
-      'a|web/test2.html.scriptUrls': '[]',
-      'a|web/second.js': '/*second*/'
-    });
-
-  testPhases('preserves order, extract component scripts', phases,
-    {
-      'a|web/test.html':
-          '<!DOCTYPE html><html><head>'
-          '<script type="text/javascript">/*first*/</script>'
-          '<script src="second.js"></script>'
-          '<link rel="import" href="test2.html">'
-          '<script type="application/dart;component=1">/*forth*/</script>'
-          '<script type="application/dart;component=1">/*fifth*/</script>'
-          '</head></html>',
-      'a|web/test2.html':
-          '<!DOCTYPE html><html><head><script>/*third*/</script>'
           '</head><body><polymer-element>2</polymer-element></html>',
       'a|web/second.js': '/*second*/'
     }, {
@@ -177,14 +145,15 @@
           '<script>/*third*/</script>'
           '<polymer-element>2</polymer-element>'
           '</body></html>',
-      'a|web/test.html.scriptUrls':
-          '[["a","web/test.html.0.dart"],["a","web/test.html.1.dart"]]',
-      'a|web/test.html.0.dart': 'library a.web.test_html_0;\n/*forth*/',
-      'a|web/test.html.1.dart': 'library a.web.test_html_1;\n/*fifth*/',
+      'a|web/test.html._data': expectedData([
+          'web/test.html.1.dart','web/test.html.0.dart']),
+      'a|web/test.html.1.dart': 'library a.web.test2_html_1;\n/*forth*/',
+      'a|web/test.html.0.dart': 'library a.web.test_html_0;\n/*fifth*/',
       'a|web/test2.html':
-          '<!DOCTYPE html><html><head><script>/*third*/</script>'
-          '</head><body><polymer-element>2</polymer-element></html>',
-      'a|web/test2.html.scriptUrls': '[]',
+          '<!DOCTYPE html><html><head></head><body><script>/*third*/</script>'
+          '<polymer-element>2</polymer-element></body></html>',
+      'a|web/test2.html._data': expectedData(['web/test2.html.0.dart']),
+      'a|web/test2.html.0.dart': 'library a.web.test2_html_0;\n/*forth*/',
       'a|web/second.js': '/*second*/'
     });
 
@@ -402,7 +371,7 @@
           '<script src="s2"></script>'
           '<polymer-element>1</polymer-element>'
           '<script src="s1"></script></body></html>',
-      'a|web/test.html.scriptUrls': '[]',
+      'a|web/test.html._data': EMPTY_DATA,
       'a|web/test_1.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
@@ -410,7 +379,7 @@
           '<script src="s2"></script>'
           '<polymer-element>1</polymer-element>'
           '<script src="s1"></script></body></html>',
-      'a|web/test_1.html.scriptUrls': '[]',
+      'a|web/test_1.html._data': EMPTY_DATA,
       'a|web/test_2.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
@@ -418,7 +387,7 @@
           '<script src="s1"></script>'
           '<polymer-element>2</polymer-element>'
           '<script src="s2"></script></body></html>',
-      'a|web/test_2.html.scriptUrls': '[]',
+      'a|web/test_2.html._data': EMPTY_DATA,
     });
 
   testPhases('imports cycle, 1-step lasso, Dart scripts too', phases, {
@@ -430,60 +399,13 @@
           '<!DOCTYPE html><html><head>'
           '<link rel="import" href="test_2.html">'
           '</head><body><polymer-element>1</polymer-element>'
-          '<script type="application/dart" src="s1.dart"></script></html>',
-      'a|web/test_2.html':
-          '<!DOCTYPE html><html><head>'
-          '<link rel="import" href="test_1.html">'
-          '</head><body><polymer-element>2</polymer-element>'
-          '<script type="application/dart" src="s2.dart"></script></html>',
-      'a|web/s1.dart': '',
-      'a|web/s2.dart': '',
-    }, {
-      'a|web/test.html':
-          '<!DOCTYPE html><html><head>'
-          '</head><body>'
-          '<polymer-element>2</polymer-element>'
-          '<script type="application/dart" src="s2.dart"></script>'
-          '<polymer-element>1</polymer-element>'
-          '<script type="application/dart" src="s1.dart"></script>'
-          '</body></html>',
-      'a|web/test.html.scriptUrls': '[]',
-      'a|web/test_1.html':
-          '<!DOCTYPE html><html><head>'
-          '</head><body>'
-          '<polymer-element>2</polymer-element>'
-          '<script type="application/dart" src="s2.dart"></script>'
-          '<polymer-element>1</polymer-element>'
-          '<script type="application/dart" src="s1.dart"></script>'
-          '</body></html>',
-      'a|web/test_1.html.scriptUrls': '[]',
-      'a|web/test_2.html':
-          '<!DOCTYPE html><html><head>'
-          '</head><body>'
-          '<polymer-element>1</polymer-element>'
-          '<script type="application/dart" src="s1.dart"></script>'
-          '<polymer-element>2</polymer-element>'
-          '<script type="application/dart" src="s2.dart"></script>'
-          '</body></html>',
-      'a|web/test_2.html.scriptUrls': '[]',
-    });
-
-  testPhases('imports cycle, 1-step lasso, Dart components scripts', phases, {
-      'a|web/test.html':
-          '<!DOCTYPE html><html><head>'
-          '<link rel="import" href="test_1.html">'
-          '</head></html>',
-      'a|web/test_1.html':
-          '<!DOCTYPE html><html><head>'
-          '<link rel="import" href="test_2.html">'
-          '</head><body><polymer-element>1</polymer-element>'
-          '<script type="application/dart;component=1" src="s1.dart">'
+          '<script type="application/dart" src="s1.dart">'
           '</script></html>',
       'a|web/test_2.html':
           '<!DOCTYPE html><html><head>'
           '<link rel="import" href="test_1.html">'
           '</head><body><polymer-element>2'
-          '<script type="application/dart;component=1" src="s2.dart"></script>'
+          '<script type="application/dart" src="s2.dart"></script>'
           '</polymer-element>'
           '</html>',
       'a|web/s1.dart': '',
@@ -495,23 +417,22 @@
           '<polymer-element>2</polymer-element>'
           '<polymer-element>1</polymer-element>'
           '</body></html>',
-      'a|web/test.html.scriptUrls': '[["a","web/s2.dart"],["a","web/s1.dart"]]',
+      'a|web/test.html._data': expectedData(['web/s2.dart', 'web/s1.dart']),
       'a|web/test_1.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
           '<polymer-element>2</polymer-element>'
           '<polymer-element>1</polymer-element>'
           '</body></html>',
-      'a|web/test_1.html.scriptUrls':
-          '[["a","web/s2.dart"],["a","web/s1.dart"]]',
+      'a|web/test_1.html._data': expectedData(['web/s2.dart', 'web/s1.dart']),
       'a|web/test_2.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
           '<polymer-element>1</polymer-element>'
-          '<polymer-element>2</polymer-element>'
+          '<polymer-element>2'
+          '</polymer-element>'
           '</body></html>',
-      'a|web/test_2.html.scriptUrls':
-          '[["a","web/s1.dart"],["a","web/s2.dart"]]',
+      'a|web/test_2.html._data': expectedData(['web/s1.dart', 'web/s2.dart']),
     });
 
   testPhases('imports with Dart script after JS script', phases, {
@@ -526,7 +447,7 @@
           '<foo>42</foo><bar-baz></bar-baz>'
           '<polymer-element>1'
           '<script src="s1.js"></script>'
-          '<script type="application/dart;component=1" src="s1.dart"></script>'
+          '<script type="application/dart" src="s1.dart"></script>'
           '</polymer-element>'
           'FOO</body></html>',
       'a|web/s1.dart': '',
@@ -539,7 +460,7 @@
           '<script src="s1.js"></script>'
           '</polymer-element>'
           'FOO</body></html>',
-      'a|web/test.html.scriptUrls': '[["a","web/s1.dart"]]',
+      'a|web/test.html._data': expectedData(['web/s1.dart']),
       'a|web/test_1.html':
           '<!DOCTYPE html><html><head>'
           '</head><body>'
@@ -548,7 +469,7 @@
           '<script src="s1.js"></script>'
           '</polymer-element>'
           'FOO</body></html>',
-      'a|web/test_1.html.scriptUrls': '[["a","web/s1.dart"]]',
+      'a|web/test_1.html._data': expectedData(['web/s1.dart']),
     });
 
   testPhases('imports cycle, 2-step lasso', phases, {
@@ -672,12 +593,12 @@
         '<!DOCTYPE html><html><head>'
         '<link rel="stylesheet" href="">' // empty href
         '</head></html>',
-      'a|web/test.html.scriptUrls': '[]',
+      'a|web/test.html._data': EMPTY_DATA,
       'a|web/test2.html':
         '<!DOCTYPE html><html><head>'
         '<link rel="stylesheet">'         // no href
         '</head></html>',
-      'a|web/test2.html.scriptUrls': '[]',
+      'a|web/test2.html._data': EMPTY_DATA,
     });
 
   testPhases('absolute uri', phases, {
@@ -694,12 +615,12 @@
           '<!DOCTYPE html><html><head>'
           '<link rel="stylesheet" href="/foo.css">'
           '</head></html>',
-      'a|web/test.html.scriptUrls': '[]',
+      'a|web/test.html._data': EMPTY_DATA,
       'a|web/test2.html':
           '<!DOCTYPE html><html><head>'
           '<link rel="stylesheet" href="http://example.com/bar.css">'
           '</head></html>',
-      'a|web/test2.html.scriptUrls': '[]',
+      'a|web/test2.html._data': EMPTY_DATA,
     });
 
   testPhases('shallow, inlines css', phases, {
@@ -714,7 +635,7 @@
           '<!DOCTYPE html><html><head></head><body>'
           '<style>h1 { font-size: 70px; }</style>'
           '</body></html>',
-      'a|web/test.html.scriptUrls': '[]',
+      'a|web/test.html._data': EMPTY_DATA,
       'a|web/test2.css':
           'h1 { font-size: 70px; }',
     });
@@ -814,7 +735,7 @@
           '<style>h1 { font-size: 70px; }</style>'
           '<style>.second { color: black }</style>'
           '</body></html>',
-      'a|web/test.html.scriptUrls': '[]',
+      'a|web/test.html._data': EMPTY_DATA,
       'a|web/test2.css':
           'h1 { font-size: 70px; }',
     });
diff --git a/pkg/polymer/test/build/linter_test.dart b/pkg/polymer/test/build/linter_test.dart
index 341e238..e066960 100644
--- a/pkg/polymer/test/build/linter_test.dart
+++ b/pkg/polymer/test/build/linter_test.dart
@@ -15,7 +15,7 @@
       'a|lib/test.html': '<!DOCTYPE html><html></html>',
     }, []);
 
-  group('must have import to polymer.html', () {
+  group('must have proper initialization imports', () {
     _testLinter('nothing to report', {
         'a|web/test.html': '<!DOCTYPE html><html>'
             '<link rel="import" href="packages/polymer/polymer.html">'
@@ -25,15 +25,8 @@
             '</html>',
       }, []);
 
-    _testLinter('missing everything', {
-        'a|web/test.html': '<!DOCTYPE html><html></html>',
-      }, [
-        'warning: $USE_POLYMER_HTML',
-      ]);
-
-    _testLinter('using deprecated boot.js', {
-        'a|web/test.html': '<!DOCTYPE html><html>\n'
-            '<script src="packages/polymer/boot.js"></script>'
+    _testLinter('missing polymer.html', {
+        'a|web/test.html': '<!DOCTYPE html><html>'
             '<script type="application/dart" src="foo.dart">'
             '</script>'
             '<script src="packages/browser/dart.js"></script>'
@@ -41,8 +34,45 @@
       }, [
         'warning: $USE_POLYMER_HTML',
       ]);
+
+    _testLinter('missing Dart code', {
+        'a|web/test.html': '<!DOCTYPE html><html>'
+            '<link rel="import" href="packages/polymer/polymer.html">'
+            '<script src="packages/browser/dart.js"></script>'
+            '</html>',
+      }, [
+        'warning: $USE_INIT_DART',
+      ]);
+
+    _testLinter('nothing to report, experimental with no Dart code', {
+        'a|web/test.html': '<!DOCTYPE html><html>'
+            '<link rel="import" '
+            'href="packages/polymer/polymer_experimental.html">'
+            '<script src="packages/browser/dart.js"></script>'
+            '</html>',
+      }, []);
+
+    _testLinter('experimental cannot have Dart code in main document', {
+        'a|web/test.html': '<!DOCTYPE html><html>'
+            '<link rel="import" '
+            'href="packages/polymer/polymer_experimental.html">\n'
+            '<script type="application/dart" src="foo.dart">'
+            '</script>'
+            '<script src="packages/browser/dart.js"></script>'
+            '</html>',
+      }, [
+        'warning: $NO_DART_SCRIPT_AND_EXPERIMENTAL (web/test.html 1 0)',
+      ]);
+
+    _testLinter('missing Dart code and polymer.html', {
+        'a|web/test.html': '<!DOCTYPE html><html></html>',
+      }, [
+        'warning: $USE_POLYMER_HTML',
+        'warning: $USE_INIT_DART',
+      ]);
   });
-  group('multiple script tag per document allowed', () {
+
+  group('single script tag per document', () {
     _testLinter('two top-level tags', {
         'a|web/test.html': '<!DOCTYPE html><html>'
             '<link rel="import" href="packages/polymer/polymer.html">'
@@ -50,8 +80,23 @@
             '</script>\n'
             '<script type="application/dart" src="b.dart">'
             '</script>'
+            '<script src="packages/browser/dart.js"></script>',
+      }, [
+        'warning: Only one "application/dart" script tag per document is'
+        ' allowed. (web/test.html 1 0)',
+      ]);
+
+    _testLinter('two top-level tags, non entrypoint', {
+        'a|lib/test.html': '<!DOCTYPE html><html>'
+            '<script type="application/dart" src="a.dart">'
+            '</script>\n'
+            '<script type="application/dart" src="b.dart">'
+            '</script>'
             '<script src="packages/browser/dart.js"></script>'
-      }, []);
+      }, [
+        'warning: Only one "application/dart" script tag per document is'
+        ' allowed. (lib/test.html 1 0)',
+      ]);
 
     _testLinter('tags inside elements', {
         'a|web/test.html': '<!DOCTYPE html><html>'
@@ -62,8 +107,11 @@
             '</polymer-element>\n'
             '<script type="application/dart" src="b.dart">'
             '</script>'
-            '<script src="packages/browser/dart.js"></script>'
-      }, []);
+            '<script src="packages/browser/dart.js"></script>',
+      }, [
+        'warning: Only one "application/dart" script tag per document is'
+        ' allowed. (web/test.html 1 0)',
+      ]);
   });
 
   group('doctype warning', () {
@@ -73,6 +121,7 @@
         'warning: Unexpected start tag (html). Expected DOCTYPE. '
         '(web/test.html 0 0)',
         'warning: $USE_POLYMER_HTML',
+        'warning: $USE_INIT_DART',
       ]);
 
     _testLinter('in lib', {
@@ -210,8 +259,8 @@
             <script src="foo.dart"></script>
             </html>'''.replaceAll('            ', ''),
       }, [
-        'warning: Wrong script type, expected type="application/dart" or'
-        ' type="application/dart;component=1". (lib/test.html 1 0)'
+        'warning: Wrong script type, expected type="application/dart".'
+        ' (lib/test.html 1 0)'
       ]);
 
     _testLinter('in polymer-element, .dart url', {
@@ -221,8 +270,8 @@
             </polymer-element>
             </html>'''.replaceAll('            ', ''),
       }, [
-        'warning: Wrong script type, expected type="application/dart" or'
-        ' type="application/dart;component=1". (lib/test.html 2 0)'
+        'warning: Wrong script type, expected type="application/dart".'
+        ' (lib/test.html 2 0)'
       ]);
 
     _testLinter('in polymer-element, .js url', {
diff --git a/pkg/polymer/test/build/script_compactor_test.dart b/pkg/polymer/test/build/script_compactor_test.dart
index 6c3119e..a2dc1c6 100644
--- a/pkg/polymer/test/build/script_compactor_test.dart
+++ b/pkg/polymer/test/build/script_compactor_test.dart
@@ -18,13 +18,14 @@
   var phases = [[new ScriptCompactor(new TransformOptions(),
       sdkDir: testingDartSdkDirectory)]];
   group('initializers', () => initializerTests(phases));
+  group('experimental', () => initializerTestsExperimental(phases));
   group('codegen', () => codegenTests(phases));
 }
 
 initializerTests(phases) {
   testPhases('no changes', phases, {
       'a|web/test.html': '<!DOCTYPE html><html></html>',
-      'a|web/test.html.scriptUrls': '[]',
+      'a|web/test.html._data': EMPTY_DATA,
     }, {
       'a|web/test.html': '<!DOCTYPE html><html></html>',
     });
@@ -32,17 +33,329 @@
   testPhases('no changes outside web/', phases, {
       'a|lib/test.html':
           '<!DOCTYPE html><html><head>',
-      'a|lib/test.html.scriptUrls': '[["a","lib/a.dart"]]',
+      'a|lib/test.html._data': expectedData(['lib/a.dart']),
     }, {
       'a|lib/test.html':
           '<!DOCTYPE html><html><head>',
-      'a|lib/test.html.scriptUrls': '[["a","lib/a.dart"]]',
+      'a|lib/test.html._data': expectedData(['lib/a.dart']),
     });
 
   testPhases('single script', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>',
-      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/test.html._data': expectedData(['web/a.dart']),
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          'main(){}',
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head></head><body>'
+          '<script type="application/dart" '
+          'src="test.html_bootstrap.dart"></script>'
+          '</body></html>',
+
+      'a|web/test.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false));
+            configureForDeployment([]);
+            i0.main();
+          }
+          '''.replaceAll('\n          ', '\n'),
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          'main(){}',
+    });
+
+  testPhases('simple initialization', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>',
+      'a|web/test.html._data': expectedData(['web/a.dart']),
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          '@CustomTag("x-foo")\n'
+          'class XFoo extends PolymerElement {\n'
+          '}\n'
+          'main(){}',
+    }, {
+      'a|web/test.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'a.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                parents: {
+                  smoke_0.XFoo: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_0.XFoo: const {},
+                }));
+            configureForDeployment([
+                () => Polymer.register(\'x-foo\', i0.XFoo),
+              ]);
+            i0.main();
+          }
+          '''.replaceAll('\n          ', '\n'),
+    });
+
+  testPhases('use const expressions', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>',
+      'a|web/test.html._data': expectedData(['web/a.dart']),
+      'a|web/b.dart':
+          'library a;\n'
+          'const x = "x";\n',
+      'a|web/c.dart':
+          'part of a;\n'
+          'const dash = "-";\n',
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          'import "b.dart";\n'
+          'part "c.dart";\n'
+          'const letterO = "o";\n'
+          '@CustomTag("\$x\${dash}f\${letterO}o2")\n'
+          'class XFoo extends PolymerElement {\n'
+          '}\n',
+    }, {
+      'a|web/test.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'a.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                parents: {
+                  smoke_0.XFoo: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_0.XFoo: const {},
+                }));
+            configureForDeployment([
+                () => Polymer.register(\'x-foo2\', i0.XFoo),
+              ]);
+            i0.main();
+          }
+          '''.replaceAll('\n          ', '\n'),
+    });
+
+  testPhases('invalid const expression', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>',
+      'a|web/test.html._data': expectedData(['web/a.dart']),
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.dart";\n'
+          '@CustomTag("\${x}-foo")\n' // invalid, x is not defined
+          'class XFoo extends PolymerElement {\n'
+          '}\n'
+          'main(){}',
+    }, {
+      'a|web/test.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'a.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                parents: {
+                  smoke_0.XFoo: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_0.XFoo: const {},
+                }));
+            configureForDeployment([]);
+            i0.main();
+          }
+          '''.replaceAll('\n          ', '\n'),
+
+    }, [
+      'warning: The parameter to @CustomTag seems to be invalid. '
+      '(web/a.dart 2 11)',
+    ]);
+
+  testPhases('no polymer import (no warning, but no crash either)', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>',
+      'a|web/test.html._data': expectedData(['web/a.dart']),
+      'a|web/a.dart':
+          'library a;\n'
+          'import "package:polymer/polymer.broken.import.dart";\n'
+          '@CustomTag("x-foo")\n'
+          'class XFoo extends PolymerElement {\n'
+          '}\n'
+          'main(){}',
+    }, {
+      'a|web/test.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'a.dart' as i0;
+          ${DEFAULT_IMPORTS.join('\n')}
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false));
+            configureForDeployment([]);
+            i0.main();
+          }
+          '''.replaceAll('\n          ', '\n'),
+
+    }, []);
+
+  testPhases('several scripts', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>'
+          '</head><body><div></div>',
+      'a|web/test.html._data':
+          expectedData(['web/a.dart', 'web/b.dart', 'web/c.dart', 'web/d.dart']),
+      'a|web/d.dart':
+          'library d;\n'
+          'import "package:polymer/polymer.dart";\n'
+          'main(){}\n@initMethod mD(){}',
+
+      'a|web/a.dart':
+          'import "package:polymer/polymer.dart";\n'
+          '@initMethod mA(){}\n',
+
+      'a|web/b.dart':
+          'import "package:polymer/polymer.dart";\n'
+          'export "e.dart";\n'
+          'export "f.dart" show XF1, mF1;\n'
+          'export "g.dart" hide XG1, mG1;\n'
+          'export "h.dart" show XH1, mH1 hide mH1, mH2;\n'
+          '@initMethod mB(){}\n',
+
+      'a|web/c.dart':
+          'import "package:polymer/polymer.dart";\n'
+          'part "c_part.dart";\n'
+          '@CustomTag("x-c1") class XC1 extends PolymerElement {}\n',
+
+      'a|web/c_part.dart':
+          '@CustomTag("x-c2") class XC2 extends PolymerElement {}\n',
+
+      'a|web/e.dart':
+          'import "package:polymer/polymer.dart";\n'
+          '@CustomTag("x-e") class XE extends PolymerElement {}\n'
+          '@initMethod mE(){}\n',
+
+      'a|web/f.dart':
+          'import "package:polymer/polymer.dart";\n'
+          '@CustomTag("x-f1") class XF1 extends PolymerElement {}\n'
+          '@initMethod mF1(){}\n'
+          '@CustomTag("x-f2") class XF2 extends PolymerElement {}\n'
+          '@initMethod mF2(){}\n',
+
+      'a|web/g.dart':
+          'import "package:polymer/polymer.dart";\n'
+          '@CustomTag("x-g1") class XG1 extends PolymerElement {}\n'
+          '@initMethod mG1(){}\n'
+          '@CustomTag("x-g2") class XG2 extends PolymerElement {}\n'
+          '@initMethod mG2(){}\n',
+
+      'a|web/h.dart':
+          'import "package:polymer/polymer.dart";\n'
+          '@CustomTag("x-h1") class XH1 extends PolymerElement {}\n'
+          '@initMethod mH1(){}\n'
+          '@CustomTag("x-h2") class XH2 extends PolymerElement {}\n'
+          '@initMethod mH2(){}\n',
+    }, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head></head><body><div></div>'
+          '<script type="application/dart" src="test.html_bootstrap.dart">'
+          '</script>'
+          '</body></html>',
+
+      'a|web/test.html_bootstrap.dart':
+          '''$MAIN_HEADER
+          import 'a.dart' as i0;
+          import 'b.dart' as i1;
+          import 'c.dart' as i2;
+          import 'd.dart' as i3;
+          ${DEFAULT_IMPORTS.join('\n')}
+          import 'e.dart' as smoke_0;
+          import 'package:polymer/polymer.dart' as smoke_1;
+          import 'f.dart' as smoke_2;
+          import 'g.dart' as smoke_3;
+          import 'h.dart' as smoke_4;
+          import 'c.dart' as smoke_5;
+
+          void main() {
+            useGeneratedCode(new StaticConfiguration(
+                checkedMode: false,
+                parents: {
+                  smoke_5.XC1: smoke_1.PolymerElement,
+                  smoke_5.XC2: smoke_1.PolymerElement,
+                  smoke_0.XE: smoke_1.PolymerElement,
+                  smoke_2.XF1: smoke_1.PolymerElement,
+                  smoke_3.XG2: smoke_1.PolymerElement,
+                  smoke_4.XH1: smoke_1.PolymerElement,
+                },
+                declarations: {
+                  smoke_5.XC1: const {},
+                  smoke_5.XC2: const {},
+                  smoke_0.XE: const {},
+                  smoke_2.XF1: const {},
+                  smoke_3.XG2: const {},
+                  smoke_4.XH1: const {},
+                }));
+            configureForDeployment([
+                i0.mA,
+                i1.mB,
+                i1.mE,
+                i1.mF1,
+                i1.mG2,
+                () => Polymer.register('x-e', i1.XE),
+                () => Polymer.register('x-f1', i1.XF1),
+                () => Polymer.register('x-g2', i1.XG2),
+                () => Polymer.register('x-h1', i1.XH1),
+                () => Polymer.register('x-c1', i2.XC1),
+                () => Polymer.register('x-c2', i2.XC2),
+                i3.mD,
+              ]);
+            i3.main();
+          }
+          '''.replaceAll('\n          ', '\n'),
+    }, null);
+}
+
+initializerTestsExperimental(phases) {
+  testPhases('no changes', phases, {
+      'a|web/test.html': '<!DOCTYPE html><html></html>',
+      'a|web/test.html._data': EMPTY_DATA,
+    }, {
+      'a|web/test.html': '<!DOCTYPE html><html></html>',
+    });
+
+  testPhases('no changes outside web/', phases, {
+      'a|lib/test.html':
+          '<!DOCTYPE html><html><head>',
+      'a|lib/test.html._data': expectedData(['lib/a.dart'], experimental: true),
+    }, {
+      'a|lib/test.html':
+          '<!DOCTYPE html><html><head>',
+      'a|lib/test.html._data': expectedData(['lib/a.dart'], experimental: true),
+    });
+
+  testPhases('single script', phases, {
+      'a|web/test.html':
+          '<!DOCTYPE html><html><head>',
+      'a|web/test.html._data': expectedData(['web/a.dart'], experimental: true),
       'a|web/a.dart':
           'library a;\n'
           'import "package:polymer/polymer.dart";\n'
@@ -76,7 +389,7 @@
   testPhases('simple initialization', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>',
-      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/test.html._data': expectedData(['web/a.dart'], experimental: true),
       'a|web/a.dart':
           'library a;\n'
           'import "package:polymer/polymer.dart";\n'
@@ -112,7 +425,7 @@
   testPhases('use const expressions', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>',
-      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/test.html._data': expectedData(['web/a.dart'], experimental: true),
       'a|web/b.dart':
           'library a;\n'
           'const x = "x";\n',
@@ -155,7 +468,7 @@
   testPhases('invalid const expression', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>',
-      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/test.html._data': expectedData(['web/a.dart'], experimental: true),
       'a|web/a.dart':
           'library a;\n'
           'import "package:polymer/polymer.dart";\n'
@@ -193,7 +506,7 @@
   testPhases('no polymer import (no warning, but no crash either)', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><head>',
-      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/test.html._data': expectedData(['web/a.dart'], experimental: true),
       'a|web/a.dart':
           'library a;\n'
           'import "package:polymer/polymer.broken.import.dart";\n'
@@ -222,9 +535,8 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><head>'
           '</head><body><div></div>',
-      'a|web/test.html.scriptUrls':
-          '[["a", "web/a.dart"],["a", "web/b.dart"],["a", "web/c.dart"],'
-          '["a", "web/d.dart"]]',
+      'a|web/test.html._data':
+          expectedData(['web/a.dart', 'web/b.dart', 'web/c.dart', 'web/d.dart'], experimental: true),
       'a|web/d.dart':
           'library d;\n'
           'import "package:polymer/polymer.dart";\n'
@@ -354,11 +666,11 @@
           '<div on-click="{{methodName}}"></div>'
           '<div on-click="{{@read.method}}"></div>'
           '</template></polymer-element>',
-      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/test.html._data': expectedData(['web/a.dart']),
       'a|web/a.dart':
           'library a;\n'
           'import "package:polymer/polymer.dart";\n'
-          '@initMethod main(){}',
+          'main(){}',
     }, {
       'a|web/test.html_bootstrap.dart':
           '''$MAIN_HEADER
@@ -413,15 +725,14 @@
                   #twoWayInt: r'twoWayInt',
                   #within: r'within',
                 }));
-            startPolymer([
-                i0.main,
-              ]);
+            configureForDeployment([]);
+            i0.main();
           }
           '''.replaceAll('\n          ', '\n'),
       'a|web/a.dart':
           'library a;\n'
           'import "package:polymer/polymer.dart";\n'
-          '@initMethod main(){}',
+          'main(){}',
     });
 
   final field1Details = "annotations: const [smoke_1.published]";
@@ -432,7 +743,7 @@
   testPhases('published via annotation', phases, {
       'a|web/test.html':
           '<!DOCTYPE html><html><body>',
-      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/test.html._data': expectedData(['web/a.dart']),
       'a|web/a.dart':
           'library a;\n'
           'import "package:polymer/polymer.dart";\n'
@@ -489,9 +800,10 @@
                   #prop1: r'prop1',
                   #prop3: r'prop3',
                 }));
-            startPolymer([
+            configureForDeployment([
                 () => Polymer.register(\'x-foo\', i0.XFoo),
               ]);
+            i0.main();
           }
           '''.replaceAll('\n          ', '\n'),
     });
@@ -501,7 +813,7 @@
           '<!DOCTYPE html><html><body>'
           '<polymer-element name="x-foo" attributes="field1,prop2">'
           '</polymer-element>',
-      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/test.html._data': expectedData(['web/a.dart']),
       'a|web/a.dart':
           'library a;\n'
           'import "package:polymer/polymer.dart";\n'
@@ -546,9 +858,10 @@
                   #field1: r'field1',
                   #prop2: r'prop2',
                 }));
-            startPolymer([
+            configureForDeployment([
                 () => Polymer.register(\'x-foo\', i0.XFoo),
               ]);
+            i0.main();
           }
           '''.replaceAll('\n          ', '\n'),
     });
@@ -560,7 +873,7 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><body>'
           '</polymer-element>',
-      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/test.html._data': expectedData(['web/a.dart']),
       'a|web/a.dart':
           'library a;\n'
           'import "package:polymer/polymer.dart";\n'
@@ -600,9 +913,10 @@
                   #foo: r'foo',
                   #xChanged: r'xChanged',
                 }));
-            startPolymer([
+            configureForDeployment([
                 () => Polymer.register(\'x-foo\', i0.XFoo),
               ]);
+            i0.main();
           }
           '''.replaceAll('\n          ', '\n'),
     });
@@ -612,7 +926,7 @@
       'a|web/test.html':
           '<!DOCTYPE html><html><body>'
           '</polymer-element>',
-      'a|web/test.html.scriptUrls': '[["a","web/a.dart"]]',
+      'a|web/test.html._data': expectedData(['web/a.dart']),
       'a|web/a.dart':
           'library a;\n'
           'import "package:polymer/polymer.dart";\n'
@@ -648,10 +962,12 @@
                 names: {
                   #registerCallback: r'registerCallback',
                 }));
-            startPolymer([
+            configureForDeployment([
                 () => Polymer.register(\'x-foo\', i0.XFoo),
               ]);
+            i0.main();
           }
           '''.replaceAll('\n          ', '\n'),
     });
 }
+
diff --git a/pkg/polymer/test/custom_event_test.dart b/pkg/polymer/test/custom_event_test.dart
index 0b67e3e..04679a9 100644
--- a/pkg/polymer/test/custom_event_test.dart
+++ b/pkg/polymer/test/custom_event_test.dart
@@ -42,8 +42,7 @@
   barBazHandler(e) => events.add(['barbaz', e]);
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
@@ -67,4 +66,4 @@
     expect(events.map((e) => e[0]), ['foo', 'barbaz', 'foo']);
     expect(events.map((e) => e[1].detail), [123, 42, 777]);
   });
-}
+});
diff --git a/pkg/polymer/test/custom_event_test.html b/pkg/polymer/test/custom_event_test.html
index db709b8..1e071cf 100644
--- a/pkg/polymer/test/custom_event_test.html
+++ b/pkg/polymer/test/custom_event_test.html
@@ -25,7 +25,6 @@
 
   <test-custom-event></test-custom-event>
 
-  <script type="application/dart;component=1"
-          src="custom_event_test.dart"></script>
+  <script type="application/dart" src="custom_event_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/entered_view_test.dart b/pkg/polymer/test/entered_view_test.dart
index f1859ad..648a487 100644
--- a/pkg/polymer/test/entered_view_test.dart
+++ b/pkg/polymer/test/entered_view_test.dart
@@ -29,8 +29,7 @@
   }
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
   Polymer.register('x-inner', XInner);
   Polymer.register('x-outer', XOuter);
@@ -49,4 +48,4 @@
       });
     });
   });
-}
+});
diff --git a/pkg/polymer/test/entered_view_test.html b/pkg/polymer/test/entered_view_test.html
index 078556a..d9e937d 100644
--- a/pkg/polymer/test/entered_view_test.html
+++ b/pkg/polymer/test/entered_view_test.html
@@ -32,7 +32,6 @@
     outer element:
     <x-outer></x-outer>
 
-    <script type="application/dart;component=1"
-            src="entered_view_test.dart"></script>
+    <script type="application/dart" src="entered_view_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/event_handlers_test.dart b/pkg/polymer/test/event_handlers_test.dart
index ae4a05c..203ea4e 100644
--- a/pkg/polymer/test/event_handlers_test.dart
+++ b/pkg/polymer/test/event_handlers_test.dart
@@ -96,7 +96,9 @@
   String toString() => "<mini-model $index>";
 }
 
-@initMethod main() {
+main() => initPolymer();
+
+@initMethod init() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
diff --git a/pkg/polymer/test/event_handlers_test.html b/pkg/polymer/test/event_handlers_test.html
index 883b6be..94dc475 100644
--- a/pkg/polymer/test/event_handlers_test.html
+++ b/pkg/polymer/test/event_handlers_test.html
@@ -54,8 +54,7 @@
         </div>
       </div>
     </template>
-    <script type="application/dart;component=1"
-            src="event_handlers_test.dart"></script>
+    <script type="application/dart" src="event_handlers_test.dart"></script>
   </polymer-element>
   </body>
 </html>
diff --git a/pkg/polymer/test/event_path_declarative_test.dart b/pkg/polymer/test/event_path_declarative_test.dart
index 1d8c2d1..9983d13 100644
--- a/pkg/polymer/test/event_path_declarative_test.dart
+++ b/pkg/polymer/test/event_path_declarative_test.dart
@@ -18,6 +18,8 @@
 var _observedEvents = [];
 var _testFired;
 
+main() => initPolymer();
+
 @reflectable
 class XZug extends PolymerElement {
 
@@ -77,7 +79,7 @@
   }
 }
 
-@initMethod main() {
+@initMethod init() {
   useHtmlConfiguration();
   // TODO(sigmund): switch back to use @CustomTag. We seem to be running into a
   // problem where using @CustomTag doesn't guarantee that we register the tags
diff --git a/pkg/polymer/test/event_path_declarative_test.html b/pkg/polymer/test/event_path_declarative_test.html
index 07cd086..4fcc3d6 100644
--- a/pkg/polymer/test/event_path_declarative_test.html
+++ b/pkg/polymer/test/event_path_declarative_test.html
@@ -71,7 +71,6 @@
       </template>
     </polymer-element>
 
-  <script type="application/dart;component=1"
-          src="event_path_declarative_test.dart"></script>
+  <script type="application/dart" src="event_path_declarative_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/event_path_test.dart b/pkg/polymer/test/event_path_test.dart
index ecf922f..97c3e35 100644
--- a/pkg/polymer/test/event_path_test.dart
+++ b/pkg/polymer/test/event_path_test.dart
@@ -25,8 +25,9 @@
   XMenuButton.created() : super.created();
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
+  useHtmlConfiguration();
+
   // TODO(sigmund): use @CustomTag instead of Polymer.regsiter. A bug is making
   // this code sensitive to the order in which we register elements (e.g. if
   // x-menu is registered before x-selector). See dartbug.com/17926.
@@ -35,8 +36,6 @@
   Polymer.register('x-menu', XMenu);
   Polymer.register('x-menu-button', XMenuButton);
 
-  useHtmlConfiguration();
-
   setUp(() => Polymer.onReady);
 
   test('bubbling in the right order', () {
@@ -81,4 +80,4 @@
 
     item1.dispatchEvent(new Event('x', canBubble: true));
   });
-}
+});
diff --git a/pkg/polymer/test/event_path_test.html b/pkg/polymer/test/event_path_test.html
index 400dc7d..0372815 100644
--- a/pkg/polymer/test/event_path_test.html
+++ b/pkg/polymer/test/event_path_test.html
@@ -62,7 +62,6 @@
   </x-menu-button>
 
 
-  <script type="application/dart;component=1"
-          src="event_path_test.dart"></script>
+  <script type="application/dart" src="event_path_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/events_test.dart b/pkg/polymer/test/events_test.dart
index b4d8ad7..bcd6f44 100644
--- a/pkg/polymer/test/events_test.dart
+++ b/pkg/polymer/test/events_test.dart
@@ -44,8 +44,7 @@
   TestC.created() : super.created();
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
@@ -84,4 +83,4 @@
     c2.click();
     expect(testC.clicks, ['local click under test-c (id c) on c-2']);
   });
-}
+});
diff --git a/pkg/polymer/test/events_test.html b/pkg/polymer/test/events_test.html
index 2e64311..bfee540 100644
--- a/pkg/polymer/test/events_test.html
+++ b/pkg/polymer/test/events_test.html
@@ -46,6 +46,6 @@
   <test-b id="b"></test-b>
   <test-c id="c"></test-c>
 
-  <script type="application/dart;component=1" src="events_test.dart"></script>
+  <script type="application/dart" src="events_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/instance_attrs_test.dart b/pkg/polymer/test/instance_attrs_test.dart
index 24f94cb..94e138a 100644
--- a/pkg/polymer/test/instance_attrs_test.dart
+++ b/pkg/polymer/test/instance_attrs_test.dart
@@ -17,8 +17,7 @@
   get attributes => super.attributes;
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
@@ -36,4 +35,4 @@
     expect(text, " foo: 123 bar: hi baz: world ",
         reason: 'text should match expected HTML template');
   });
-}
+});
diff --git a/pkg/polymer/test/instance_attrs_test.html b/pkg/polymer/test/instance_attrs_test.html
index 2b6bfe1..11832de 100644
--- a/pkg/polymer/test/instance_attrs_test.html
+++ b/pkg/polymer/test/instance_attrs_test.html
@@ -22,7 +22,6 @@
 
     <my-element baz="world"></my-element>
 
-    <script type="application/dart;component=1"
-            src="instance_attrs_test.dart"></script>
+    <script type="application/dart" src="instance_attrs_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/js_interop_test.dart b/pkg/polymer/test/js_interop_test.dart
index fc6f41c..3704ccb 100644
--- a/pkg/polymer/test/js_interop_test.dart
+++ b/pkg/polymer/test/js_interop_test.dart
@@ -16,8 +16,7 @@
   DartElement.created() : super.created();
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
@@ -32,7 +31,7 @@
 
   test('js-element in dart-element', () => testInterop(
       querySelector('dart-element').shadowRoot.querySelector('js-element')));
-}
+});
 
 testInterop(jsElem) {
   expect(jsElem.shadowRoot.text, 'FOOBAR');
diff --git a/pkg/polymer/test/js_interop_test.html b/pkg/polymer/test/js_interop_test.html
index 8ce3bf1..dab9c5c 100644
--- a/pkg/polymer/test/js_interop_test.html
+++ b/pkg/polymer/test/js_interop_test.html
@@ -34,8 +34,7 @@
   <dart-element></dart-element>
   <js-element></js-element>
 
-  <script type="application/dart;component=1"
-          src="js_interop_test.dart"></script>
+  <script type="application/dart" src="js_interop_test.dart"></script>
 
   </body>
 </html>
diff --git a/pkg/polymer/test/nested_binding_test.dart b/pkg/polymer/test/nested_binding_test.dart
index cdc3614..c6ab7ef 100644
--- a/pkg/polymer/test/nested_binding_test.dart
+++ b/pkg/polymer/test/nested_binding_test.dart
@@ -28,12 +28,11 @@
   }
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
 
   test('ready called',
       () => (querySelector('my-test') as MyTest)._testDone.future);
-}
+});
diff --git a/pkg/polymer/test/nested_binding_test.html b/pkg/polymer/test/nested_binding_test.html
index 8f4e7c6..ffafdf1 100644
--- a/pkg/polymer/test/nested_binding_test.html
+++ b/pkg/polymer/test/nested_binding_test.html
@@ -27,7 +27,6 @@
 
     <my-test></my-test>
 
-    <script type="application/dart;component=1"
-            src="nested_binding_test.dart"></script>
+    <script type="application/dart" src="nested_binding_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/noscript_test.dart b/pkg/polymer/test/noscript_test.dart
index 58a1c0e..06cec77 100644
--- a/pkg/polymer/test/noscript_test.dart
+++ b/pkg/polymer/test/noscript_test.dart
@@ -18,8 +18,7 @@
   return completer.future;
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   var ready = Polymer.onReady.then((_) {
@@ -36,4 +35,4 @@
     expect(querySelector('x-b').shadowRoot.nodes.first.text, 'b');
     expect(querySelector('x-d').shadowRoot.nodes.first.text, 'd');
   });
-}
+});
diff --git a/pkg/polymer/test/noscript_test.html b/pkg/polymer/test/noscript_test.html
index c2304c0..652cc7f 100644
--- a/pkg/polymer/test/noscript_test.html
+++ b/pkg/polymer/test/noscript_test.html
@@ -24,6 +24,6 @@
   </template>
   <x-d></x-d>
 
-  <script type="application/dart;component=1" src="noscript_test.dart"></script>
+  <script type="application/dart" src="noscript_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/prop_attr_bind_reflection_test.dart b/pkg/polymer/test/prop_attr_bind_reflection_test.dart
index ce06474..29caabd 100644
--- a/pkg/polymer/test/prop_attr_bind_reflection_test.dart
+++ b/pkg/polymer/test/prop_attr_bind_reflection_test.dart
@@ -29,8 +29,7 @@
   MyElement.created() : super.created();
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
@@ -44,4 +43,4 @@
     expect('11', child.attributes['lowercase']);
     expect('11', child.attributes['camelcase']);
   });
-}
+});
diff --git a/pkg/polymer/test/prop_attr_bind_reflection_test.html b/pkg/polymer/test/prop_attr_bind_reflection_test.html
index 51d9acd..f1b19a5 100644
--- a/pkg/polymer/test/prop_attr_bind_reflection_test.html
+++ b/pkg/polymer/test/prop_attr_bind_reflection_test.html
@@ -28,8 +28,7 @@
 
     <my-element></my-element>
 
-    <script type="application/dart;component=1"
-            src="prop_attr_bind_reflection_test.dart">
+    <script type="application/dart" src="prop_attr_bind_reflection_test.dart">
     </script>
   </body>
 </html>
diff --git a/pkg/polymer/test/prop_attr_reflection_test.dart b/pkg/polymer/test/prop_attr_reflection_test.dart
index 927ebab..f2901c4 100644
--- a/pkg/polymer/test/prop_attr_reflection_test.dart
+++ b/pkg/polymer/test/prop_attr_reflection_test.dart
@@ -40,8 +40,7 @@
   return completer.future;
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
@@ -116,4 +115,4 @@
           'reflect property based on current type');
     });
   });
-}
+});
diff --git a/pkg/polymer/test/prop_attr_reflection_test.html b/pkg/polymer/test/prop_attr_reflection_test.html
index 9041a2c..12e2f93 100644
--- a/pkg/polymer/test/prop_attr_reflection_test.html
+++ b/pkg/polymer/test/prop_attr_reflection_test.html
@@ -28,7 +28,6 @@
       </template>
     </polymer-element>
 
-  <script type="application/dart;component=1"
-          src="prop_attr_reflection_test.dart"></script>
+  <script type="application/dart" src="prop_attr_reflection_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/property_change_test.dart b/pkg/polymer/test/property_change_test.dart
index 392db92..b8dfdb6 100644
--- a/pkg/polymer/test/property_change_test.dart
+++ b/pkg/polymer/test/property_change_test.dart
@@ -45,12 +45,11 @@
   }
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
 
   test('bar change detected', () => _bar.future);
   test('zonk change detected', () => _zonk.future);
-}
+});
diff --git a/pkg/polymer/test/property_change_test.html b/pkg/polymer/test/property_change_test.html
index 7b78678..25251d3 100644
--- a/pkg/polymer/test/property_change_test.html
+++ b/pkg/polymer/test/property_change_test.html
@@ -15,7 +15,6 @@
     <x-test id="test"></x-test>
 
     <polymer-element name="x-test"><template></template></polymer-element>
-    <script type="application/dart;component=1"
-            src="property_change_test.dart"></script>
+    <script type="application/dart" src="property_change_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/property_observe_test.dart b/pkg/polymer/test/property_observe_test.dart
index f820e4d..b79fa34 100644
--- a/pkg/polymer/test/property_observe_test.dart
+++ b/pkg/polymer/test/property_observe_test.dart
@@ -81,11 +81,10 @@
   }
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
 
   test('changes detected', () => _done.future);
-}
+});
diff --git a/pkg/polymer/test/property_observe_test.html b/pkg/polymer/test/property_observe_test.html
index c1a4ea6..0c6bbc8 100644
--- a/pkg/polymer/test/property_observe_test.html
+++ b/pkg/polymer/test/property_observe_test.html
@@ -19,7 +19,6 @@
     <polymer-element name="x-test2" extends="x-test">
       <template></template>
     </polymer-element>
-    <script type="application/dart;component=1"
-            src="property_observe_test.dart"></script>
+    <script type="application/dart" src="property_observe_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/publish_attributes_test.dart b/pkg/polymer/test/publish_attributes_test.dart
index d4ecdded..241f53a 100644
--- a/pkg/polymer/test/publish_attributes_test.dart
+++ b/pkg/polymer/test/publish_attributes_test.dart
@@ -52,8 +52,7 @@
   XQux.created() : super.created();
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
@@ -68,4 +67,4 @@
     expect(published('x-squid'), ['Foo', 'baz', 'Bar', 'zot', 'squid']);
     expect(published('x-qux'), ['qux']);
   });
-}
+});
diff --git a/pkg/polymer/test/publish_attributes_test.html b/pkg/polymer/test/publish_attributes_test.html
index 7fc9572..ca91807 100644
--- a/pkg/polymer/test/publish_attributes_test.html
+++ b/pkg/polymer/test/publish_attributes_test.html
@@ -27,7 +27,6 @@
 
     <polymer-element name="x-qux" attributes="qux"></polymer-element>
 
-  <script type="application/dart;component=1"
-          src="publish_attributes_test.dart"></script>
+  <script type="application/dart" src="publish_attributes_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/publish_inherited_properties_test.dart b/pkg/polymer/test/publish_inherited_properties_test.dart
index 5945266..dacd828 100644
--- a/pkg/polymer/test/publish_inherited_properties_test.dart
+++ b/pkg/polymer/test/publish_inherited_properties_test.dart
@@ -46,8 +46,7 @@
   @published int squid = 7;
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady.then((_) {
@@ -64,4 +63,4 @@
     // TODO(sigmund): uncomment, see above
     // expect(published('x-squid'), [#Foo, #Bar, #zot, #zap, #baz, #squid]);
   });
-}
+});
diff --git a/pkg/polymer/test/publish_inherited_properties_test.html b/pkg/polymer/test/publish_inherited_properties_test.html
index 8be8ea2..024c11e 100644
--- a/pkg/polymer/test/publish_inherited_properties_test.html
+++ b/pkg/polymer/test/publish_inherited_properties_test.html
@@ -27,7 +27,6 @@
     <polymer-element name="x-noscript" extends="x-zot">
     </polymer-element>
 
-  <script type="application/dart;component=1"
-          src="publish_inherited_properties_test.dart"></script>
+  <script type="application/dart" src="publish_inherited_properties_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/register_test.dart b/pkg/polymer/test/register_test.dart
index c0ab7d3..d2194d5 100644
--- a/pkg/polymer/test/register_test.dart
+++ b/pkg/polymer/test/register_test.dart
@@ -40,8 +40,7 @@
 }
 
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
@@ -78,4 +77,4 @@
           reason: 'elements on page should be upgraded');
     });
   });
-}
+});
diff --git a/pkg/polymer/test/register_test.html b/pkg/polymer/test/register_test.html
index 93d565f..555b1e2 100644
--- a/pkg/polymer/test/register_test.html
+++ b/pkg/polymer/test/register_test.html
@@ -33,6 +33,6 @@
     <button is='x-button'></button>
     <x-polymer></x-polymer>
 
-  <script type="application/dart;component=1" src="register_test.dart"></script>
+  <script type="application/dart" src="register_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/take_attributes_test.dart b/pkg/polymer/test/take_attributes_test.dart
index c77a1a4..da6d61b 100644
--- a/pkg/polymer/test/take_attributes_test.dart
+++ b/pkg/polymer/test/take_attributes_test.dart
@@ -49,8 +49,7 @@
   @observable var values = {};
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
@@ -119,4 +118,4 @@
     expect(queryXTag("#obj3").values, { 'movie': 'Buckaroo Banzai',
         'DOB': '07/31/1978' });
   });
-}
+});
diff --git a/pkg/polymer/test/take_attributes_test.html b/pkg/polymer/test/take_attributes_test.html
index 163f499..a7fa8e7 100644
--- a/pkg/polymer/test/take_attributes_test.html
+++ b/pkg/polymer/test/take_attributes_test.html
@@ -71,7 +71,6 @@
            values="{ 'movie': 'Buckaroo Banzai', 'DOB': '07/31/1978' }">
     </x-obj>
 
-  <script type="application/dart;component=1"
-          src="take_attributes_test.dart"></script>
+  <script type="application/dart" src="take_attributes_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/polymer/test/template_distribute_dynamic_test.dart b/pkg/polymer/test/template_distribute_dynamic_test.dart
index af73a20..6438906 100644
--- a/pkg/polymer/test/template_distribute_dynamic_test.dart
+++ b/pkg/polymer/test/template_distribute_dynamic_test.dart
@@ -52,11 +52,10 @@
   }
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
 
   test('inserted called', () => (querySelector('x-test') as XTest).onTestDone);
-}
+});
diff --git a/pkg/polymer/test/template_distribute_dynamic_test.html b/pkg/polymer/test/template_distribute_dynamic_test.html
index ff9e1e4..e42b464 100644
--- a/pkg/polymer/test/template_distribute_dynamic_test.html
+++ b/pkg/polymer/test/template_distribute_dynamic_test.html
@@ -32,8 +32,7 @@
     </template>
   </polymer-element>
 
-  <script type="application/dart;component=1"
-          src="template_distribute_dynamic_test.dart">
+  <script type="application/dart" src="template_distribute_dynamic_test.dart">
   </script>
   </body>
 </html>
diff --git a/pkg/polymer/test/unbind_test.dart b/pkg/polymer/test/unbind_test.dart
index 3ab18d6..8bf7256 100644
--- a/pkg/polymer/test/unbind_test.dart
+++ b/pkg/polymer/test/unbind_test.dart
@@ -39,14 +39,13 @@
   bool get isBarValid => validBar == bar;
 }
 
-@initMethod
-main() {
+main() => initPolymer().run(() {
   useHtmlConfiguration();
 
   setUp(() => Polymer.onReady);
 
   test('unbind', unbindTests);
-}
+});
 
 Future testAsync(List<Function> tests, int delayMs, [List args]) {
   if (tests.length == 0) return new Future.value();
diff --git a/pkg/polymer/test/unbind_test.html b/pkg/polymer/test/unbind_test.html
index 8b2f4dc..8b8cfbb 100644
--- a/pkg/polymer/test/unbind_test.html
+++ b/pkg/polymer/test/unbind_test.html
@@ -17,6 +17,6 @@
 
   <polymer-element name="x-test" attributes="bar"></polymer-element>
 
-  <script type="application/dart;component=1" src="unbind_test.dart"></script>
+  <script type="application/dart" src="unbind_test.dart"></script>
   </body>
 </html>
diff --git a/pkg/shelf/CHANGELOG.md b/pkg/shelf/CHANGELOG.md
index e6d1118ed..0a58fe9 100644
--- a/pkg/shelf/CHANGELOG.md
+++ b/pkg/shelf/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.5.3
+
+* Add new named parameters to `Request.change`: `scriptName` and `url`.
+
 ## 0.5.2
 
 * Add a `Cascade` helper that runs handlers in sequence until one returns a
diff --git a/pkg/shelf/lib/src/request.dart b/pkg/shelf/lib/src/request.dart
index 4a08468..26fe011 100644
--- a/pkg/shelf/lib/src/request.dart
+++ b/pkg/shelf/lib/src/request.dart
@@ -134,6 +134,8 @@
       throw new ArgumentError('requstedUri must be an absolute URI.');
     }
 
+    // TODO(kevmoo) if defined, check that scriptName is a fully-encoded, valid
+    // path component
     if (this.scriptName.isNotEmpty && !this.scriptName.startsWith('/')) {
       throw new ArgumentError('scriptName must be empty or start with "/".');
     }
@@ -168,13 +170,33 @@
   ///
   /// All other context and header values from the [Request] will be included
   /// in the copied [Request] unchanged.
-  Request change({Map<String, String> headers, Map<String, Object> context}) {
+  ///
+  /// If [scriptName] is provided and [url] is not, [scriptName] must be a
+  /// prefix of [this.url]. [url] will default to [this.url] with this prefix
+  /// removed. Useful for routing middleware that sends requests to an inner
+  /// [Handler].
+  Request change({Map<String, String> headers, Map<String, Object> context,
+    String scriptName, Uri url}) {
     headers = updateMap(this.headers, headers);
     context = updateMap(this.context, context);
 
+    if (scriptName != null && url == null) {
+      var path = this.url.path;
+      if (path.startsWith(scriptName)) {
+        path = path.substring(scriptName.length);
+        url = new Uri(path: path, query: this.url.query);
+      } else {
+        throw new ArgumentError('If scriptName is provided without url, it must'
+            ' be a prefix of the existing url path.');
+      }
+    }
+
+    if (url == null) url = this.url;
+    if (scriptName == null) scriptName = this.scriptName;
+
     return new Request(this.method, this.requestedUri,
-        protocolVersion: this.protocolVersion, headers: headers, url: this.url,
-        scriptName: this.scriptName, body: this.read(), context: context);
+        protocolVersion: this.protocolVersion, headers: headers, url: url,
+        scriptName: scriptName, body: this.read(), context: context);
   }
 
   /// Takes control of the underlying request socket.
@@ -233,8 +255,7 @@
 /// [ArgumentError].
 Uri _computeUrl(Uri requestedUri, Uri url, String scriptName) {
   if (url == null && scriptName == null) {
-    return new Uri(path: requestedUri.path, query: requestedUri.query,
-        fragment: requestedUri.fragment);
+    return new Uri(path: requestedUri.path, query: requestedUri.query);
   }
 
   if (url != null && scriptName != null) {
diff --git a/pkg/shelf/lib/src/shelf_unmodifiable_map.dart b/pkg/shelf/lib/src/shelf_unmodifiable_map.dart
index 34775f0..9634c85 100644
--- a/pkg/shelf/lib/src/shelf_unmodifiable_map.dart
+++ b/pkg/shelf/lib/src/shelf_unmodifiable_map.dart
@@ -6,12 +6,13 @@
 
 import 'dart:collection';
 
-// TODO(kevmoo): use UnmodifiableMapView from SDK once 1.4 ships
+// TODO(kevmoo): MapView lacks a const ctor, so we have to use DelegatingMap
+// from pkg/collection - https://codereview.chromium.org/294093003/
 import 'package:collection/wrappers.dart' as pc;
 
 /// A simple wrapper over [pc.UnmodifiableMapView] which avoids re-wrapping
 /// itself.
-class ShelfUnmodifiableMap<V> extends pc.UnmodifiableMapView<String, V> {
+class ShelfUnmodifiableMap<V> extends UnmodifiableMapView<String, V> {
   /// If [source] is a [ShelfUnmodifiableMap] with matching [ignoreKeyCase],
   /// then [source] is returned.
   ///
diff --git a/pkg/shelf/pubspec.yaml b/pkg/shelf/pubspec.yaml
index daf3a94..f4e338f 100644
--- a/pkg/shelf/pubspec.yaml
+++ b/pkg/shelf/pubspec.yaml
@@ -1,10 +1,10 @@
 name: shelf
-version: 0.5.2
+version: 0.5.3
 author: Dart Team <misc@dartlang.org>
 description: Web Server Middleware for Dart
 homepage: http://www.dartlang.org
 environment:
-  sdk: '>=1.4.0-dev.5.0 <2.0.0'
+  sdk: '>=1.4.0 <2.0.0'
 documentation: https://api.dartlang.org/apidocs/channels/be/dartdoc-viewer/shelf
 dependencies:
   collection: '>=0.9.1 <0.10.0'
@@ -14,4 +14,4 @@
 dev_dependencies:
   http: '>=0.9.2 <0.12.0'
   scheduled_test: '>=0.10.0 <0.12.0'
-  unittest: '>=0.10.0 <0.11.0'
+  unittest: '>=0.10.0 <0.12.0'
diff --git a/pkg/shelf/test/request_test.dart b/pkg/shelf/test/request_test.dart
index c48a4f7..fed460f 100644
--- a/pkg/shelf/test/request_test.dart
+++ b/pkg/shelf/test/request_test.dart
@@ -168,5 +168,42 @@
           ..close();
       });
     });
+
+    group('with just scriptName', () {
+      test('updates url if scriptName matches existing url', () {
+        var uri = Uri.parse('https://test.example.com/static/file.html');
+        var request = new Request('GET', uri);
+        var copy = request.change(scriptName: '/static');
+
+        expect(copy.scriptName, '/static');
+        expect(copy.url, Uri.parse('/file.html'));
+      });
+
+      test('throws if striptName does not match existing url', () {
+        var uri = Uri.parse('https://test.example.com/static/file.html');
+        var request = new Request('GET', uri);
+
+        expect(() => request.change(scriptName: '/nope'), throwsArgumentError);
+      });
+    });
+
+    test('url', () {
+      var uri = Uri.parse('https://test.example.com/static/file.html');
+      var request = new Request('GET', uri);
+      var copy = request.change(url: Uri.parse('/other_path/file.html'));
+
+      expect(copy.scriptName, '');
+      expect(copy.url, Uri.parse('/other_path/file.html'));
+    });
+
+    test('scriptName and url', () {
+      var uri = Uri.parse('https://test.example.com/static/file.html');
+      var request = new Request('GET', uri);
+      var copy = request.change(scriptName: '/dynamic',
+          url: Uri.parse('/other_path/file.html'));
+
+      expect(copy.scriptName, '/dynamic');
+      expect(copy.url, Uri.parse('/other_path/file.html'));
+    });
   });
 }
diff --git a/pkg/stack_trace/CHANGELOG.md b/pkg/stack_trace/CHANGELOG.md
index 0b45208..36c7d3c 100644
--- a/pkg/stack_trace/CHANGELOG.md
+++ b/pkg/stack_trace/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 0.9.3+2
+
+* Update the dependency on path.
+
+* Improve the formatting of library URIs in stack traces.
+
 ## 0.9.3+1
 
 * If an error is thrown in `Chain.capture`'s `onError` handler, that error is
diff --git a/pkg/stack_trace/lib/src/frame.dart b/pkg/stack_trace/lib/src/frame.dart
index 67438c3..5b376e2 100644
--- a/pkg/stack_trace/lib/src/frame.dart
+++ b/pkg/stack_trace/lib/src/frame.dart
@@ -88,11 +88,7 @@
   ///
   /// This will usually be the string form of [uri], but a relative URI will be
   /// used if possible.
-  String get library {
-    if (uri.scheme != Uri.base.scheme) return uri.toString();
-    if (path.style == path.Style.url) return path.relative(uri.toString());
-    return path.relative(path.fromUri(uri));
-  }
+  String get library => path.prettyUri(uri);
 
   /// Returns the name of the package this stack frame comes from, or `null` if
   /// this stack frame doesn't come from a `package:` URL.
diff --git a/pkg/stack_trace/pubspec.yaml b/pkg/stack_trace/pubspec.yaml
index d0cc30f..e75d338 100644
--- a/pkg/stack_trace/pubspec.yaml
+++ b/pkg/stack_trace/pubspec.yaml
@@ -1,14 +1,14 @@
 name: stack_trace
-version: 0.9.3+1
+version: 0.9.3+2
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
   A package for manipulating stack traces and printing them readably.
 
 dependencies:
-  path: ">=1.0.0-rc.1 <2.0.0"
+  path: ">=1.2.0 <2.0.0"
 
 dev_dependencies:
-  unittest: ">=0.9.0 <0.10.0"
+  unittest: ">=0.9.0 <0.12.0"
 environment:
-  sdk: ">=0.8.10+6 <2.0.0"
+  sdk: ">=1.0.0 <2.0.0"
diff --git a/pkg/stack_trace/test/frame_test.dart b/pkg/stack_trace/test/frame_test.dart
index bbb905a..b800b0c 100644
--- a/pkg/stack_trace/test/frame_test.dart
+++ b/pkg/stack_trace/test/frame_test.dart
@@ -503,7 +503,7 @@
 
     test('returns the relative path for file URIs', () {
       expect(new Frame.parseVM('#0 Foo (foo/bar.dart:0:0)').library,
-          equals('foo/bar.dart'));
+          equals(path.join('foo', 'bar.dart')));
     });
   });
 
@@ -514,7 +514,7 @@
               '(http://dartlang.org/thing.dart:5:10)').location,
           equals('http://dartlang.org/thing.dart 5:10'));
       expect(new Frame.parseVM('#0 Foo (foo/bar.dart:1:2)').location,
-          equals('foo/bar.dart 1:2'));
+          equals('${path.join('foo', 'bar.dart')} 1:2'));
     });
   });
 
diff --git a/pkg/stack_trace/test/trace_test.dart b/pkg/stack_trace/test/trace_test.dart
index eeeff28..bc2db6b 100644
--- a/pkg/stack_trace/test/trace_test.dart
+++ b/pkg/stack_trace/test/trace_test.dart
@@ -224,7 +224,7 @@
 ''');
 
     expect(trace.toString(), equals('''
-foo/bar.dart 42:21                        Foo._bar
+${path.join('foo', 'bar.dart')} 42:21                        Foo._bar
 dart:async/future.dart 0:2                zip.<fn>.zap
 http://pub.dartlang.org/thing.dart 1:100  zip.<fn>.zap
 '''));
diff --git a/pkg/third_party/html5lib/pubspec.yaml b/pkg/third_party/html5lib/pubspec.yaml
index 66ff1c0..56d613b 100644
--- a/pkg/third_party/html5lib/pubspec.yaml
+++ b/pkg/third_party/html5lib/pubspec.yaml
@@ -6,7 +6,7 @@
 environment:
   sdk: '>=1.2.0 <2.0.0'
 dependencies:
-  csslib: '>=0.10.0-dev <0.11.0'
+  csslib: '>=0.10.0 <0.11.0'
   source_maps: '>=0.9.0 <0.10.0'
   utf: '>=0.9.0 <0.10.0'
 dev_dependencies:
diff --git a/runtime/bin/bin.gypi b/runtime/bin/bin.gypi
index b53f94b..2d498e2 100644
--- a/runtime/bin/bin.gypi
+++ b/runtime/bin/bin.gypi
@@ -211,7 +211,7 @@
             ['_toolset=="target"', {
               'defines': [
                 # Needed for sources outside of nss that include pr and ssl
-                # header files. 
+                # header files.
                 'MDCPUCFG="md/_linux.cfg"',
               ],
             }],
@@ -359,6 +359,9 @@
           'action_name': 'generate_resources_cc',
           'inputs': [
             '../tools/create_resources.py',
+            # The following two files are used to trigger a rebuild.
+            'vmservice/client/deployed/web/index.html',
+            'vmservice/client/deployed/web/index.html_bootstrap.dart.js',
             '<@(_sources)',
           ],
           'outputs': [
@@ -372,6 +375,7 @@
             '--inner_namespace', 'bin',
             '--table_name', 'service_bin',
             '--root_prefix', 'bin/',
+            '--client_root', 'bin/vmservice/client/deployed/',
             '<@(_sources)'
           ],
           'message': 'Generating ''<(resources_cc_file)'' file.'
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index 496e7c0..c20f7d1 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -5,6 +5,7 @@
 library builtin;
 import 'dart:io';
 import 'dart:async';
+import 'dart:convert';
 // import 'root_library'; happens here from C Code
 
 // The root library (aka the script) is imported into this library. The
@@ -107,6 +108,47 @@
 }
 
 
+void _httpGet(Uri uri, loadCallback(List<int> data)) {
+  var httpClient = new HttpClient();
+  try {
+    httpClient.getUrl(uri)
+      .then((HttpClientRequest request) {
+        request.persistentConnection = false;
+        return request.close();
+      })
+      .then((HttpClientResponse response) {
+        // Only create a ByteBuilder if multiple chunks are received.
+        var builder = new BytesBuilder(copy: false);
+        response.listen(
+            builder.add,
+            onDone: () {
+              if (response.statusCode != 200) {
+                var msg = 'Failure getting $uri: '
+                          '${response.statusCode} ${response.reasonPhrase}';
+                _asyncLoadError(uri.toString(), msg);
+              }
+
+              List<int> data = builder.takeBytes();
+              httpClient.close();
+              loadCallback(data);
+            },
+            onError: (error) {
+              _asyncLoadError(uri.toString(), error);
+            });
+      })
+      .catchError((error) {
+        _asyncLoadError(uri.toString(), error);
+      });
+  } catch (error) {
+    _asyncLoadError(uri.toString(), error);
+  }
+  // TODO(floitsch): remove this line. It's just here to push an event on the
+  // event loop so that we invoke the scheduled microtasks. Also remove the
+  // import of dart:async when this line is not needed anymore.
+  Timer.run(() {});
+}
+
+
 // Are we running on Windows?
 var _isWindows = false;
 var _workingWindowsDrivePrefix;
@@ -266,6 +308,59 @@
 }
 
 
+void _loadScript(String uri, List<int> data) native "Builtin_LoadScript";
+
+void _asyncLoadError(uri, error) native "Builtin_AsyncLoadError";
+
+
+// Asynchronously loads script data (source or snapshot) through
+// an http or file uri.
+_loadDataAsync(String uri) {
+  uri = _resolveScriptUri(uri);
+  Uri sourceUri = Uri.parse(uri);
+  if (sourceUri.scheme == 'http') {
+    _httpGet(sourceUri, (data) {
+      _loadScript(uri, data);
+    });
+  } else {
+    _loadDataFromFileAsync(uri);
+  }
+}
+
+_loadDataFromFileAsync(String uri) {
+  var sourceFile = new File(_filePathFromUri(uri));
+  sourceFile.readAsBytes().then((data) {
+    _loadScript(uri, data);
+  },
+  onError: (e) {
+    _asyncLoadError(uri, e);
+  });
+}
+
+
+void _loadLibrarySource(tag, uri, libraryUri, text)
+    native "Builtin_LoadLibrarySource";
+
+_loadSourceAsync(int tag, String uri, String libraryUri) {
+  var filePath = _filePathFromUri(uri);
+  Uri sourceUri = Uri.parse(filePath);
+  if (sourceUri.scheme == 'http') {
+    _httpGet(sourceUri, (data) {
+      var text = UTF8.decode(data);
+      _loadLibrarySource(tag, uri, libraryUri, text);
+    });
+  } else {
+    var sourceFile = new File(filePath);
+    sourceFile.readAsString().then((text) {
+      _loadLibrarySource(tag, uri, libraryUri, text);
+    },
+    onError: (e) {
+      _asyncLoadError(uri, e);
+    });
+  }
+}
+
+
 // Returns the directory part, the filename part, and the name
 // of a native extension URL as a list [directory, filename, name].
 // The directory part is either a file system path or an HTTP(S) URL.
diff --git a/runtime/bin/builtin_natives.cc b/runtime/bin/builtin_natives.cc
index 858aa27..2e63db0 100644
--- a/runtime/bin/builtin_natives.cc
+++ b/runtime/bin/builtin_natives.cc
@@ -62,7 +62,11 @@
   V(File_GetStdioHandleType, 1)                                                \
   V(File_GetType, 2)                                                           \
   V(File_AreIdentical, 2)                                                      \
-  V(Logger_PrintString, 1)
+  V(Logger_PrintString, 1)                                                     \
+  V(Builtin_LoadScript, 2)                                                     \
+  V(Builtin_LoadLibrarySource, 4)                                              \
+  V(Builtin_AsyncLoadError, 2)                                                 \
+
 
 BUILTIN_NATIVE_LIST(DECLARE_FUNCTION);
 
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index ec1696c..8ec584f 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -249,6 +249,12 @@
   ASSERT(buffer != NULL);
   ASSERT(buffer_len != NULL);
   ASSERT(!Dart_HasLivePorts());
+
+  // MakeHttpRequest uses the event loop (Dart_RunLoop) to handle the
+  // asynchronous request. This interferes with the use of Dart_RunLoop
+  // for asynchronous loading.
+  ASSERT(!Dart_IsVMFlagSet("load_async"));
+
   SingleArgDart_Invoke(builtin_lib, "_makeHttpRequest", uri);
   // Run until all ports to isolate are closed.
   Dart_Handle result = Dart_RunLoop();
@@ -529,6 +535,20 @@
                                      library);
   } else {
     // Handle 'import' or 'part' requests for all other URIs.
+
+    if (Dart_IsVMFlagSet("load_async")) {
+      // Call dart code to read the source code asynchronously.
+      const int kNumArgs = 3;
+      Dart_Handle dart_args[kNumArgs];
+      dart_args[0] = Dart_NewInteger(tag);
+      dart_args[1] = url;
+      dart_args[2] = library_url;
+      return Dart_Invoke(builtin_lib,
+                         NewString("_loadSourceAsync"),
+                         kNumArgs,
+                         dart_args);
+    }
+
     // Get the file path out of the url.
     Dart_Handle file_path = DartUtils::FilePathFromUri(url, builtin_lib);
     if (Dart_IsError(file_path)) {
@@ -590,8 +610,25 @@
 }
 
 
+Dart_Handle DartUtils::LoadScriptDataAsync(Dart_Handle script_uri,
+                     Dart_Handle builtin_lib) {
+  const int kNumArgs = 1;
+  Dart_Handle dart_args[kNumArgs];
+  dart_args[0] = script_uri;
+  return Dart_Invoke(builtin_lib,
+                     NewString("_loadDataAsync"),
+                     kNumArgs,
+                     dart_args);
+}
+
+
 Dart_Handle DartUtils::LoadScript(const char* script_uri,
                                   Dart_Handle builtin_lib) {
+  if (Dart_IsVMFlagSet("load_async")) {
+    Dart_Handle uri_handle = Dart_NewStringFromCString(script_uri);
+    return LoadScriptDataAsync(uri_handle, builtin_lib);
+  }
+
   Dart_Handle resolved_script_uri =
       ResolveScriptUri(NewString(script_uri), builtin_lib);
   if (Dart_IsError(resolved_script_uri)) {
@@ -634,6 +671,74 @@
 }
 
 
+// Callback function that gets called from asynchronous script loading code
+// when the data has been read. Loads the script or snapshot into the VM.
+void FUNCTION_NAME(Builtin_LoadScript)(Dart_NativeArguments args) {
+  Dart_Handle resolved_script_uri = Dart_GetNativeArgument(args, 0);
+  Dart_Handle data = Dart_GetNativeArgument(args, 1);
+
+  intptr_t num_bytes = 0;
+  Dart_Handle result = Dart_ListLength(data, &num_bytes);
+  DART_CHECK_VALID(result);
+
+  uint8_t* buffer = reinterpret_cast<uint8_t*>(malloc(num_bytes));
+  Dart_ListGetAsBytes(data, 0, buffer, num_bytes);
+
+  bool is_snapshot = false;
+  const uint8_t *payload =
+      DartUtils::SniffForMagicNumber(buffer, &num_bytes, &is_snapshot);
+
+  if (is_snapshot) {
+    result = Dart_LoadScriptFromSnapshot(payload, num_bytes);
+  } else {
+    Dart_Handle source = Dart_NewStringFromUTF8(buffer, num_bytes);
+    if (Dart_IsError(source)) {
+      result = DartUtils::NewError("%s is not a valid UTF-8 script",
+                                   resolved_script_uri);
+    } else {
+      result = Dart_LoadScript(resolved_script_uri, source, 0, 0);
+    }
+  }
+  free(const_cast<uint8_t *>(buffer));
+  if (Dart_IsError(result)) {
+    Dart_PropagateError(result);
+  }
+}
+
+
+// Callback function, gets called from asynchronous script and library
+// reading code when there is an i/o error.
+void FUNCTION_NAME(Builtin_AsyncLoadError)(Dart_NativeArguments args) {
+  // Dart_Handle script_uri = Dart_GetNativeArgument(args, 0);
+  Dart_Handle error = Dart_GetNativeArgument(args, 1);
+  Dart_Handle res = Dart_NewUnhandledExceptionError(error);
+  Dart_PropagateError(res);
+}
+
+
+// Callback function that gets called from dartutils when the library
+// source has been read. Loads the library or part into the VM.
+void FUNCTION_NAME(Builtin_LoadLibrarySource)(Dart_NativeArguments args) {
+  Dart_Handle tag_in = Dart_GetNativeArgument(args, 0);
+  Dart_Handle resolved_script_uri = Dart_GetNativeArgument(args, 1);
+  Dart_Handle library_uri = Dart_GetNativeArgument(args, 2);
+  Dart_Handle sourceText = Dart_GetNativeArgument(args, 3);
+
+  int64_t tag = DartUtils::GetIntegerValue(tag_in);
+
+  Dart_Handle result;
+  if (tag == Dart_kImportTag) {
+    result = Dart_LoadLibrary(resolved_script_uri, sourceText);
+  } else {
+    ASSERT(tag == Dart_kSourceTag);
+    Dart_Handle library = Dart_LookupLibrary(library_uri);
+    DART_CHECK_VALID(library);
+    result = Dart_LoadSource(library, resolved_script_uri, sourceText);
+  }
+  if (Dart_IsError(result)) Dart_PropagateError(result);
+}
+
+
 Dart_Handle DartUtils::LoadSource(Dart_Handle library,
                                   Dart_Handle url,
                                   Dart_LibraryTag tag,
diff --git a/runtime/bin/dartutils.h b/runtime/bin/dartutils.h
index 25e549b..4175eb5 100644
--- a/runtime/bin/dartutils.h
+++ b/runtime/bin/dartutils.h
@@ -188,6 +188,9 @@
                                 Dart_Handle url,
                                 Dart_Handle builtin_lib);
 
+  static Dart_Handle LoadScriptDataAsync(Dart_Handle script_uri,
+                                         Dart_Handle builtin_lib);
+
   // Sniffs the specified text_buffer to see if it contains the magic number
   // representing a script snapshot. If the text_buffer is a script snapshot
   // the return value is an updated pointer to the text_buffer pointing past
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index c58fd92..e394e36 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -544,20 +544,13 @@
   IsolateData* isolate_data = reinterpret_cast<IsolateData*>(data);
   ASSERT(isolate_data != NULL);
   ASSERT(isolate_data->script_url != NULL);
-  Dart_Handle library = DartUtils::LoadScript(isolate_data->script_url,
-                                              builtin_lib);
-  CHECK_RESULT(library);
-  if (!Dart_IsLibrary(library)) {
-    char errbuf[256];
-    snprintf(errbuf, sizeof(errbuf),
-             "Expected a library when loading script: %s",
-             script_uri);
-    *error = strdup(errbuf);
-    Dart_ExitScope();
-    Dart_ShutdownIsolate();
-    return NULL;
-  }
+  result = DartUtils::LoadScript(isolate_data->script_url, builtin_lib);
+  CHECK_RESULT(result);
 
+  if (Dart_IsVMFlagSet("load_async")) {
+    result = Dart_RunLoop();
+    CHECK_RESULT(result);
+  }
 
   Platform::SetPackageRoot(package_root);
   Dart_Handle io_lib_url = DartUtils::NewString(DartUtils::kIOLibURL);
diff --git a/runtime/bin/resources_sources.gypi b/runtime/bin/resources_sources.gypi
index e8f1529..a1bb648 100644
--- a/runtime/bin/resources_sources.gypi
+++ b/runtime/bin/resources_sources.gypi
@@ -9,73 +9,8 @@
     'vmservice/resources.dart',
     'vmservice/server.dart',
     'vmservice/vmservice_io.dart',
-# Observatory sources
-    'vmservice/client/deployed/web/index.html_bootstrap.dart.js',
-    'vmservice/client/deployed/web/packages/browser/interop.js',
-    'vmservice/client/deployed/web/packages/browser/dart.js',
-    'vmservice/client/deployed/web/packages/mutation_observer/mutation_observer.js',
-    'vmservice/client/deployed/web/packages/mutation_observer/mutation_observer.min.js',
-    'vmservice/client/deployed/web/packages/observatory/elements.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/service_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/sliding_checkbox.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/service_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/collapsible_content.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/css/shared.css',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/img/isolate_icon.png',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/curly_block.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/observatory_element.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/eval_link.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/response_viewer.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/observatory_application.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html',
-    'vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html',
-    'vmservice/client/deployed/web/packages/shadow_dom/shadow_dom.min.js',
-    'vmservice/client/deployed/web/packages/shadow_dom/shadow_dom.debug.js',
-    'vmservice/client/deployed/web/packages/shadow_dom/src/platform/patches-shadowdom-polyfill-before.js',
-    'vmservice/client/deployed/web/packages/shadow_dom/src/platform/platform-init.js',
-    'vmservice/client/deployed/web/packages/shadow_dom/src/platform/patches-shadowdom-polyfill.js',
-    'vmservice/client/deployed/web/packages/html_import/html_import.min.js',
-    'vmservice/client/deployed/web/packages/html_import/html_import.debug.js',
-    'vmservice/client/deployed/web/packages/html_import/tools/loader/loader.js',
-    'vmservice/client/deployed/web/packages/html_import/src/HTMLImports.js',
-    'vmservice/client/deployed/web/packages/html_import/src/boot.js',
-    'vmservice/client/deployed/web/packages/html_import/src/Parser.js',
-    'vmservice/client/deployed/web/packages/custom_element/custom-elements.debug.js',
-    'vmservice/client/deployed/web/packages/custom_element/custom-elements.min.js',
-    'vmservice/client/deployed/web/packages/polymer/boot.js',
-    'vmservice/client/deployed/web/favicon.ico',
-    'vmservice/client/deployed/web/index.html',
+# We no longer list client sources explicitly and instead include all deployed
+# files.
   ],
 }
 
diff --git a/runtime/bin/service_object_patch.dart b/runtime/bin/service_object_patch.dart
index f23dd71..b670598 100644
--- a/runtime/bin/service_object_patch.dart
+++ b/runtime/bin/service_object_patch.dart
@@ -17,7 +17,7 @@
     throw "Invalid path '${paths.join("/")}'";
   }
   if (paths.isEmpty) {
-    badPath();
+    return JSON.encode(_ioServiceObject());
   }
   int i = 0;
   var current = _servicePathMap;
@@ -35,6 +35,15 @@
   return JSON.encode(current(paths.sublist(i)));
 }
 
+Map _ioServiceObject() {
+  return {
+    'id': 'io',
+    'type': 'IO',
+    'name': 'io',
+    'user_name': 'io',
+  };
+}
+
 Map _httpServersServiceObject(args) {
   if (args.length == 1) {
     var server = _HttpServer._servers[int.parse(args.first)];
diff --git a/runtime/bin/vmservice/client/HACKING.txt b/runtime/bin/vmservice/client/HACKING.txt
index a368974..006003b 100644
--- a/runtime/bin/vmservice/client/HACKING.txt
+++ b/runtime/bin/vmservice/client/HACKING.txt
@@ -10,22 +10,20 @@
 
 1. Open runtime/bin/vmservice/client in the Dart Editor
 2. Run pub upgrade
-3. Launch dart --enable-vm-service --pause-isolates-on-exit script.dart
-4. Launch web/index.html in Dartium
+3. Run pub serve in runtime/bin/vmservice/client
+4. Launch dart --enable-vm-service --pause-isolates-on-exit script.dart
+5. Connect to http://localhost:8080 in Dartium.
 
 At this point you should see the initial Observatory UI and that
-it is communicating with the VM you launched in step 2.
+it is communicating with the VM you launched in step 4.
 
 Continue to develop and iterate until you're ready to upload your change
 for review. Upload your change and get an LGTM.
 
-5. Run pub build
-6. Run ./deploy.sh
-7. If you have added new resource files (images, html files) you must run
-resources.sh and use its output to update resources_sources.gypi (Standalone)
-and devtools.gypi (Dartium).
+6. Run pub build
+7. Run ./deploy.sh
 
-At this point you should rebuild your VM and using the build:
+At this point you should rebuild your VM and:
 
 8. Launch dart --enable-vm-service --pause-isolates-on-exit script.dart
 
diff --git a/runtime/bin/vmservice/client/build.sh b/runtime/bin/vmservice/client/build.sh
deleted file mode 100755
index 2084b46..0000000
--- a/runtime/bin/vmservice/client/build.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh
-
-# This script copies the build outputs produced by `pub build` to
-# the deployed directory.
-
-if [ ! -d "deployed" ]; then
-  echo "Run this script from the client directory"
-  exit
-fi
-
-# Fixup polymer breakage
-pushd lib/src
-find . -name "*.html" -exec ../../dotdot.sh {} \;
-popd
-
-# Build JS
-pub build
-
-# Undo polymer breakage fix
-pushd lib/src
-find . -name "*.html" -exec ../../notdotdot.sh {} \;
-popd
-
-# Deploy
-./deploy.sh
-
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index 425434f..564dd85 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -1,16 +1,347 @@
-<!DOCTYPE html><html><head><script src="packages/shadow_dom/shadow_dom.debug.js"></script>
-<script src="packages/custom_element/custom-elements.debug.js"></script>
-
+<!DOCTYPE html><html><head>
   <meta charset="utf-8">
   <title>Dart VM Observatory</title>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
-  <script type="text/javascript" src="https://www.google.com/jsapi"></script>
-  <script src="packages/browser/interop.js"></script>
   
-  <script src="index.html_bootstrap.dart.js"></script>
+  
+  
+  
+  
   
 </head>
-<body><polymer-element name="curly-block">
+<body>
+
+<!--
+These two files are from the Polymer project:
+https://github.com/Polymer/platform/ and https://github.com/Polymer/polymer/.
+
+You can replace platform.js and polymer.html with different versions if desired.
+-->
+<!-- minified for deployment: -->
+
+
+
+<!-- unminfied for debugging:
+<script src="../../packages/web_components/platform.concat.js"></script>
+<script src="src/js/polymer/polymer.concat.js"></script>
+<link rel="import" href="src/js/polymer/polymer-body.html">
+-->
+
+<!-- Teach dart2js about Shadow DOM polyfill objects. -->
+
+
+<!-- Bootstrap the user application in a new isolate. -->
+
+<!-- TODO(sigmund): replace boot.js by boot.dart (dartbug.com/18007)
+<script type="application/dart">export "package:polymer/boot.dart";</script>
+ -->
+<script src="packages/polymer/src/js/use_native_dartium_shadowdom.js"></script><script src="packages/web_components/platform.js"></script>
+<!-- <link rel="import" href="../polymer-dev/polymer.html"> -->
+<script src="packages/polymer/src/js/polymer/polymer.js"></script><polymer-element name="polymer-body" extends="body">
+
+  <script>
+
+  // upgrade polymer-body last so that it can contain other imported elements
+  document.addEventListener('polymer-ready', function() {
+    
+    Polymer('polymer-body', Platform.mixin({
+
+      created: function() {
+        this.template = document.createElement('template');
+        var body = wrap(document).body;
+        var c$ = body.childNodes.array();
+        for (var i=0, c; (c=c$[i]); i++) {
+          if (c.localName !== 'script') {
+            this.template.content.appendChild(c);
+          }
+        }
+        // snarf up user defined model
+        window.model = this;
+      },
+
+      parseDeclaration: function(elementElement) {
+        this.lightFromTemplate(this.template);
+      }
+
+    }, window.model));
+
+  });
+
+  </script>
+
+</polymer-element><script src="packages/web_components/dart_support.js"></script><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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style><script type="text/javascript" src="https://www.google.com/jsapi"></script>
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+
+  
+
+  
+  
+  
+<polymer-element name="curly-block">
   <template>
     <style>
       .idle {
@@ -53,11 +384,239 @@
 <polymer-element name="observatory-element">
   
 </polymer-element>
+
+  
 <polymer-element name="service-ref" extends="observatory-element">
   
 </polymer-element><polymer-element name="instance-ref" extends="service-ref">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <style>
+/* 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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <style>
       .errorBox {
         background-color: #f5f5f5;
@@ -162,9 +721,240 @@
   </template>
   
 </polymer-element>
+
+  
+  
+
+  
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <style>
       nav {
         position: fixed;
@@ -365,7 +1155,233 @@
 
 <polymer-element name="breakpoint-list" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
@@ -389,12 +1405,254 @@
   </template>
   
 </polymer-element>
+
+
 <polymer-element name="class-ref" extends="service-ref">
 
-<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+<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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
 
 </polymer-element>
+
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+
+  
+  
 <polymer-element name="eval-box" extends="observatory-element">
   <template>
     <style>
@@ -475,6 +1733,8 @@
 </polymer-element>
 
 
+
+  
 <polymer-element name="eval-link">
   <template>
     <style>
@@ -489,10 +1749,10 @@
     </style>
 
     <template if="{{ busy }}">
-      <span class="busy">[evaluate]</span>
+      <span class="busy">{{ label }}</span>
     </template>
     <template if="{{ !busy }}">
-      <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
+      <span class="idle"><a on-click="{{ evalNow }}">{{ label }}</a></span>
     </template>
     <template if="{{ result != null }}">
       = <instance-ref ref="{{ result }}"></instance-ref>
@@ -501,9 +1761,239 @@
   </template>
   
 </polymer-element>
+
+
+
+
 <polymer-element name="field-ref" extends="service-ref">
   <template>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <div>
       <template if="{{ ref['static'] }}">static</template>
       <template if="{{ ref['final'] }}">final</template>
@@ -520,8 +2010,237 @@
   </template>
   
 </polymer-element>
+
+
+
 <polymer-element name="function-ref" extends="service-ref">
-  <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css"><!-- These comments are here to allow newlines.
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style><!-- These comments are here to allow newlines.
      --><template if="{{ isDart }}"><!--
        --><template if="{{ qualified &amp;&amp; !hasParent &amp;&amp; hasClass }}"><!--
        --><class-ref ref="{{ ref['owner'] }}"></class-ref>.</template><!--
@@ -532,8 +2251,236 @@
   --></template><template if="{{ !isDart }}"><span> {{ name }}</span></template></template>
 
 </polymer-element>
+
+
 <polymer-element name="library-ref" extends="service-ref">
-<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+<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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
   <template if="{{ nameIsEmpty }}">
     <a href="{{ url }}">unnamed</a>
   </template>
@@ -543,16 +2490,471 @@
 </template>
 
 </polymer-element>
+
+
+
 <polymer-element name="script-ref" extends="service-ref">
 <template>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
   <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
 
 </polymer-element>
 <polymer-element name="class-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
@@ -689,9 +3091,237 @@
   </template>
   
 </polymer-element>
+
+  
 <polymer-element name="code-ref" extends="service-ref">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <template if="{{ code.isDartCode }}">
         <template if="{{ code.isOptimized }}">
           <a href="{{ url }}">*{{ name }}</a>
@@ -705,9 +3335,240 @@
     </template>
   </template>
 
-</polymer-element><polymer-element name="code-view" extends="observatory-element">
+</polymer-element>
+
+
+
+
+<polymer-element name="code-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <style>
       div.flex-row:hover {
         background-color: #FFF3E3;
@@ -866,6 +3727,8 @@
   </template>
   
 </polymer-element>
+
+  
 <polymer-element name="collapsible-content" extends="observatory-element">
   <template>
     <div class="well row">
@@ -878,9 +3741,238 @@
     </div>
   </template>
   
-</polymer-element><polymer-element name="error-view" extends="observatory-element">
+</polymer-element>
+  
+  
+<polymer-element name="error-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
@@ -892,9 +3984,242 @@
   </template>
   
 </polymer-element>
+
+  
+  
+  
+  
+  
+  
 <polymer-element name="field-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
@@ -977,6 +4302,17 @@
   </template>
   
 </polymer-element>
+
+  
+  
+  
+  
+  
+  
+  
+  
+
+  
 <polymer-element name="script-inset" extends="observatory-element">
   <template>
     <style>
@@ -1024,7 +4360,233 @@
 </polymer-element>
 <polymer-element name="function-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu>
@@ -1130,9 +4692,239 @@
   </template>
   
 </polymer-element>
+
+  
+  
+  
 <polymer-element name="heap-map" extends="observatory-element">
 <template>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
   <style>
     .hover {
       position: fixed;
@@ -1164,15 +4956,1482 @@
 </template>
 
 </polymer-element>
+
+  
+  
+  
+<polymer-element name="io-view" extends="observatory-element">
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>dart:io</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/http/servers')}}">HTTP Servers</a>
+        </li>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-http-server-list-view" extends="observatory-element">
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>HttpServers</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ httpServer in list['members'] }}">
+          <li class="list-group-item">
+            <io-http-server-ref ref="{{ httpServer }}"></io-http-server-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-http-server-ref" 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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-http-server-view" extends="observatory-element">
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>HttpServer</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Address</div>
+          <div class="memberValue">{{ httpServer['address'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Port</div>
+          <div class="memberValue">{{ httpServer['port'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Active connections</div>
+          <div class="memberValue">{{ httpServer['active'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Idle connections</div>
+          <div class="memberValue">{{ httpServer['idle'] }}</div>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+
+
+
 <polymer-element name="isolate-ref" extends="service-ref">
-<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+<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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 
 </polymer-element>
+
+  
+  
+  
+  
+  
+  
 <polymer-element name="isolate-summary" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <div class="flex-row">
       <div class="flex-item-10-percent">
         <img src="packages/observatory/src/elements/img/isolate_icon.png">
@@ -1271,7 +6530,233 @@
         white-space: pre;
       }
     </style>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <template if="{{ isolate.error != null }}">
       <div class="content-centered">
         <pre class="errorBox">{{ isolate.error.message }}</pre>
@@ -1285,47 +6770,52 @@
         <isolate-counter-chart counters="{{ isolate.counters }}"></isolate-counter-chart>
       </div>
       <div class="flex-item-40-percent">
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberName">new heap</div>
-              <div class="memberValue">
-                {{ isolate.newHeapUsed | formatSize }}
-                of
-                {{ isolate.newHeapCapacity | formatSize }}
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberName">old heap</div>
-              <div class="memberValue">
-                {{ isolate.oldHeapUsed | formatSize }}
-                of
-                {{ isolate.oldHeapCapacity | formatSize }}
-              </div>
-            </div>
-          </div>
-          <br>
+        <div class="memberList">
           <div class="memberItem">
+            <div class="memberName">new heap</div>
             <div class="memberValue">
-              See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+              {{ isolate.newHeapUsed | formatSize }}
+              of
+              {{ isolate.newHeapCapacity | formatSize }}
             </div>
           </div>
           <div class="memberItem">
+            <div class="memberName">old heap</div>
             <div class="memberValue">
-              See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+              {{ isolate.oldHeapUsed | formatSize }}
+              of
+              {{ isolate.oldHeapCapacity | formatSize }}
             </div>
           </div>
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
-              </div>
+        </div>
+        <br>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+          </div>
+        </div>
+        <template if="{{ isolate.ioEnabled }}">
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('io') }}">dart:io</a>
             </div>
           </div>
+        </template>
       </div>
       <div class="flex-item-10-percent">
       </div>
@@ -1340,9 +6830,246 @@
 </polymer-element>
 
 
+
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
 <polymer-element name="isolate-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <style>
       .sourceInset {
         padding-left: 15%;
@@ -1468,9 +7195,245 @@
   </template>
   
 </polymer-element>
+
+  
+  
+  
+  
+  
+  
+  
+  
+  
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ instance.isolate }}"></isolate-nav-menu>
@@ -1514,7 +7477,32 @@
           <div class="memberItem">
             <div class="memberName">retained size</div>
             <div class="memberValue">
-              <eval-link callback="{{ retainedSize }}"></eval-link>
+              <eval-link callback="{{ retainedSize }}" label="[calculate]">
+              </eval-link>
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">retaining path</div>
+            <div class="memberValue">
+              <template if="{{ path == null }}">
+                <eval-link callback="{{ retainingPath }}" label="[find]" expr="10">
+                </eval-link>
+              </template>
+              <template if="{{ path != null }}">
+                <template repeat="{{ element in path['elements'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ element['index']}}]</div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                  </div>
+                  </div>
+                </template>
+                <template if="{{ path['length'] > path['elements'].length }}">
+                  showing {{ path['elements'].length }} of {{ path['length'] }}
+                  <eval-link callback="{{ retainingPath }}" label="[find more]" expr="{{ path['elements'].length * 2 }}">
+                  </eval-link>
+                </template>
+              </template>
             </div>
           </div>
           <template if="{{ instance['type_class'] != null }}">
@@ -1607,10 +7595,13 @@
       </div>
       <br><br><br><br>
       <br><br><br><br>
+
     </template>
   </template>
   
 </polymer-element>
+
+
 <polymer-element name="json-view" extends="observatory-element">
   <template>
     <nav-bar>
@@ -1620,9 +7611,246 @@
   </template>
   
 </polymer-element>
+
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
 <polymer-element name="library-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
 
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -1749,6 +7977,379 @@
   </template>
   
 </polymer-element>
+
+  
+  
+
+  
+  
+
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+
+  
+  
+  
+<polymer-element name="heap-profile" extends="observatory-element">
+<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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
+  <style>
+    .table {
+      border-collapse: collapse!important;
+      width: 100%;
+      margin-bottom: 20px
+      table-layout: fixed;
+    }
+    .table td:nth-of-type(1) {
+      width: 30%;
+    }
+    .th, .td {
+      padding: 8px;
+      vertical-align: top;
+    }
+    .table thead > tr > th {
+      vertical-align: bottom;
+      text-align: left;
+      border-bottom:2px solid #ddd;
+    }
+    .clickable {
+      color: #0489c3;
+      text-decoration: none;
+      cursor: pointer;
+    }
+    .clickable:hover {
+      text-decoration: underline;
+      cursor: pointer;
+    }
+    #classtable tr:hover > td {
+      background-color: #F4C7C3;
+    }
+  </style>
+  <nav-bar>
+    <top-nav-menu></top-nav-menu>
+    <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
+    <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
+    <nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh>
+    <nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh>
+    <nav-refresh callback="{{ refresh }}"></nav-refresh>
+  </nav-bar>
+
+  <div class="flex-row">
+    <div id="newPieChart" class="flex-item-fixed-4-12" style="height: 400px">
+    </div>
+    <div id="newStatus" class="flex-item-fixed-2-12">
+      <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">Collections</div>
+            <div class="memberValue">{{ formattedCollections(true) }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Average Collection Time</div>
+            <div class="memberValue">{{ formattedAverage(true) }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Cumulative Collection Time</div>
+            <div class="memberValue">{{ formattedTotalCollectionTime(true) }}</div>
+          </div>
+      </div>
+    </div>
+    <div id="oldPieChart" class="flex-item-fixed-4-12" style="height: 400px">
+    </div>
+    <div id="oldStatus" class="flex-item-fixed-2-12">
+      <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">Collections</div>
+            <div class="memberValue">{{ formattedCollections(false) }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Average Collection Time</div>
+            <div class="memberValue">{{ formattedAverage(false) }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Cumulative Collection Time</div>
+            <div class="memberValue">{{ formattedTotalCollectionTime(false) }}</div>
+          </div>
+      </div>
+    </div>
+  </div>
+  <div class="flex-row">
+    <table id="classtable" class="flex-item-fixed-12-12 table">
+      <thead>
+        <tr>
+          <th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr template="" repeat="{{row in classTable.sortedRows }}">
+          <td><class-ref ref="{{ classTable.getValue(row, 0) }}"></class-ref></td>
+          <td title="{{ classTable.getValue(row, 1) }}">{{ classTable.getFormattedValue(row, 1) }}</td>
+          <td title="{{ classTable.getValue(row, 2) }}">{{ classTable.getFormattedValue(row, 2) }}</td>
+          <td title="{{ classTable.getValue(row, 3) }}">{{ classTable.getFormattedValue(row, 3) }}</td>
+          <td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td>
+          <td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td>
+          <td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td>
+          <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td>
+          <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+</template>
+
+</polymer-element>
+
+  
+  
+  
+  
+  
 <polymer-element name="sliding-checkbox">
   <template>
     <style>
@@ -1835,7 +8436,233 @@
 </polymer-element>
 <polymer-element name="isolate-profile" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
@@ -2014,124 +8841,239 @@
   </template>
   
 </polymer-element>
-<polymer-element name="heap-profile" extends="observatory-element">
-<template>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
-  <style>
-    .table {
-      border-collapse: collapse!important;
-      width: 100%;
-      margin-bottom: 20px
-      table-layout: fixed;
-    }
-    .table td:nth-of-type(1) {
-      width: 30%;
-    }
-    .th, .td {
-      padding: 8px;
-      vertical-align: top;
-    }
-    .table thead > tr > th {
-      vertical-align: bottom;
-      text-align: left;
-      border-bottom:2px solid #ddd;
-    }
-    .clickable {
-      color: #0489c3;
-      text-decoration: none;
-      cursor: pointer;
-    }
-    .clickable:hover {
-      text-decoration: underline;
-      cursor: pointer;
-    }
-    #classtable tr:hover > td {
-      background-color: #F4C7C3;
-    }
-  </style>
-  <nav-bar>
-    <top-nav-menu></top-nav-menu>
-    <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-    <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
-    <nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh>
-    <nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh>
-    <nav-refresh callback="{{ refresh }}"></nav-refresh>
-  </nav-bar>
 
-  <div class="flex-row">
-    <div id="newPieChart" class="flex-item-fixed-4-12" style="height: 400px">
-    </div>
-    <div id="newStatus" class="flex-item-fixed-2-12">
-      <div class="memberList">
-          <div class="memberItem">
-            <div class="memberName">Collections</div>
-            <div class="memberValue">{{ formattedCollections(true) }}</div>
-          </div>
-          <div class="memberItem">
-            <div class="memberName">Average Collection Time</div>
-            <div class="memberValue">{{ formattedAverage(true) }}</div>
-          </div>
-          <div class="memberItem">
-            <div class="memberName">Cumulative Collection Time</div>
-            <div class="memberValue">{{ formattedTotalCollectionTime(true) }}</div>
-          </div>
-      </div>
-    </div>
-    <div id="oldPieChart" class="flex-item-fixed-4-12" style="height: 400px">
-    </div>
-    <div id="oldStatus" class="flex-item-fixed-2-12">
-      <div class="memberList">
-          <div class="memberItem">
-            <div class="memberName">Collections</div>
-            <div class="memberValue">{{ formattedCollections(false) }}</div>
-          </div>
-          <div class="memberItem">
-            <div class="memberName">Average Collection Time</div>
-            <div class="memberValue">{{ formattedAverage(false) }}</div>
-          </div>
-          <div class="memberItem">
-            <div class="memberName">Cumulative Collection Time</div>
-            <div class="memberValue">{{ formattedTotalCollectionTime(false) }}</div>
-          </div>
-      </div>
-    </div>
-  </div>
-  <div class="flex-row">
-    <table id="classtable" class="flex-item-fixed-12-12 table">
-      <thead>
-        <tr>
-          <th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th>
-        </tr>
-      </thead>
-      <tbody>
-        <tr template="" repeat="{{row in classTable.sortedRows }}">
-          <td><class-ref ref="{{ classTable.getValue(row, 0) }}"></class-ref></td>
-          <td title="{{ classTable.getValue(row, 1) }}">{{ classTable.getFormattedValue(row, 1) }}</td>
-          <td title="{{ classTable.getValue(row, 2) }}">{{ classTable.getFormattedValue(row, 2) }}</td>
-          <td title="{{ classTable.getValue(row, 3) }}">{{ classTable.getFormattedValue(row, 3) }}</td>
-          <td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td>
-          <td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td>
-          <td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td>
-          <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td>
-          <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td>
-        </tr>
-      </tbody>
-    </table>
-  </div>
-</template>
-
-</polymer-element>
+  
+  
+  
 <polymer-element name="script-view" extends="observatory-element">
 <template>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
@@ -2153,9 +9095,245 @@
 </template>
 
 </polymer-element>
+
+  
+  
+  
+
+  
+  
+  
+  
+  
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <div class="flex-row">
       <div class="flex-item-fixed-1-12">
       </div>
@@ -2188,7 +9366,233 @@
 </polymer-element>
 <polymer-element name="stack-trace" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
@@ -2212,9 +9616,244 @@
   </template>
   
 </polymer-element>
+
+  
+  
+  
+  
+  
+  
+  
+  
 <polymer-element name="vm-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -2269,13 +9908,242 @@
   
 </polymer-element><polymer-element name="observatory-application" extends="observatory-element">
   <template>
-    <response-viewer app="{{ app }}"></response-viewer>
+    <response-viewer app="{{ this.app }}"></response-viewer>
   </template>
   
 </polymer-element>
+
+  
+  
 <polymer-element name="service-exception-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
@@ -2290,9 +10158,238 @@
   </template>
   
 </polymer-element>
+
+  
+  
 <polymer-element name="service-error-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
@@ -2304,8 +10401,236 @@
   </template>
   
 </polymer-element>
+
+
 <polymer-element name="vm-ref" extends="service-ref">
-<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+<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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 
@@ -2314,4 +10639,4 @@
 
   <observatory-application></observatory-application>
 
-</body></html>
\ No newline at end of file
+<script src="index.html_bootstrap.dart.js"></script></body></html>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
index 18e2653..3a6bb27 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
@@ -53,7 +53,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDD:"classes",gDe:"__$function",gDu:"exclusiveTicks",gE1:"__$counters",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJJ:"imports",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gKW:"__$label",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gMz:"__$pad",gNT:"__$refreshTime",gNo:"__$uncheckedText",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXR:"scripts",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ3:"variables",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdB:"__$callback",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",gfi:"__$busy",ghX:"__$endPos",ghi:"_fragmentationCanvas",giF:"chart",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gmu:"functions",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goM:"__$expand",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",VnP:"hitStyleNotExecuted",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function(a){"use strict"
+;(function(a){"use strict"
 function map(b){b={x:b}
 delete b.x
 return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
@@ -100,7 +100,7 @@
 var a5=(a3&1)===1
 var a6=b+a4!=g[0].length
 var a7=b4[2]
-var a8=3*a4+2*b+3
+var a8=2*a4+b+3
 var a9=b4.length>a8
 if(d){h=tearOff(g,b4,b6,b5,a6)
 b3[b5].$getter=h
@@ -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.qm("+"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.qm("+"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.qm(this,b,c,false,[f],d)
-return new h(this,b[0],f,d)}:function(){if(h===null)h=H.qm(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.kj("+"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.kj("+"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.kj(this,b,c,false,[f],d)
+return new h(this,b[0],f,d)}:function(){if(h===null)h=H.kj(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.qm(this,b,c,true,[],e).prototype
+return d?function(){if(h===void 0)h=H.kj(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=[]
@@ -154,9 +154,9 @@
 HT:{
 "^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
 "^":"",
-x:[function(a){return void 0},"$1","Ue",2,0,null,6,[]],
-Qu:[function(a,b,c,d){return{i:a,p:b,e:c,x:d}},"$4","yC",8,0,null,7,[],8,[],9,[],10,[]],
-ks:[function(a){var z,y,x,w
+x:function(a){return void 0},
+Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
+M3: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
@@ -166,79 +166,80 @@
 if(y===x)return z.i
 if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.w3(a)
 if(w==null){y=Object.getPrototypeOf(a)
-if(y==null||y===Object.prototype)return C.ZQ
-else return C.vB}return w},"$1","mz",2,0,null,6,[]],
-e1:[function(a){var z,y,x,w
+if(y==null||y===Object.prototype)return C.Sx
+else return C.vB}return w},
+TZ:function(a){var z,y,x,w
 z=$.Au
 if(z==null)return
 y=z
 for(z=y.length,x=J.x(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
-if(x.n(a,y[w]))return w}return},"$1","kC",2,0,null,11,[]],
-Xr:[function(a){var z,y,x
-z=J.e1(a)
+if(x.n(a,y[w]))return w}return},
+Dc:function(a){var z,y,x
+z=J.TZ(a)
 if(z==null)return
 y=$.Au
 x=z+1
 if(x>=y.length)return H.e(y,x)
-return y[x]},"$1","Tj",2,0,null,11,[]],
-Nq:[function(a,b){var z,y,x
-z=J.e1(a)
+return y[x]},
+Nq:function(a,b){var z,y,x
+z=J.TZ(a)
 if(z==null)return
 y=$.Au
 x=z+2
 if(x>=y.length)return H.e(y,x)
-return y[x][b]},"$2","BJ",4,0,null,11,[],12,[]],
+return y[x][b]},
 Gv:{
 "^":"a;",
 n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
 bu:function(a){return H.a5(a)},
-T:function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gZ2(),null))},"$1","gxK",2,0,null,47],
 gbx:function(a){return new H.cu(H.dJ(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
-kn:{
-"^":"bool/Gv;",
+yEe:{
+"^":"Gv;",
 bu:function(a){return String(a)},
 giO:function(a){return a?519018:218159},
-gbx:function(a){return C.HL},
-$isbool:true},
-Jh:{
-"^":"Null/Gv;",
+gbx:function(a){return C.BQ},
+$isa2:true},
+we:{
+"^":"Gv;",
 n:function(a,b){return null==b},
 bu:function(a){return"null"},
 giO:function(a){return 0},
-gbx:function(a){return C.Qf}},
-Ue1:{
+gbx:function(a){return C.GX},
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,47]},
+QI:{
 "^":"Gv;",
 giO:function(a){return 0},
 gbx:function(a){return C.CS}},
-FP:{
-"^":"Ue1;"},
-is:{
-"^":"Ue1;"},
+iC:{
+"^":"QI;"},
+kdQ:{
+"^":"QI;"},
 Q:{
-"^":"List/Gv;",
+"^":"Gv;",
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
 a.push(b)},
-KI:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
+W4:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("removeAt"))
 return a.splice(b,1)[0]},
-xe:function(a,b,c){if(b<0||b>a.length)throw H.b(P.N(b))
+aP:function(a,b,c){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.de(a[z],b)){a.splice(z,1)
+for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
 return!0}return!1},
 ev:function(a,b){return H.VM(new H.U5(a,b),[null])},
-Ft:[function(a,b){return H.VM(new H.kV(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},128,[]],
+Ft:[function(a,b){return H.VM(new H.zs(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"Gb",ret:P.cX,args:[{func:"hT",ret:P.cX,args:[a]}]}},this.$receiver,"Q")},48],
 FV:function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(a,z.gl())},
+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.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},128,[]],
+ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.cX,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},48],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -246,18 +247,15 @@
 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.q9(a,b,null,null)},
+eR:function(a,b){return H.j5(a,b,null,null)},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-D6:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
-if(c==null)c=a.length
-else{if(typeof c!=="number"||Math.floor(c)!==c)throw H.b(P.u(c))
-if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))}if(b===c)return H.VM([],[H.Kp(a,0)])
+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.Kp(a,0)])
 return H.VM(a.slice(b,c),[H.Kp(a,0)])},
-Jk:function(a,b){return this.D6(a,b,null)},
-Mu:function(a,b,c){H.K0(a,b,c)
-return H.q9(a,b,c,null)},
+Mu:function(a,b,c){H.xF(a,b,c)
+return H.j5(a,b,c,null)},
 gtH:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
@@ -274,19 +272,16 @@
 H.tb(a,c,a,b,z-c)
 if(typeof b!=="number")return H.s(b)
 this.sB(a,z-(c-b))},
-YW:function(a,b,c,d,e){if(!!a.immutable$list)H.vh(P.f("set range"))
-H.qG(a,b,c,d,e)},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 Vr:function(a,b){return H.Ck(a,b)},
-GT:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
+XP:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
 H.rd(a,b)},
-np:function(a){return this.GT(a,null)},
+Jd:function(a){return this.XP(a,null)},
 XU:function(a,b,c){return H.TK(a,b,c,a.length)},
 u8: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)},
 tg:function(a,b){var z
-for(z=0;z<a.length;++z)if(J.de(a[z],b))return!0
+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},
@@ -311,27 +306,14 @@
 if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
 a[b]=c},
-$isList:true,
-$isList:true,
+$isQ:true,
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null,
-static:{Qi: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}}},
-nM:{
-"^":"Q;",
-$isnM:true},
-iY:{
-"^":"nM;"},
-H6:{
-"^":"nM;",
-$isH6:true},
+$iscX:true,
+$ascX:null},
 P:{
-"^":"num/Gv;",
+"^":"Gv;",
 iM:function(a,b){var z
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a<b)return-1
@@ -352,7 +334,7 @@
 HG:function(a){return this.yu(this.UD(a))},
 UD:function(a){if(a<0)return-Math.round(-a)
 else return Math.round(a)},
-yM:function(a,b){var z
+Sy:function(a,b){var z
 if(b>20)throw H.b(P.C3(b))
 z=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+z
@@ -384,7 +366,7 @@
 cU: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},
-W4:function(a,b){return b>31?0:a<<b>>>0},
+KI: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
@@ -406,27 +388,22 @@
 return a<=b},
 F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return a>=b},
-$isnum:true,
-static:{"^":"SAz,N6l"}},
-bU:{
-"^":"int/P;",
+gbx:function(a){return C.yT},
+$isFK:true,
+static:{"^":"Ng,N6l"}},
+L7:{
+"^":"P;",
 gbx:function(a){return C.yw},
-$isdouble:true,
-$isnum:true,
-$isint:true},
+$isCP:true,
+$isFK:true,
+$isKN:true},
 Pp:{
-"^":"double/P;",
-gbx:function(a){return C.O4},
-$isdouble:true,
-$isnum:true},
-x1:{
-"^":"bU;"},
-VP:{
-"^":"x1;"},
-qa:{
-"^":"VP;"},
+"^":"P;",
+gbx:function(a){return C.AY},
+$isCP:true,
+$isFK:true},
 O:{
-"^":"String/Gv;",
+"^":"Gv;",
 j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
@@ -442,7 +419,7 @@
 if(w>=y)H.vh(P.N(w))
 w=b.charCodeAt(w)
 if(x>=z)H.vh(P.N(x))
-if(w!==a.charCodeAt(x))return}return new H.tQ(c,b,a)},
+if(w!==a.charCodeAt(x))return}return new H.Vo(c,b,a)},
 g:function(a,b){if(typeof b!=="string")throw H.b(P.u(b))
 return a+b},
 Tc:function(a,b){var z,y
@@ -451,21 +428,23 @@
 if(z>y)return!1
 return b===this.yn(a,y-z)},
 h8:function(a,b,c){return H.ys(a,b,c)},
-Fr:function(a,b){return a.split(b)},
-Qi:function(a,b,c){var z
+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 throw H.b("String.split(Pattern) UNIMPLEMENTED")},
+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.Qi(a,b,0)},
-Nj:function(a,b,c){var z
-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){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))
-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.z8(c,a.length))throw H.b(P.N(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))
 return a.substring(b,c)},
 yn:function(a,b){return this.Nj(a,b,null)},
 hc:function(a){return a.toLowerCase()},
@@ -483,7 +462,7 @@
 if(typeof b!=="number")return H.s(b)
 if(0>=b)return""
 if(b===1||a.length===0)return a
-if(b!==b>>>0)throw H.b(C.IU)
+if(b!==b>>>0)throw H.b(C.Eq)
 for(z=a,y="";!0;){if((b&1)===1)y=z+y
 b=b>>>1
 if(b===0)break
@@ -497,18 +476,17 @@
 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
 return-1},
 u8:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){var z,y,x
+Pk:function(a,b,c){var z,y
 c=a.length
-if(typeof b==="string"){z=b.length
+z=b.length
 y=a.length
 if(c+z>y)c=y-z
-return a.lastIndexOf(b,c)}for(z=J.rY(b),x=c;x>=0;--x)if(z.wL(b,a,x)!=null)return x
-return-1},
+return a.lastIndexOf(b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-Is:function(a,b,c){if(b==null)H.vh(P.u(null))
+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)},
-tg:function(a,b){return this.Is(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
@@ -528,23 +506,23 @@
 t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
 return a[b]},
-$isString:true,
-static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
+$isqU:true,
+static:{Ga:function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},"$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
+default:return!1}},mm:function(a,b){var z,y
 for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
 y=a.charCodeAt(b)
-if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},r9:function(a,b){var z,y,x
 for(z=a.length;b>0;b=y){y=b-1
 if(y>=z)H.vh(P.N(y))
 x=a.charCodeAt(y)
-if(x!==32&&x!==13&&!J.Ga(x))break}return b},"$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+if(x!==32&&x!==13&&!J.Ga(x))break}return b}}}}],["_isolate_helper","dart:_isolate_helper",,H,{
 "^":"",
-zd:[function(a,b){var z=a.vV(0,b)
+zd:function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
-return z},"$2","RTQ",4,0,null,16,[],17,[]],
-ox:[function(){--init.globalState.Xz.GL},"$0","q4",0,0,null],
-oT:[function(a,b){var z,y,x,w,v,u
+return z},
+cv:function(){--init.globalState.Xz.GL},
+wW:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=b
 b=b
@@ -552,40 +530,40 @@
 if(b==null){b=[]
 z.a=b
 y=b}else y=b
-if(!J.x(y).$isList)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
+if(!J.x(y).$isWO)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
 y=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
 y.i6(a)
 init.globalState=y
 if(init.globalState.EF===!0)return
 y=init.globalState.Hg++
-x=P.L5(null,null,null,J.bU,H.yo)
-w=P.Ls(null,null,null,J.bU)
-v=new H.yo(0,null,!1)
-u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
+x=P.L5(null,null,null,P.KN,H.zL)
+w=P.Ls(null,null,null,P.KN)
+v=new H.zL(0,null,!1)
+u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 w.h(0,0)
-u.aU(0,v)
-init.globalState.Nr=u
+u.O9(0,v)
+init.globalState.yc=u
 init.globalState.N0=u
-y=H.N7()
+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)
 if(y)u.vV(0,new H.JO(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},"$2","wr",4,0,null,18,[],19,[]],
-yl:[function(){var z=init.currentScript
+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 system=="function")return thisFilename()
 if(init.globalState.EF===!0)return H.fU()
-return},"$0","dY",0,0,null],
-fU:[function(){var z,y
+return},
+fU:function(){var z,y
 z=new Error().stack
 if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
 if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
 if(y!=null)return y[1]
 y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
 if(y!=null)return y[1]
-throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},"$0","mZ",0,0,null],
+throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
 Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=H.Hh(b.data)
 y=J.U6(z)
@@ -598,13 +576,13 @@
 s=y.t(z,"startPaused")
 r=H.Hh(y.t(z,"replyTo"))
 y=init.globalState.Hg++
-q=P.L5(null,null,null,J.bU,H.yo)
-p=P.Ls(null,null,null,J.bU)
-o=new H.yo(0,null,!1)
-n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
+q=P.L5(null,null,null,P.KN,H.zL)
+p=P.Ls(null,null,null,P.KN)
+o=new H.zL(0,null,!1)
+n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 p.h(0,0)
-n.aU(0,o)
-init.globalState.Xz.Rk.NZ(0,new H.IY(n,new H.jl(w,v,u,t,s,r),"worker-start"))
+n.O9(0,o)
+init.globalState.Xz.Rk.NZ(new H.IY(n,new H.mN(w,v,u,t,s,r),"worker-start"))
 init.globalState.N0=n
 init.globalState.Xz.bL()
 break
@@ -615,15 +593,15 @@
 l=y.t(z,"isSpawnUri")
 k=y.t(z,"startPaused")
 y=y.t(z,"replyPort")
-if(m==null)m=$.Ak()
+if(m==null)m=$.Rs()
 j=new Worker(m)
 j.onmessage=function(c,d){return function(e){c(d,e)}}(H.Mg,j)
-i=init.globalState.hJ++
+i=init.globalState.Y7++
 $.p6().u(0,j,i)
 init.globalState.XC.u(0,i,j)
-j.postMessage(H.Gy(P.EF(["command","start","id",i,"replyTo",H.Gy(y),"args",p,"msg",H.Gy(o),"isSpawnUri",l,"startPaused",k,"functionName",q],null,null)))
+j.postMessage(H.t0(P.EF(["command","start","id",i,"replyTo",H.t0(y),"args",p,"msg",H.t0(o),"isSpawnUri",l,"startPaused",k,"functionName",q],null,null)))
 break
-case"message":if(y.t(z,"port")!=null)J.Sq(y.t(z,"port"),y.t(z,"msg"))
+case"message":if(y.t(z,"port")!=null)J.m9(y.t(z,"port"),y.t(z,"msg"))
 init.globalState.Xz.bL()
 break
 case"close":init.globalState.XC.Rz(0,$.p6().t(0,a))
@@ -633,77 +611,80 @@
 case"log":H.ZF(y.t(z,"msg"))
 break
 case"print":if(init.globalState.EF===!0){y=init.globalState.vd
-q=H.Gy(P.EF(["command","print","msg",z],null,null))
+q=H.t0(P.EF(["command","print","msg",z],null,null))
 y.toString
-self.postMessage(q)}else P.JS(y.t(z,"msg"))
+self.postMessage(q)}else P.FL(y.t(z,"msg"))
 break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,20,[],21,[]],
-ZF:[function(a){var z,y,x,w
+case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,0,1],
+ZF:function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.vd
-x=H.Gy(P.EF(["command","log","msg",a],null,null))
+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)
-throw H.b(P.FM(z))}},"$1","eR",2,0,null,22,[]],
-Ws:[function(a,b,c,d,e,f){var z,y,x,w
+z=new H.oP(w,null)
+throw H.b(P.FM(z))}},
+Di:function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
-$.te=$.te+("_"+y)
+$.z7=$.z7+("_"+y)
 $.eb=$.eb+("_"+y)
 y=z.EE
 x=init.globalState.N0.jO
-w=z.Qy
-J.Sq(f,["spawned",new H.Z6(y,x),w,z.PX])
-x=new H.Vg(a,b,c,d)
-if(e===!0){z.v8(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},"$6","op",12,0,null,23,[],19,[],24,[],25,[],26,[],27,[]],
-Gy:[function(a){var z
-if(init.globalState.ji===!0){z=new H.NA(0,new H.X1())
-z.il=new H.fP(null)
-return z.h7(a)}else{z=new H.NO(new H.X1())
-z.il=new H.fP(null)
-return z.h7(a)}},"$1","YH",2,0,null,24,[]],
-Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},"$1","m6",2,0,null,24,[]],
-VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","lF",2,0,null,28,[]],
-ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","dD",2,0,null,28,[]],
+w=z.um
+J.m9(f,["spawned",new H.Ze(y,x),w,z.PX])
+x=new H.vK(a,b,c,d,z)
+if(e===!0){z.V0(w,w)
+init.globalState.Xz.Rk.NZ(new H.IY(z,x,"start isolate"))}else x.$0()},
+t0:function(a){var z
+if(init.globalState.ji===!0){z=new H.RS(0,new H.cx())
+z.mR=new H.aJ(null)
+return z.Zo(a)}else{z=new H.Qt(new H.cx())
+z.mR=new H.aJ(null)
+return z.Zo(a)}},
+Hh:function(a){if(init.globalState.ji===!0)return new H.EU(null).ug(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:{
-"^":"Tp:115;a,b",
-$0:[function(){this.b.$1(this.a.a)},"$0",null,0,0,null,"call"],
+"^":"Xs:42;a,b",
+$0:function(){this.b.$1(this.a.a)},
 $isEH:true},
 JO:{
-"^":"Tp:115;a,c",
-$0:[function(){this.c.$2(this.a.a,null)},"$0",null,0,0,null,"call"],
+"^":"Xs:42;a,c",
+$0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
 f0:{
-"^":"a;Hg,oL,hJ,N0,Nr,Xz,vu,EF,ji,i2<,vd,XC,w2<",
+"^":"a;Hg,oL,Y7,N0,yc,Xz,Ai,EF,ji,i2<,vd,XC,w2<",
 i6:function(a){var z,y,x,w
-z=$.C5()==null
-y=$.Nl()
+z=$.My()==null
+y=$.nB()
 x=z&&$.JU()===!0
 this.EF=x
-if(!x)y=y!=null&&$.Ak()!=null
+if(!x)y=y!=null&&$.Rs()!=null
 else y=!0
 this.ji=y
-this.vu=z&&!x
-this.Xz=new H.cC(P.NZ(null,H.IY),0)
-this.i2=P.L5(null,null,null,J.bU,H.aX)
-this.XC=P.L5(null,null,null,J.bU,null)
+this.Ai=z&&!x
+y=H.IY
+x=H.VM(new P.Sw(null,0,0,0),[y])
+x.Eo(null,y)
+this.Xz=new H.cC(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.JH()
 this.vd=z
 w=function(b,c){return function(d){b(c,d)}}(H.Mg,z)
 $.jk().onmessage=w
 $.jk().dartPrint=function(b){}}}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,mR,mf,pa",
-v8:function(a,b){if(!this.Qy.n(0,a))return
-if(this.lJ.h(0,b)&&!this.RW)this.RW=!0
+"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,Vp<,lJ,CN,M2,mf,pa,ir",
+V0:function(a,b){if(!this.um.n(0,a))return
+if(this.lJ.h(0,b)&&!this.UF)this.UF=!0
 this.PC()},
 NR:function(a){var z,y,x,w,v,u
-if(!this.RW)return
+if(!this.UF)return
 z=this.lJ
 z.Rz(0,a)
-if(z.X5===0){for(z=this.C9;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
+if(z.X5===0){for(z=this.Vp;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
 x=z.pop()
 y=init.globalState.Xz.Rk
 w=y.av
@@ -713,131 +694,155 @@
 y.av=w
 if(w<0||w>=u)return H.e(v,w)
 v[w]=x
-if(w===y.eZ)y.VW();++y.qT}this.RW=!1}this.PC()},
-iK:function(a){var z=this.Jp
+if(w===y.eZ)y.M9();++y.qT}this.UF=!1}this.PC()},
+uS:function(a){var z=this.CN
 if(z==null){z=[]
-this.Jp=z}if(J.kE(z,a))return
-this.Jp.push(a)},
-Hh:function(a){var z=this.Jp
+this.CN=z}if(J.x5(z,a))return
+this.CN.push(a)},
+IB:function(a){var z=this.CN
 if(z==null)return
-J.V1(z,a)},
+J.Dq(z,a)},
 MZ:function(a,b){if(!this.PX.n(0,a))return
 this.pa=b},
 Wq:function(a,b){var z,y
 z=J.x(b)
 if(!z.n(b,0))y=z.n(b,1)&&!this.mf
 else y=!0
-if(y){J.Sq(a,null)
+if(y){J.m9(a,null)
 return}y=new H.NY(a)
-if(z.n(b,2)){init.globalState.Xz.Rk.NZ(0,new H.IY(this,y,"ping"))
-return}z=this.mR
-if(z==null){z=P.NZ(null,null)
-this.mR=z}z.NZ(0,y)},
+if(z.n(b,2)){init.globalState.Xz.Rk.NZ(new H.IY(this,y,"ping"))
+return}z=this.M2
+if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
+z.Eo(null,null)
+this.M2=z}z.NZ(y)},
 bc: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.mf
 else y=!0
-if(y){this.Pb()
+if(y){this.Dm()
 return}if(z.n(b,2)){z=init.globalState.Xz
 y=this.gQb()
-z.Rk.NZ(0,new H.IY(this,y,"kill"))
-return}z=this.mR
-if(z==null){z=P.NZ(null,null)
-this.mR=z}z.NZ(0,this.gQb())},
-vV:function(a,b){var z,y,x
+z.Rk.NZ(new H.IY(this,y,"kill"))
+return}z=this.M2
+if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
+z.Eo(null,null)
+this.M2=z}z.NZ(this.gQb())},
+hk:function(a,b){var z,y
+z=this.ir
+if(z.X5===0){if(this.pa===!0&&this===init.globalState.yc)return
+z=$.jk()
+if(z.console!=null&&typeof z.console.error=="function")z.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.m9(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.mf=!0
-try{y=b.$0()}finally{this.mf=!1
+try{y=b.$0()}catch(v){u=H.Ru(v)
+x=u
+w=new H.oP(v,null)
+this.hk(x,w)
+if(this.pa===!0){this.Dm()
+if(this===init.globalState.yc)throw v}}finally{this.mf=!1
 init.globalState.N0=z
 if(z!=null)$=z.gEn()
-if(this.mR!=null)for(;x=this.mR,!x.gl0(x);)this.mR.AR().$0()}return y},
+if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,49,50],
 Ds:function(a){var z=J.U6(a)
-switch(z.t(a,0)){case"pause":this.v8(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.uS(z.t(a,1))
 break
-case"remove-ondone":this.Hh(z.t(a,1))
+case"remove-ondone":this.IB(z.t(a,1))
 break
 case"set-errors-fatal":this.MZ(z.t(a,1),z.t(a,2))
 break
 case"ping":this.Wq(z.t(a,1),z.t(a,2))
 break
 case"kill":this.bc(z.t(a,1),z.t(a,2))
+break
+case"getErrors":this.ir.h(0,z.t(a,1))
+break
+case"stopErrors":this.ir.Rz(0,z.t(a,1))
 break}},
-hV:function(a){return this.Gx.t(0,a)},
-aU:function(a,b){var z=this.Gx
+iQ:function(a){return this.Gx.t(0,a)},
+O9:function(a,b){var z=this.Gx
 if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
 z.u(0,a,b)},
-PC:function(){if(this.Gx.X5-this.fW.X5>0||this.RW)init.globalState.i2.u(0,this.jO,this)
-else this.Pb()},
-Pb:[function(){var z,y
-z=this.mR
+PC:function(){if(this.Gx.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
 if(z!=null)z.V1(0)
-for(z=this.Gx,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ro()
+for(z=this.Gx,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.pr()
 z.V1(0)
 this.fW.V1(0)
 init.globalState.i2.Rz(0,this.jO)
-z=this.Jp
-if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)
-this.Jp=null}},"$0","gQb",0,0,126],
+this.ir.V1(0)
+z=this.CN
+if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.m9(z.lo,null)
+this.CN=null}},"$0","gQb",0,0,15],
 $isaX:true},
 NY:{
-"^":"Tp:126;a",
-$0:[function(){J.Sq(this.a,null)},"$0",null,0,0,null,"call"],
+"^":"Xs:15;a",
+$0:[function(){J.m9(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
 "^":"a;Rk,GL",
-Jc:function(){var z=this.Rk
+mj:function(){var z=this.Rk
 if(z.av===z.eZ)return
 return z.AR()},
 xB:function(){var z,y,x
-z=this.Jc()
-if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.x4(init.globalState.Nr.jO)&&init.globalState.vu===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
+z=this.mj()
+if(z==null){if(init.globalState.yc!=null&&init.globalState.i2.x4(init.globalState.yc.jO)&&init.globalState.Ai===!0&&init.globalState.yc.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
 y=init.globalState
 if(y.EF===!0&&y.i2.X5===0&&y.Xz.GL===0){y=y.vd
-x=H.Gy(P.EF(["command","close"],null,null))
+x=H.t0(P.EF(["command","close"],null,null))
 y.toString
-self.postMessage(x)}return!1}z.VU()
+self.postMessage(x)}return!1}z.Fn()
 return!0},
-oV:function(){if($.C5()!=null)new H.RA(this).$0()
+Wu:function(){if($.My()!=null)new H.QB(this).$0()
 else for(;this.xB(););},
 bL:function(){var z,y,x,w,v
-if(init.globalState.EF!==!0)this.oV()
-else try{this.oV()}catch(x){w=H.Ru(x)
+if(init.globalState.EF!==!0)this.Wu()
+else try{this.Wu()}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 w=init.globalState.vd
-v=H.Gy(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
+v=H.t0(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
 w.toString
 self.postMessage(v)}}},
-RA:{
-"^":"Tp:126;a",
+QB:{
+"^":"Xs:15;a",
 $0:[function(){if(!this.a.xB())return
-P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
+P.ww(C.ny,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
-"^":"a;F1*,i3,G1*",
-VU:function(){if(this.F1.gRW()){this.F1.gC9().push(this)
-return}J.yn(this.F1,this.i3)},
+"^":"a;od*,i3,G1>",
+Fn:function(){if(this.od.gUF()){this.od.gVp().push(this)
+return}J.QT(this.od,this.i3)},
 $isIY:true},
 JH:{
 "^":"a;"},
-jl:{
-"^":"Tp:115;a,b,c,d,e,f",
-$0:[function(){H.Ws(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
+mN:{
+"^":"Xs:42;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},
-Vg:{
-"^":"Tp:126;a,b,c,d",
+vK:{
+"^":"Xs:15;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.N7()
+y=H.G3()
 x=H.KT(y,[y,y]).BD(z)
 if(x)z.$2(this.b,this.c)
 else{y=H.KT(y,[y]).BD(z)
@@ -846,195 +851,191 @@
 $isEH:true},
 Iy4:{
 "^":"a;",
-$isbC:true,
+$isRZ:true,
 $ishq:true},
-Z6:{
-"^":"Iy4;JE,Jz",
-zY:function(a,b){var z,y,x,w,v
+Ze:{
+"^":"Iy4;JE,tv",
+wR:function(a,b){var z,y,x,w,v
 z={}
-y=this.Jz
+y=this.tv
 x=init.globalState.i2.t(0,y)
 if(x==null)return
 w=this.JE
 if(w.gP0())return
 v=init.globalState.N0!=null&&init.globalState.N0.jO!==y
 z.a=b
-if(v)z.a=H.Gy(b)
+if(v)z.a=H.t0(b)
 if(x.gEE()===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.NZ(new H.IY(x,new H.Ua(z,this,v),w))},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isZ6&&J.de(this.JE,b.JE)},
-giO:function(a){return J.td(this.JE)},
-$isZ6:true,
-$isbC:true,
+return!!J.x(b).$isZe&&J.xC(this.JE,b.JE)},
+giO:function(a){return J.Mo(this.JE)},
+$isZe:true,
+$isRZ:true,
 $ishq:true},
 Ua:{
-"^":"Tp:115;a,b,c",
+"^":"Xs:42;a,b,c",
 $0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
-y.a=H.Hh(y.a)}J.t8(z,this.a.a)}},"$0",null,0,0,null,"call"],
+y.a=H.Hh(y.a)}z.Rf(this.a.a)}},"$0",null,0,0,null,"call"],
 $isEH:true},
-ns:{
-"^":"Iy4;hQ,bv,Jz",
-zY:function(a,b){var z,y
-z=H.Gy(P.EF(["command","message","port",this,"msg",b],null,null))
+dd:{
+"^":"Iy4;ZU,bv,tv",
+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.vd.toString
-self.postMessage(z)}else{y=init.globalState.XC.t(0,this.hQ)
+self.postMessage(z)}else{y=init.globalState.XC.t(0,this.ZU)
 if(y!=null)y.postMessage(z)}},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},
+return!!J.x(b).$isdd&&J.xC(this.ZU,b.ZU)&&J.xC(this.tv,b.tv)&&J.xC(this.bv,b.bv)},
 giO:function(a){var z,y,x
-z=J.Eh(this.hQ,16)
-y=J.Eh(this.Jz,8)
+z=J.Eh(this.ZU,16)
+y=J.Eh(this.tv,8)
 x=this.bv
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
-$isns:true,
-$isbC:true,
+$isdd:true,
+$isRZ:true,
 $ishq:true},
-yo:{
-"^":"a;ng>,bd,P0<",
-wy:function(a){return this.bd.$1(a)},
-ro:function(){this.P0=!0
-this.bd=null},
-cO:function(a){var z,y
+zL:{
+"^":"a;x6>,D1,P0<",
+zd:function(a){return this.D1.$1(a)},
+pr:function(){this.P0=!0
+this.D1=null},
+xO:function(a){var z,y
 if(this.P0)return
 this.P0=!0
-this.bd=null
+this.D1=null
 z=init.globalState.N0
-y=this.ng
+y=this.x6
 z.Gx.Rz(0,y)
 z.fW.Rz(0,y)
 z.PC()},
-FL:function(a,b){if(this.P0)return
-this.wy(b)},
-$isyo:true,
+Rf:function(a){if(this.P0)return
+this.zd(a)},
+$iszL:true,
 static:{"^":"v0"}},
-NA:{
-"^":"Tf;CN,il",
-DE:function(a){if(!!a.$isZ6)return["sendport",init.globalState.oL,a.Jz,J.td(a.JE)]
-if(!!a.$isns)return["sendport",a.hQ,a.Jz,a.bv]
+RS:{
+"^":"Tf;Ao,mR",
+DE:function(a){if(!!a.$isZe)return["sendport",init.globalState.oL,a.tv,J.Mo(a.JE)]
+if(!!a.$isdd)return["sendport",a.ZU,a.tv,a.bv]
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isku)return["capability",a.ng]
+yf:function(a){if(!!a.$isiV)return["capability",a.x6]
 throw H.b("Capability not serializable: "+a.bu(0))}},
-NO:{
-"^":"Nt;il",
-DE:function(a){if(!!a.$isZ6)return new H.Z6(a.JE,a.Jz)
-if(!!a.$isns)return new H.ns(a.hQ,a.bv,a.Jz)
+Qt:{
+"^":"ooy;mR",
+DE:function(a){if(!!a.$isZe)return new H.Ze(a.JE,a.tv)
+if(!!a.$isdd)return new H.dd(a.ZU,a.bv,a.tv)
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isku)return new H.ku(a.ng)
+yf:function(a){if(!!a.$isiV)return new H.iV(a.x6)
 throw H.b("Capability not serializable: "+a.bu(0))}},
-II:{
-"^":"Xb;RZ",
+EU:{
+"^":"lY;RZ",
 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.de(y,init.globalState.oL)){v=init.globalState.i2.t(0,x)
+if(J.xC(y,init.globalState.oL)){v=init.globalState.i2.t(0,x)
 if(v==null)return
-u=v.hV(w)
+u=v.iQ(w)
 if(u==null)return
-return new H.Z6(u,x)}else return new H.ns(y,w,x)},
-Op:function(a){return new H.ku(J.UQ(a,1))}},
-fP:{
+return new H.Ze(u,x)}else return new H.dd(y,w,x)},
+Op:function(a){return new H.iV(J.UQ(a,1))}},
+aJ:{
 "^":"a;MD",
 t:function(a,b){return b.__MessageTraverser__attached_info__},
 u:function(a,b,c){this.MD.push(b)
 b.__MessageTraverser__attached_info__=c},
-Hn:function(a){this.MD=[]},
-Xq:function(){var z,y,x
+CH:function(a){this.MD=[]},
+no:function(){var z,y,x
 for(z=this.MD.length,y=0;y<z;++y){x=this.MD
 if(y>=x.length)return H.e(x,y)
 x[y].__MessageTraverser__attached_info__=null}this.MD=null}},
-X1:{
+cx:{
 "^":"a;",
 t:function(a,b){return},
 u:function(a,b,c){},
-Hn:function(a){},
-Xq:function(){}},
+CH:function(a){},
+no:function(){}},
 BB:{
 "^":"a;",
-h7:function(a){var z
-if(H.VO(a))return this.Pq(a)
-this.il.Hn(0)
+Zo:function(a){var z
+if(H.vM(a))return this.Pq(a)
+this.mR.CH(0)
 z=null
-try{z=this.I8(a)}finally{this.il.Xq()}return z},
-I8:function(a){var z
+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.Pq(a)
 z=J.x(a)
-if(!!z.$isList)return this.wb(a)
+if(!!z.$isWO)return this.wb(a)
 if(!!z.$isZ0)return this.TI(a)
-if(!!z.$isbC)return this.DE(a)
+if(!!z.$isRZ)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")}},
-Nt:{
+return this.N1(a)},
+N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
+ooy:{
 "^":"BB;",
 Pq:function(a){return a},
-wb:function(a){var z,y,x,w,v,u
-z=this.il.t(0,a)
+wb:function(a){var z,y,x,w
+z=this.mR.t(0,a)
 if(z!=null)return z
 y=J.U6(a)
 x=y.gB(a)
-if(typeof x!=="number")return H.s(x)
 z=Array(x)
 z.fixed$length=init
-this.il.u(0,a,z)
-for(w=z.length,v=0;v<x;++v){u=this.I8(y.t(a,v))
-if(v>=w)return H.e(z,v)
-z[v]=u}return z},
+this.mR.u(0,a,z)
+for(w=0;w<x;++w)z[w]=this.Q9(y.t(a,w))
+return z},
 TI:function(a){var z,y
 z={}
-y=this.il.t(0,a)
+y=this.mR.t(0,a)
 z.a=y
 if(y!=null)return y
 y=P.L5(null,null,null,null,null)
 z.a=y
-this.il.u(0,a,y)
+this.mR.u(0,a,y)
 a.aN(0,new H.OW(z,this))
 return z.a},
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
 OW:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"$2",null,4,0,null,49,[],299,[],"call"],
+"^":"Xs:51;a,b",
+$2:function(a,b){var z=this.b
+J.kW(this.a.a,z.Q9(a),z.Q9(b))},
 $isEH:true},
 Tf:{
 "^":"BB;",
 Pq:function(a){return a},
 wb:function(a){var z,y
-z=this.il.t(0,a)
+z=this.mR.t(0,a)
 if(z!=null)return["ref",z]
-y=this.CN++
-this.il.u(0,a,y)
+y=this.Ao++
+this.mR.u(0,a,y)
 return["list",y,this.mE(a)]},
 TI:function(a){var z,y
-z=this.il.t(0,a)
+z=this.mR.t(0,a)
 if(z!=null)return["ref",z]
-y=this.CN++
-this.il.u(0,a,y)
-return["map",y,this.mE(J.qA(a.gvc())),this.mE(J.qA(a.gUQ(a)))]},
+y=this.Ao++
+this.mR.u(0,a,y)
+return["map",y,this.mE(J.Nd(a.gvc())),this.mE(J.Nd(a.gUQ(a)))]},
 mE:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
 x=[]
 C.Nm.sB(x,y)
-if(typeof y!=="number")return H.s(y)
-w=0
-for(;w<y;++w){v=this.I8(z.t(a,w))
+for(w=0;w<y;++w){v=this.Q9(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.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
-Xb:{
+lY:{
 "^":"a;",
-QS:function(a){if(H.ZR(a))return a
-this.RZ=P.Py(null,null,null,null,null)
+ug:function(a){if(H.ZR(a))return a
+this.RZ=P.YM(null,null,null,null,null)
 return this.XE(a)},
 XE:function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
@@ -1042,7 +1043,7 @@
 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.tv(a)
+case"map":return this.en(a)
 case"sendport":return this.Vf(a)
 case"capability":return this.Op(a)
 default:return this.PR(a)}},
@@ -1057,7 +1058,7 @@
 v=0
 for(;v<w;++v)z.u(x,v,this.XE(z.t(x,v)))
 return x},
-tv:function(a){var z,y,x,w,v,u,t,s
+en: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)
@@ -1073,11 +1074,11 @@
 return z},
 PR:function(a){throw H.b("Unexpected serialized object")}},
 yH:{
-"^":"a;Kf,zu,p9",
+"^":"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
-H.ox()
-if(this.Kf)$.jk().clearTimeout(this.p9)
+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."))},
 Qa:function(a,b){var z,y
@@ -1086,28 +1087,28 @@
 if(z){this.p9=1
 z=init.globalState.Xz
 y=init.globalState.N0
-z.Rk.NZ(0,new H.IY(y,new H.FA(this,b),"timer"))
+z.Rk.NZ(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.Av(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))}},
+this.p9=z.setTimeout(H.tR(new H.Wl(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))}},
 static:{cy:function(a,b){var z=new H.yH(!0,!1,null)
 z.Qa(a,b)
 return z}}},
-FA:{
-"^":"Tp:126;a,b",
+Av:{
+"^":"Xs:15;a,b",
 $0:[function(){this.a.p9=null
 this.b.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
-Av:{
-"^":"Tp:126;c,d",
+Wl:{
+"^":"Xs:15;c,d",
 $0:[function(){this.c.p9=null
-H.ox()
+H.cv()
 this.d.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
-ku:{
-"^":"a;ng>",
+iV:{
+"^":"a;x6>",
 giO:function(a){var z,y,x
-z=this.ng
+z=this.x6
 y=J.Wx(z)
 x=y.m(z,0)
 y=y.Z(z,4294967296)
@@ -1120,30 +1121,29 @@
 n:function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-if(!!J.x(b).$isku){z=this.ng
-y=b.ng
+if(!!J.x(b).$isiV){z=this.x6
+y=b.x6
 return z==null?y==null:z===y}return!1},
-$isku:true,
+$isiV:true,
 $ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
-wV:[function(a,b){var z
+Gp:function(a,b){var z
 if(b!=null){z=b.x
-if(z!=null)return z}return!!J.x(a).$isXj},"$2","b3",4,0,null,6,[],29,[]],
-d:[function(a){var z
+if(z!=null)return z}return!!J.x(a).$isXj},
+d:function(a){var z
 if(typeof a==="string")return a
 if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
 else if(!1===a)return"false"
 else if(a==null)return"null"
 z=J.AG(a)
 if(typeof z!=="string")throw H.b(P.u(a))
-return z},"$1","Sa",2,0,null,30,[]],
-Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"$1","c7",2,0,null,31,[]],
-eQ:[function(a){var z=a.$identityHash
+return z},
+eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
-a.$identityHash=z}return z},"$1","Y0",2,0,null,6,[]],
-vx:[function(a){throw H.b(P.cD(a))},"$1","Rm",2,0,32,14,[]],
-BU:[function(a,b,c){var z,y,x,w,v,u
-if(c==null)c=H.Rm()
+a.$identityHash=z}return z},
+rj:[function(a){throw H.b(P.cD(a))},"$1","kk",2,0,2],
+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))
 z=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a)
 if(b==null){if(z!=null){y=z.length
@@ -1151,8 +1151,7 @@
 if(z[2]!=null)return parseInt(a,16)
 if(3>=y)return H.e(z,3)
 if(z[3]!=null)return parseInt(a,10)
-return c.$1(a)}b=10}else{if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u("Radix is not an integer"))
-if(b<2||b>36)throw H.b(P.C3("Radix "+H.d(b)+" not in range 2..36"))
+return c.$1(a)}b=10}else{if(b<2||b>36)throw H.b(P.C3("Radix "+H.d(b)+" not in range 2..36"))
 if(z!=null){if(b===10){if(3>=z.length)return H.e(z,3)
 y=z[3]!=null}else y=!1
 if(y)return parseInt(a,10)
@@ -1168,78 +1167,78 @@
 if(!(v<u))break
 y.j(w,0)
 if(y.j(w,v)>x)return c.$1(a);++v}}}}if(z==null)return c.$1(a)
-return parseInt(a,b)},"$3","Yv",6,0,null,33,[],34,[],35,[]],
-IH:[function(a,b){var z,y
+return parseInt(a,b)},
+RR:function(a,b){var z,y
 if(typeof a!=="string")H.vh(P.u(a))
-if(b==null)b=H.Rm()
+if(b==null)b=H.kk()
 if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.$1(a)
 z=parseFloat(a)
 if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.$1(a)}return z},"$2","inc",4,0,null,33,[],35,[]],
-lh:[function(a){var z,y
-z=C.AS(J.x(a))
+return b.$1(a)}return z},
+lh:function(a){var z,y
+z=C.w2(J.x(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
 if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.xB.j(z,0)===36)z=C.xB.yn(z,1)
-return z+H.ia(H.oX(a),0,null)},"$1","Ig",2,0,null,6,[]],
-a5:[function(a){return"Instance of '"+H.lh(a)+"'"},"$1","jb",2,0,null,6,[]],
-RF:[function(a){var z,y,x,w,v,u
+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)+"'"},
+Cb: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},"$1","JG",2,0,null,36,[]],
-YF:[function(a){var z,y,x
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},
+YF:function(a){var z,y,x
 z=[]
-z.$builtinTypeInfo=[J.bU]
+z.$builtinTypeInfo=[P.KN]
 y=new H.a7(a,a.length,0,null)
 y.$builtinTypeInfo=[H.Kp(a,0)]
 for(;y.G();){x=y.lo
 if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
 if(x<=65535)z.push(x)
 else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},"$1","nE",2,0,null,37,[]],
-eT:[function(a){var z,y
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.Cb(z)},
+eT:function(a){var z,y
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.YF(a)}return H.RF(a)},"$1","Wb",2,0,null,38,[]],
-Lw:[function(a){var z
+if(y>65535)return H.YF(a)}return H.Cb(a)},
+Lw:function(a){var z
 if(typeof a!=="number")return H.s(a)
 if(0<=a){if(a<=65535)return String.fromCharCode(a)
 if(a<=1114111){z=a-65536
-return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},"$1","cK",2,0,null,39,[]],
-zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
+return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
+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))
 if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
 if(typeof d!=="number"||Math.floor(d)!==d)H.vh(P.u(d))
 if(typeof e!=="number"||Math.floor(e)!==e)H.vh(P.u(e))
 if(typeof f!=="number"||Math.floor(f)!==f)H.vh(P.u(f))
-z=J.xH(b,1)
+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))
 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},"$8","mV",16,0,null,40,[],41,[],42,[],43,[],44,[],45,[],46,[],47,[]],
-o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},"$1","j1",2,0,null,48,[]],
-VK:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-return a[b]},"$2","Zl",4,0,null,6,[],49,[]],
-aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-a[b]=c},"$3","WJ",6,0,null,6,[],49,[],30,[]],
-zo:[function(a,b,c){var z,y,x
+return w.valueOf()}return y},
+U8:function(a){if(a.date===void 0)a.date=new Date(a.y3)
+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))
+return a[b]},
+Ch:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
+a[b]=c},
+zo:function(a,b,c){var z,y,x
 z={}
 z.a=0
 y=[]
 x=[]
 if(b!=null){z.a=b.length
 C.Nm.FV(y,b)}z.b=""
-if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},"$3","pT",6,0,null,17,[],50,[],51,[]],
-im:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+if(c!=null&&!c.gl0(c))c.aN(0,new H.lk(z,y,x))
+return J.T1(a,new H.mX(C.Ka,"$"+z.a+z.b,0,y,x,null))},
+im:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z={}
 if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
 if(y==null)return H.zo(a,b,c)
@@ -1250,7 +1249,7 @@
 if(w!==b.length)return H.zo(a,b,c)
 v=P.L5(null,null,null,null,null)
 for(u=x.hG,t=0;t<u;++t){s=t+w
-v.u(0,x.KE(s),init.metadata[x.Fk(s)])}z.a=!1
+v.u(0,x.QN(s),init.metadata[x.Fk(s)])}z.a=!1
 c.aN(0,new H.u8(z,v))
 if(z.a)return H.zo(a,b,c)
 C.Nm.FV(b,v.gUQ(v))
@@ -1259,33 +1258,21 @@
 C.Nm.FV(r,b)
 y=a["$"+q]
 if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},"$3","fl",6,0,null,17,[],50,[],51,[]],
-mN:[function(a){if(a=="String")return C.Kn
-if(a=="int")return C.c1
-if(a=="double")return C.yX
-if(a=="num")return C.oD
-if(a=="bool")return C.Fm
-if(a=="List")return C.E3
-if(a=="Null")return C.x0
-return init.allClasses[a]},"$1","JL",2,0,null,52,[]],
-SG:[function(a){return a===C.Kn||a===C.c1||a===C.yX||a===C.oD||a===C.Fm||a===C.E3||a===C.x0},"$1","EN",2,0,null,6,[]],
-Pq:[function(){var z={x:0}
-delete z.x
-return z},"$0","vg",0,0,null],
-s:[function(a){throw H.b(P.u(a))},"$1","Ff",2,0,null,53,[]],
-e:[function(a,b){if(a==null)J.q8(a)
+return y.apply(a,r)},
+s:function(a){throw H.b(P.u(a))},
+e:function(a,b){if(a==null)J.q8(a)
 if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},"$2","x3",4,0,null,48,[],15,[]],
-b:[function(a){var z
+throw H.b(P.N(b))},
+b:function(a){var z
 if(a==null)a=new P.LK()
 z=new Error()
 z.dartException=a
-if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.Ju})
-z.name=""}else z.toString=H.Ju
-return z},"$1","Cr",2,0,null,54,[]],
-Ju:[function(){return J.AG(this.dartException)},"$0","Eu",0,0,null],
-vh:[function(a){throw H.b(a)},"$1","xE",2,0,null,54,[]],
-Ru:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+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","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.Am(a)
 if(a==null)return
 if(typeof a!=="object")return a
@@ -1294,23 +1281,23 @@
 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.GG(x,16)&8191)===10)switch(w){case 438:return z.$1(H.vR(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=$.OI()
+return z.$1(new H.Zo(v,null))}}if(a instanceof TypeError){v=$.WD()
+u=$.KL()
 t=$.PH()
 s=$.D1()
 r=$.rx()
 q=$.Kr()
-p=$.zO()
+p=$.W6()
 $.Bi()
 o=$.eA()
 n=$.ko()
 m=v.qS(y)
-if(m!=null)return z.$1(H.T3(y,m))
+if(m!=null)return z.$1(H.vR(y,m))
 else{m=u.qS(y)
 if(m!=null){m.method="call"
-return z.$1(H.T3(y,m))}else{m=t.qS(y)
+return z.$1(H.vR(y,m))}else{m=t.qS(y)
 if(m==null){m=s.qS(y)
 if(m==null){m=r.qS(y)
 if(m==null){m=q.qS(y)
@@ -1320,32 +1307,32 @@
 if(m==null){m=n.qS(y)
 v=m!=null}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0
 if(v){v=m==null?null:m.method
-return z.$1(new H.W0(y,v))}}}v=typeof y==="string"?y:""
+return z.$1(new H.Zo(y,v))}}}v=typeof y==="string"?y:""
 return z.$1(new H.vV(v))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.VS()
 return z.$1(new P.AT(null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.VS()
-return a},"$1","v2",2,0,null,54,[]],
-CU:[function(a){if(a==null||typeof a!='object')return J.v1(a)
-else return H.eQ(a)},"$1","Zs",2,0,null,6,[]],
-B7:[function(a,b){var z,y,x,w
+return a},
+CU:function(a){if(a==null||typeof a!='object')return J.v1(a)
+else return H.eQ(a)},
+B7:function(a,b){var z,y,x,w
 z=a.length
 for(y=0;y<z;y=w){x=y+1
 w=x+1
-b.u(0,a[y],a[x])}return b},"$2","nD",4,0,null,56,[],57,[]],
-ft:[function(a,b,c,d,e,f,g){var z=J.x(c)
+b.u(0,a[y],a[x])}return b},
+Ib:[function(a,b,c,d,e,f,g){var z=J.x(c)
 if(z.n(c,0))return H.zd(b,new H.dr(a))
 else if(z.n(c,1))return H.zd(b,new H.TL(a,d))
-else if(z.n(c,2))return H.zd(b,new H.KX(a,d,e))
-else if(z.n(c,3))return H.zd(b,new H.uZ(a,d,e,f))
-else if(z.n(c,4))return H.zd(b,new H.OQ(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","mD",14,0,null,58,[],16,[],59,[],60,[],61,[],62,[],63,[]],
-tR:[function(a,b){var z
+else if(z.n(c,2))return H.zd(b,new H.uZ(a,d,e))
+else if(z.n(c,3))return H.zd(b,new H.OQ(a,d,e,f))
+else if(z.n(c,4))return H.zd(b,new H.Qx(a,d,e,f,g))
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","DB",14,0,null,3,4,5,6,7,8,9],
+tR:function(a,b){var z
 if(a==null)return
 z=a.$identity
 if(!!z)return z
-z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.ft)
+z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.Ib)
 a.$identity=z
-return z},"$2","qN",4,0,null,58,[],64,[]],
-iA:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return z},
+HA:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=b[0]
 z.$stubName
 y=z.$callName
@@ -1356,56 +1343,56 @@
 if(d)v=function(){this.$initialize()}
 else if(typeof dart_precompiled=="function"){u=function(g,h,i,j){this.$initialize(g,h,i,j)}
 v=u}else{u=$.OK
-$.OK=J.WB(u,1)
+$.OK=J.ew(u,1)
 u=new Function("a","b","c","d","this.$initialize(a,b,c,d);"+u)
 v=u}w.constructor=v
 v.prototype=w
 u=!d
 if(u){t=e.length==1&&!0
-s=H.SD(a,z,t)
+s=H.bx(a,z,t)
 s.$reflectionInfo=c}else{w.$name=f
 s=z
 t=!1}if(typeof x=="number")r=function(g){return function(){return init.metadata[g]}}(x)
-else if(u&&typeof x=="function"){q=t?H.yS:H.eZ
+else if(u&&typeof x=="function"){q=t?H.HY:H.dS
 r=function(g,h){return function(){return g.apply({$receiver:h(this)},arguments)}}(x,q)}else throw H.b("Error in reflectionInfo.")
 w.$signature=r
 w[y]=s
 for(u=b.length,p=1;p<u;++p){o=b[p]
 n=o.$callName
-if(n!=null){m=d?o:H.SD(a,o,t)
+if(n!=null){m=d?o:H.bx(a,o,t)
 w[n]=m}}w["call*"]=s
-return v},"$6","Xd",12,0,null,48,[],65,[],66,[],67,[],68,[],69,[]],
-vq:[function(a,b,c,d){var z=H.eZ
+return v},
+vq:function(a,b,c,d){var z=H.dS
 switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
 case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
 case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
 case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
 case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
 case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
-default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},"$4","X5",8,0,null,64,[],70,[],71,[],17,[]],
-SD:[function(a,b,c){var z,y,x,w,v,u
-if(c)return H.wg(a,b)
+default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
+bx:function(a,b,c){var z,y,x,w,v,u
+if(c)return H.Hf(a,b)
 z=b.$stubName
 y=b.length
 x=a[z]
 w=b==null?x==null:b===x
 if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
 if(y===0){w=$.bf
-if(w==null){w=H.B3("self")
+if(w==null){w=H.E2("self")
 $.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
 v=$.OK
-$.OK=J.WB(v,1)
+$.OK=J.ew(v,1)
 return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
 w="return function("+u+"){return this."
 v=$.bf
-if(v==null){v=H.B3("self")
+if(v==null){v=H.E2("self")
 $.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
 w=$.OK
-$.OK=J.WB(w,1)
-return new Function(v+H.d(w)+"}")()},"$3","Fw",6,0,null,48,[],17,[],72,[]],
-Z4:[function(a,b,c,d){var z,y
-z=H.eZ
-y=H.yS
+$.OK=J.ew(w,1)
+return new Function(v+H.d(w)+"}")()},
+Z4:function(a,b,c,d){var z,y
+z=H.dS
+y=H.HY
 switch(b?-1:a){case 0:throw H.b(H.Ef("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)
@@ -1415,12 +1402,12 @@
 case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
 default:return function(e,f,g,h){return function(){h=[g(this)]
 Array.prototype.push.apply(h,arguments)
-return e.apply(f(this),h)}}(d,z,y)}},"$4","VT",8,0,null,64,[],70,[],12,[],17,[]],
-wg:[function(a,b){var z,y,x,w,v,u,t,s
+return e.apply(f(this),h)}}(d,z,y)}},
+Hf:function(a,b){var z,y,x,w,v,u,t,s
 z=H.oN()
-y=$.P4
-if(y==null){y=H.B3("receiver")
-$.P4=y}x=b.$stubName
+y=$.U9
+if(y==null){y=H.E2("receiver")
+$.U9=y}x=b.$stubName
 w=b.length
 v=typeof dart_precompiled=="function"
 u=a[x]
@@ -1428,45 +1415,44 @@
 if(v||!t||w>=28)return H.Z4(w,!t,x,b)
 if(w===1){y="return function(){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+");"
 t=$.OK
-$.OK=J.WB(t,1)
+$.OK=J.ew(t,1)
 return new Function(y+H.d(t)+"}")()}s="abcdefghijklmnopqrstuvwxyz".split("").splice(0,w-1).join(",")
 y="return function("+s+"){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+", "+s+");"
 t=$.OK
-$.OK=J.WB(t,1)
-return new Function(y+H.d(t)+"}")()},"$2","FT",4,0,null,48,[],17,[]],
-qm:[function(a,b,c,d,e,f){b.fixed$length=init
+$.OK=J.ew(t,1)
+return new Function(y+H.d(t)+"}")()},
+kj:function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},"$6","Rz",12,0,null,48,[],65,[],66,[],67,[],68,[],12,[]],
-SE:[function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"$2","H7",4,0,null,30,[],74,[]],
-Go:[function(a,b){var z
+return H.HA(a,b,c,!!d,e,f)},
+aE:function(a,b){var z=J.U6(b)
+throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},
+Go:function(a,b){var z
 if(a!=null)z=typeof a==="object"&&J.x(a)[b]
 else z=!0
 if(z)return a
-H.SE(a,b)},"$2","CY",4,0,null,30,[],74,[]],
-ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"$1","RK",2,0,null,75,[]],
-KT:[function(a,b,c){return new H.tD(a,b,c,null)},"$3","HN",6,0,null,77,[],78,[],79,[]],
-Og:[function(a,b){var z=a.name
+H.aE(a,b)},
+ag:function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},
+KT:function(a,b,c){return new H.GN(a,b,c,null)},
+Og:function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.tu(z)
-return new H.fw(z,b,null)},"$2","ZPJ",4,0,null,80,[],81,[]],
-N7:[function(){return C.KZ},"$0","cI",0,0,null],
-uV:[function(a){return new H.cu(a,null)},"$1","IZ",2,0,null,12,[]],
-VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},"$2","Ub",4,0,null,82,[],83,[]],
-oX:[function(a){if(a==null)return
-return a.$builtinTypeInfo},"$1","Cb",2,0,null,82,[]],
-IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"$2","PE",4,0,null,82,[],84,[]],
-ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"$3","Cn",6,0,null,82,[],84,[],15,[]],
-Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"$2","tC",4,0,null,82,[],15,[]],
-Ko:[function(a,b){if(a==null)return"dynamic"
+return new H.Tu(z,b,null)},
+G3:function(){return C.KZ},
+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)
+return z==null?null:z[c]},
+Kp:function(a,b){var z=H.oX(a)
+return z==null?null:z[b]},
+Ko:function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
-else if(typeof a==="number"&&Math.floor(a)===a)if(b==null)return C.jn.bu(a)
-else return b.$1(a)
-else return},"$2$onTypeVariable","bR",2,3,null,85,11,[],86,[]],
-ia:[function(a,b,c){var z,y,x,w,v,u
+else if(typeof a==="number"&&Math.floor(a)===a)return C.jn.bu(a)
+else return},
+ia:function(a,b,c){var z,y,x,w,v,u
 if(a==null)return""
 z=P.p9("")
 for(y=b,x=!0,w=!0;y<a.length;++y){if(x)x=!1
@@ -1474,40 +1460,41 @@
 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)+">"},"$3$onTypeVariable","iM",4,3,null,85,87,[],88,[],86,[]],
-dJ:[function(a){var z=typeof a==="object"&&a!==null&&a.constructor===Array?"List":J.x(a).constructor.builtin$cls
-return z+H.ia(a.$builtinTypeInfo,0,null)},"$1","Yx",2,0,null,6,[]],
-Y9:[function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
+z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
+dJ:function(a){var z=J.x(a).constructor.builtin$cls
+if(a==null)return z
+return z+H.ia(a.$builtinTypeInfo,0,null)},
+Y9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
 else if(typeof a=="function"){a=H.ml(a,null,b)
 if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function")b=H.ml(a,null,b)}return b},"$2","zL",4,0,null,89,[],90,[]],
-RB:[function(a,b,c,d){var z,y
+else if(typeof a=="function")b=H.ml(a,null,b)}return b},
+RB:function(a,b,c,d){var z,y
 if(a==null)return!1
 z=H.oX(a)
 y=J.x(a)
 if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},"$4","Ap",8,0,null,6,[],91,[],92,[],93,[]],
-hv:[function(a,b){var z,y
+return H.hv(H.Y9(y[d],z),c)},
+hv:function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
 for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},"$2","QY",4,0,null,94,[],95,[]],
-IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"$3","k2",6,0,null,96,[],97,[],98,[]],
-XY:[function(a,b){var z,y
-if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="Null"
+return!0},
+IG: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
 z=H.oX(a)
 a=J.x(a)
 if(z!=null){y=z.slice()
 y.splice(0,0,a)}else y=a
-return H.t1(y,b)},"$2","Dk",4,0,null,99,[],95,[]],
-t1:[function(a,b){var z,y,x,w,v,u,t
+return H.t1(y,b)},
+t1:function(a,b){var z,y,x,w,v,u,t
 if(a===b)return!0
 if(a==null||b==null)return!0
 if("func" in b){if(!("func" in a)){if("$is_"+H.d(b.func) in a)return!0
 z=a.$signature
 if(z==null)return!1
-a=z.apply(a,null)}return H.Ly(a,b)}if(b.builtin$cls==="EH"&&"func" in a)return!0
+a=z.apply(a,null)}return H.J4(a,b)}if(b.builtin$cls==="EH"&&"func" in a)return!0
 y=typeof a==="object"&&a!==null&&a.constructor===Array
 x=y?a[0]:a
 w=typeof b==="object"&&b!==null&&b.constructor===Array
@@ -1518,8 +1505,8 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},"$2","Mb",4,0,null,94,[],95,[]],
-Hc:[function(a,b,c){var z,y,x,w,v
+return H.hv(H.Y9(t,y),w)},
+Hc:function(a,b,c){var z,y,x,w,v
 if(b==null&&a==null)return!0
 if(b==null)return c
 if(a==null)return!1
@@ -1528,8 +1515,8 @@
 if(c){if(z<y)return!1}else if(z!==y)return!1
 for(x=0;x<y;++x){w=a[x]
 v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"$3","d1",6,0,null,94,[],95,[],100,[]],
-Vt:[function(a,b){var z,y,x,w,v,u
+if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},
+Vt:function(a,b){var z,y,x,w,v,u
 if(b==null)return!0
 if(a==null)return!1
 z=Object.getOwnPropertyNames(b)
@@ -1539,8 +1526,8 @@
 if(!Object.hasOwnProperty.call(a,w))return!1
 v=b[w]
 u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"$2","y3",4,0,null,94,[],95,[]],
-Ly:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},
+J4:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(!("func" in a))return!1
 if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
 y=b.ret
@@ -1561,13 +1548,13 @@
 n=w[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
 n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"$2","Sj",4,0,null,94,[],95,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"$3","fW",6,0,null,17,[],48,[],90,[]],
-kj:[function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.$1(a))},"$1","aZ",2,0,null,101,[]],
-wzi:[function(a){return H.eQ(a)},"$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},"$3","OU",6,0,null,101,[],74,[],30,[]],
-w3:[function(a){var z,y,x,w,v,u
+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)},
+Pq:function(a){var z=$.NF
+return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
+KS:function(a){return H.eQ(a)},
+bm:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
+w3:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.nw[z]
 if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
@@ -1588,43 +1575,45 @@
 return y.i}if(v==="~"){$.vv[z]=x
 return x}if(v==="-"){u=H.Va(x)
 Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}if(v==="+")return H.Lc(a,x)
+return u.i}if(v==="+")return H.B1(a,x)
 if(v==="*")throw H.b(P.SY(z))
 if(init.leafTags[z]===true){u=H.Va(x)
 Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}else return H.Lc(a,x)},"$1","eU",2,0,null,101,[]],
-Lc:[function(a,b){var z,y
+return u.i}else return H.B1(a,x)},
+B1:function(a,b){var z,y
 z=Object.getPrototypeOf(a)
 y=J.Qu(b,z,null,null)
 Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return b},"$2","qF",4,0,null,101,[],7,[]],
-Va:[function(a){return J.Qu(a,!1,null,!!a.$isXj)},"$1","MlJ",2,0,null,7,[]],
-VF:[function(a,b,c){var z=b.prototype
+return b},
+Va:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
+ow:function(a,b,c){var z=b.prototype
 if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},"$3","vi",6,0,null,102,[],103,[],8,[]],
-XD:[function(){if(!0===$.Bv)return
+else return J.Qu(z,c,null,null)},
+XD:function(){if(!0===$.Bv)return
 $.Bv=!0
-H.Z1()},"$0","Ki",0,0,null],
-Z1:[function(){var z,y,x,w,v,u,t
+H.Z1()},
+Z1:function(){var z,y,x,w,v,u,t,s
 $.nw=Object.create(null)
 $.vv=Object.create(null)
 H.kO()
 z=init.interceptorsByTag
 y=Object.getOwnPropertyNames(z)
 if(typeof window!="undefined"){window
-for(x=0;x<y.length;++x){w=y[x]
-v=$.x7.$1(w)
-if(v!=null){u=H.VF(w,z[w],v)
-if(u!=null)Object.defineProperty(v,init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})}}}for(x=0;x<y.length;++x){w=y[x]
-if(/^[A-Za-z_]/.test(w)){t=z[w]
-z["!"+w]=t
-z["~"+w]=t
-z["-"+w]=t
-z["+"+w]=t
-z["*"+w]=t}}},"$0","vU",0,0,null],
-kO:[function(){var z,y,x,w,v,u,t
+x=function(){}
+for(w=0;w<y.length;++w){v=y[w]
+u=$.x7.$1(v)
+if(u!=null){t=H.ow(v,z[v],u)
+if(t!=null){Object.defineProperty(u,init.dispatchPropertyName,{value:t,enumerable:false,writable:true,configurable:true})
+x.prototype=u}}}}for(w=0;w<y.length;++w){v=y[w]
+if(/^[A-Za-z_]/.test(v)){s=z[v]
+z["!"+v]=s
+z["~"+v]=s
+z["-"+v]=s
+z["+"+v]=s
+z["*"+v]=s}}},
+kO:function(){var z,y,x,w,v,u,t
 z=C.MA()
-z=H.ud(C.Mc,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ur(C.AS),z)))))))
+z=H.ud(C.JS,H.ud(C.NH,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]
 if(y.constructor==Array)for(x=0;x<y.length;++x){w=y[x]
@@ -1633,56 +1622,44 @@
 t=z.prototypeForTag
 $.NF=new H.dC(v)
 $.TX=new H.wN(u)
-$.x7=new H.VX(t)},"$0","Hb",0,0,null],
-ud:[function(a,b){return a(b)||b},"$2","rM",4,0,null,104,[],105,[]],
-ZT:[function(a,b){var z,y,x,w,v,u
+$.x7=new H.VX(t)},
+ud:function(a,b){return a(b)||b},
+ZT:function(a,b){var z,y,x,w,v,u
 z=H.VM([],[P.Od])
 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.tQ(v,b,a))
+z.push(new H.Vo(v,b,a))
 u=v+x
 if(u===y)break
-else w=v===u?w+1:u}return z},"$2","tl",4,0,null,110,[],111,[]],
-m2:[function(a,b,c){var z,y
+else w=v===u?w+1:u}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
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"$3","WL",6,0,null,48,[],112,[],88,[]],
-ys:[function(a,b,c){var z,y,x,w,v
-if(typeof b==="string")if(b==="")if(a==="")return c
+return y.test(z)}else return J.yx(z.dd(b,C.xB.yn(a,c)))}},
+ys:function(a,b,c){var z,y,x,w
+if(b==="")if(a==="")return c
 else{z=P.p9("")
 y=a.length
 z.KF(c)
 for(x=0;x<y;++x){w=a[x]
 w=z.vM+=w
-z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace("$","$$$$"))
-else if(!!J.x(b).$isVR){v=b.gl9()
-v.lastIndex=0
-return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(P.u(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"$3","uF",6,0,null,48,[],113,[],114,[]],
-Zd:{
-"^":"a;"},
-xQ:{
-"^":"a;"},
-F0:{
-"^":"a;"},
-pa:{
+z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
+ysD:{
 "^":"a;",
-gl0:function(a){return J.de(this.gB(this),0)},
-gor:function(a){return!J.de(this.gB(this),0)},
+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)},
-Ix:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
-u:function(a,b,c){return this.Ix()},
-Rz:function(a,b){return this.Ix()},
-V1:function(a){return this.Ix()},
-FV:function(a,b){return this.Ix()},
+EP:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
+u:function(a,b,c){return this.EP()},
+V1:function(a){return this.EP()},
+FV:function(a,b){return this.EP()},
 $isZ0:true},
-LPe:{
-"^":"pa;B>,HV,tc",
-di:function(a){return this.gUQ(this).Vr(0,new H.LD(this,a))},
+Px:{
+"^":"ysD;B>,HV,tc",
 x4:function(a){if(typeof a!=="string")return!1
 if("__proto__"===a)return!1
 return this.HV.hasOwnProperty(a)},
@@ -1694,33 +1671,19 @@
 for(y=0;y<z.length;++y){x=z[y]
 b.$2(x,this.TZ(x))}},
 gvc:function(){return H.VM(new H.XR(this),[H.Kp(this,0)])},
-gUQ:function(a){return H.K1(this.tc,new H.jJ(this),H.Kp(this,0),H.Kp(this,1))},
+gUQ:function(a){return H.K1(this.tc,new H.hY(this),H.Kp(this,0),H.Kp(this,1))},
 $isyN:true},
-LD:{
-"^":"Tp;a,b",
-$1:[function(a){return J.de(a,this.b)},"$1",null,2,0,null,30,[],"call"],
-$isEH:true,
-$signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
-jJ:{
-"^":"Tp:116;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,49,[],"call"],
+hY:{
+"^":"Xs:10;a",
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,52,"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
-gA:function(a){return J.GP(this.Y3.tc)}},
-LI:{
+gA:function(a){return J.mY(this.Y3.tc)}},
+mX:{
 "^":"a;lK,uk,xI,rq,FX,Nc",
-gWa:function(){var z,y,x
-z=this.lK
-if(!!J.x(z).$iswv)return z
-y=$.bx().t(0,z)
-if(y!=null){x=y.split(":")
-if(0>=x.length)return H.e(x,0)
-z=x[0]}x=new H.GD(z)
-this.lK=x
-return x},
-glT:function(){return this.xI===1},
-ghB:function(){return this.xI===2},
+gWa:function(){return this.lK},
+gUA:function(){return this.xI===0},
 gnd:function(){var z,y,x,w
 if(this.xI===1)return C.xD
 z=this.rq
@@ -1731,88 +1694,33 @@
 x.push(z[w])}x.immutable$list=!0
 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.wv,null)
+gZ2:function(){var z,y,x,w,v,u,t,s
+if(this.xI!==0)return P.Fl(P.IN,null)
 z=this.FX
 y=z.length
 x=this.rq
 w=x.length-y
-if(y===0)return P.Fl(P.wv,null)
-v=P.L5(null,null,null,P.wv,null)
+if(y===0)return P.Fl(P.IN,null)
+v=P.L5(null,null,null,P.IN,null)
 for(u=0;u<y;++u){if(u>=z.length)return H.e(z,u)
 t=z[u]
 s=w+u
 if(s<0||s>=x.length)return H.e(x,s)
 v.u(0,new H.GD(t),x[s])}return v},
-ZU:function(a){var z,y,x,w,v,u,t,s,r,q
-z=J.x(a)
-y=this.uk
-x=Object.prototype.hasOwnProperty.call(init.interceptedNames,y)||$.Dq.indexOf(y)!==-1
-if(x){w=a===z?null:z
-v=z
-z=w}else{v=a
-z=null}u=v[y]
-if(typeof u!="function"){t=J.GL(this.gWa())
-u=v[t+"*"]
-if(u==null){z=J.x(a)
-u=z[t+"*"]
-if(u!=null)x=!0
-else z=null}s=!0}else s=!1
-if(typeof u=="function"){if(!("$reflectable" in u)){r=J.x(a)
-q=!!r.$isv||!!r.$isBp}else q=!0
-if(!q)H.Hz(J.GL(this.gWa()))
-if(s)return new H.IW(H.zh(u),y,u,x,z)
-else return new H.A2(y,u,x,z)}else return new H.F3(z)},
-static:{"^":"Kq,oY,zl"}},
-A2:{
-"^":"a;Pi<,mr,eK<,Ot",
-gpf:function(){return!1},
-gIt:function(){return!!this.mr.$getterStub},
-Bj:function(a,b){var z,y
-if(!this.eK){if(b.constructor!==Array)b=P.F(b,!0,null)
-z=a}else{y=[a]
-C.Nm.FV(y,b)
-z=this.Ot
-z=z!=null?z:a
-b=y}return this.mr.apply(z,b)}},
-IW:{
-"^":"A2;qa,Pi,mr,eK,Ot",
-To:function(a){return this.qa.$1(a)},
-gIt:function(){return!1},
-Bj:function(a,b){var z,y,x,w,v,u,t
-z=this.qa
-y=z.Rv
-x=y+z.hG
-if(!this.eK){if(b.constructor===Array){w=b.length
-if(w<x)b=P.F(b,!0,null)}else{b=P.F(b,!0,null)
-w=b.length}v=a}else{u=[a]
-C.Nm.FV(u,b)
-v=this.Ot
-v=v!=null?v:a
-w=u.length-1
-b=u}if(z.Mo&&w>y)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+b.length+" arguments."))
-else if(w<y)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too few)."))
-else if(w>x)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too many)."))
-for(t=w;t<x;++t)C.Nm.h(b,init.metadata[z.BX(0,t)])
-return this.mr.apply(v,b)}},
-F3:{
-"^":"a;e0",
-gpf:function(){return!0},
-gIt:function(){return!1},
-Bj:function(a,b){var z=this.e0
-return J.jf(z==null?a:z,b)}},
+static:{"^":"hAw,eHF,zl"}},
 FD:{
 "^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
-XL:function(a){var z=this.Rn[2*a+this.hG+3]
+XL:function(a){var z=this.Rn[a+this.hG+3]
 return init.metadata[z]},
 BX:function(a,b){var z=this.Rv
-if(J.u6(b,z))return
+if(typeof b!=="number")return b.C()
+if(b<z)return
 return this.Rn[3+b-z]},
 Fk:function(a){var z=this.Rv
 if(a<z)return
 if(!this.Mo||this.hG===1)return this.BX(0,a)
 return this.BX(0,this.e4(a-z))},
-KE:function(a){var z=this.Rv
+QN:function(a){var z=this.Rv
 if(a<z)return
 if(!this.Mo||this.hG===1)return this.XL(a)
 return this.XL(this.e4(a-z))},
@@ -1820,55 +1728,47 @@
 z={}
 if(this.NE==null){y=this.hG
 this.NE=Array(y)
-x=P.Fl(J.O,J.bU)
+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()
 y=P.F(y,!0,H.ip(y,"mW",0))
 H.rd(y,null)
-H.bQ(y,new H.Nv(z,this,x))}z=this.NE
+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]},
-hl:function(a){var z,y
-z=this.AM
-if(typeof z=="number")return init.metadata[z]
-else if(typeof z=="function"){y=new a()
-H.VM(y,y["<>"])
-return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},
-gx5:function(){return this.mr.$reflectionName},
-static:{"^":"vS,FV,C1,bt",zh:function(a){var z,y,x,w
+static:{"^":"t4,FV,Tj,yM",zh:function(a){var z,y,x
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
 z=z
 y=z[0]
-x=y>>1
-w=z[1]
-return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
-Nv:{
-"^":"Tp:32;a,b,c",
-$1:[function(a){var z,y,x
+x=z[1]
+return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
+uV:{
+"^":"Xs:2;a,b,c",
+$1:function(a){var z,y,x
 z=this.b.NE
 y=this.a.a++
 x=this.c.t(0,a)
 if(y>=z.length)return H.e(z,y)
-z[y]=x},"$1",null,2,0,null,12,[],"call"],
+z[y]=x},
 $isEH:true},
-Cj:{
-"^":"Tp:301;a,b,c",
-$2:[function(a,b){var z=this.a
+lk:{
+"^":"Xs:53;a,b,c",
+$2:function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
-this.b.push(b);++z.a},"$2",null,4,0,null,12,[],53,[],"call"],
+this.b.push(b);++z.a},
 $isEH:true},
 u8:{
-"^":"Tp:301;a,b",
-$2:[function(a,b){var z=this.b
+"^":"Xs:53;a,b",
+$2:function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"$2",null,4,0,null,302,[],30,[],"call"],
+else this.a.a=!0},
 $isEH:true},
 Zr:{
-"^":"a;bT,rq,Xs,Fa,Ga,EP",
+"^":"a;bT,rq,Xs,Fa,Ga,cR",
 qS:function(a){var z,y,x
 z=new RegExp(this.bT).exec(a)
 if(z==null)return
@@ -1881,10 +1781,10 @@
 if(x!==-1)y.expr=z[x+1]
 x=this.Ga
 if(x!==-1)y.method=z[x+1]
-x=this.EP
+x=this.cR
 if(x!==-1)y.receiver=z[x+1]
 return y},
-static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
+static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",cM:function(a){var z,y,x,w,v,u
 a=a.replace(String({}),'$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
 if(z==null)z=[]
@@ -1893,40 +1793,40 @@
 w=z.indexOf("\\$expr\\$")
 v=z.indexOf("\\$method\\$")
 u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"$1","dx",2,0,null,24,[]],S7:[function(a){return function(b){var $argumentsExpr$='$arguments$'
-try{b.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},"$1","LS",2,0,null,55,[]],Mj:[function(a){return function(b){try{b.$method$}catch(z){return z.message}}(a)},"$1","cl",2,0,null,55,[]]}},
-W0:{
-"^":"Ge;K9,Ga",
+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)}}},
+Zo:{
+"^":"XS;V7,Ga",
 bu:function(a){var z=this.Ga
-if(z==null)return"NullError: "+H.d(this.K9)
+if(z==null)return"NullError: "+H.d(this.V7)
 return"NullError: Cannot call \""+H.d(z)+"\" on null"},
 $ismp:true,
-$isGe:true},
-az:{
-"^":"Ge;K9,Ga,EP",
+$isXS:true},
+u0:{
+"^":"XS;V7,Ga,cR",
 bu:function(a){var z,y
 z=this.Ga
-if(z==null)return"NoSuchMethodError: "+H.d(this.K9)
-y=this.EP
-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)+")"},
+if(z==null)return"NoSuchMethodError: "+H.d(this.V7)
+y=this.cR
+if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.V7)+")"
+return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.V7)+")"},
 $ismp:true,
-$isGe:true,
-static:{T3:function(a,b){var z,y
+$isXS:true,
+static:{vR:function(a,b){var z,y
 z=b==null
 y=z?null:b.method
 z=z?null:b.receiver
-return new H.az(a,y,z)}}},
+return new H.u0(a,y,z)}}},
 vV:{
-"^":"Ge;K9",
-bu:function(a){var z=this.K9
+"^":"XS;V7",
+bu:function(a){var z=this.V7
 return C.xB.gl0(z)?"Error":"Error: "+z}},
 Am:{
-"^":"Tp:116;a",
-$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},"$1",null,2,0,null,171,[],"call"],
+"^":"Xs:10;a",
+$1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
+return a},
 $isEH:true},
-XO:{
+oP:{
 "^":"a;lA,ui",
 bu:function(a){var z,y
 z=this.ui
@@ -1937,75 +1837,68 @@
 this.ui=z
 return z}},
 dr:{
-"^":"Tp:115;a",
-$0:[function(){return this.a.$0()},"$0",null,0,0,null,"call"],
+"^":"Xs:42;a",
+$0:function(){return this.a.$0()},
 $isEH:true},
 TL:{
-"^":"Tp:115;b,c",
-$0:[function(){return this.b.$1(this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
-KX:{
-"^":"Tp:115;d,e,f",
-$0:[function(){return this.d.$2(this.e,this.f)},"$0",null,0,0,null,"call"],
+"^":"Xs:42;b,c",
+$0:function(){return this.b.$1(this.c)},
 $isEH:true},
 uZ:{
-"^":"Tp:115;UI,bK,Gq,Rm",
-$0:[function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},"$0",null,0,0,null,"call"],
+"^":"Xs:42;d,e,f",
+$0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
 OQ:{
-"^":"Tp:115;w3,HZ,mG,xC,cj",
-$0:[function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},"$0",null,0,0,null,"call"],
+"^":"Xs:42;UI,bK,IU,Rm",
+$0:function(){return this.UI.$3(this.bK,this.IU,this.Rm)},
 $isEH:true},
-Tp:{
+Qx:{
+"^":"Xs:42;w3,HZ,mG,xC,pb",
+$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.pb)},
+$isEH:true},
+Xs:{
 "^":"a;",
 bu:function(a){return"Closure"},
-$isTp:true,
-$isEH:true},
+$isEH:true,
+gKu:function(){return this}},
 Bp:{
-"^":"Tp;",
-$isBp:true},
+"^":"Xs;"},
 v:{
-"^":"Bp;nw<,jm<,EP,RA>",
+"^":"Bp;nw,jm,cR,RA",
 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.EP===b.EP},
+return this.nw===b.nw&&this.jm===b.jm&&this.cR===b.cR},
 giO:function(a){var z,y
-z=this.EP
+z=this.cR
 if(z==null)y=H.eQ(this.nw)
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.jm))},
 $isv:true,
-static:{"^":"bf,P4",eZ:[function(a){return a.gnw()},"$1","PR",2,0,null,58,[]],yS:[function(a){return a.EP},"$1","xm",2,0,null,58,[]],oN:[function(){var z=$.bf
-if(z==null){z=H.B3("self")
-$.bf=z}return z},"$0","uT",0,0,null],B3:[function(a){var z,y,x,w,v
+static:{"^":"bf,U9",dS:function(a){return a.nw},HY:function(a){return a.cR},oN:function(){var z=$.bf
+if(z==null){z=H.E2("self")
+$.bf=z}return z},E2:function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
 y=Object.getOwnPropertyNames(z)
 y.fixed$length=init
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
-if(z[v]===a)return v}},"$1","ec",2,0,null,73,[]]}},
-qq:{
-"^":"a;Jy"},
-va:{
-"^":"a;Jy"},
-GT:{
-"^":"a;oc>"},
+if(z[v]===a)return v}}}},
 Pe:{
-"^":"Ge;G1>",
+"^":"XS;G1>",
 bu:function(a){return this.G1},
-$isGe:true,
+$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))}}},
-Eq:{
-"^":"Ge;G1>",
+tc:{
+"^":"XS;G1>",
 bu:function(a){return"RuntimeError: "+H.d(this.G1)},
-static:{Ef:function(a){return new H.Eq(a)}}},
-q1:{
+static:{Ef:function(a){return new H.tc(a)}}},
+lbp:{
 "^":"a;"},
-tD:{
-"^":"q1;dw,Iq,is,p6",
+GN:{
+"^":"lbp;dw,Iq,is,p6",
 BD:function(a){var z=this.rP(a)
-return z==null?!1:H.Ly(z,this.za())},
+return z==null?!1:H.J4(z,this.za())},
 rP:function(a){var z=J.x(a)
 return"$signature" in z?z.$signature():null},
 za:function(){var z,y,x,w,v,u,t
@@ -2015,9 +1908,9 @@
 if(!!x.$isnr)z.void=true
 else if(!x.$ishJ)z.ret=y.za()
 y=this.Iq
-if(y!=null&&y.length!==0)z.args=H.Dz(y)
+if(y!=null&&y.length!==0)z.args=H.P4(y)
 y=this.is
-if(y!=null&&y.length!==0)z.opt=H.Dz(y)
+if(y!=null&&y.length!==0)z.opt=H.P4(y)
 y=this.p6
 if(y!=null){w={}
 v=H.kU(y)
@@ -2038,26 +1931,26 @@
 for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
 if(w)x+=", "
 x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},
-static:{"^":"Jl",Dz:[function(a){var z,y,x
+static:{"^":"UA",P4:function(a){var z,y,x
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"$1","At",2,0,null,76,[]]}},
+return z}}},
 hJ:{
-"^":"q1;",
+"^":"lbp;",
 bu:function(a){return"dynamic"},
 za:function(){return},
 $ishJ:true},
 tu:{
-"^":"q1;oc>",
+"^":"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}},
-fw:{
-"^":"q1;oc>,re<,Et",
+Tu:{
+"^":"lbp;oc>,re<,Et",
 za:function(){var z,y
 z=this.Et
 if(z!=null)return z
@@ -2068,70 +1961,60 @@
 for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
 return y},
-bu:function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"}},
-oQ:{
-"^":"Ge;K9",
-bu:function(a){return"Unsupported operation: "+this.K9},
-$ismp:true,
-$isGe:true,
-static:{WE:function(a){return new H.oQ(a)}}},
+bu:function(a){return H.d(this.oc)+"<"+J.Dn(this.re,", ")+">"}},
 cu:{
-"^":"a;LU<,ke",
-bu:function(a){var z,y,x
+"^":"a;LU,ke",
+bu:function(a){var z,y
 z=this.ke
 if(z!=null)return z
-y=this.LU
-x=init.mangledGlobalNames[y]
-y=x==null?y:x
+y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
 this.ke=y
 return y},
 giO:function(a){return J.v1(this.LU)},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},
+return!!J.x(b).$iscu&&J.xC(this.LU,b.LU)},
 $iscu:true,
 $isuq:true},
-QT:{
-"^":"a;XP<,oc>,kU>"},
 dC:{
-"^":"Tp:116;a",
-$1:[function(a){return this.a(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Xs:10;a",
+$1:function(a){return this.a(a)},
 $isEH:true},
 wN:{
-"^":"Tp:303;b",
-$2:[function(a,b){return this.b(a,b)},"$2",null,4,0,null,99,[],102,[],"call"],
+"^":"Xs:54;b",
+$2:function(a,b){return this.b(a,b)},
 $isEH:true},
 VX:{
-"^":"Tp:32;c",
-$1:[function(a){return this.c(a)},"$1",null,2,0,null,102,[],"call"],
+"^":"Xs:2;c",
+$1:function(a){return this.c(a)},
 $isEH:true},
 VR:{
-"^":"a;Ej,Ii,Ua",
-gl9:function(){var z=this.Ii
+"^":"a;zO,Ej,BT,xJ",
+gF4:function(){var z=this.BT
 if(z!=null)return z
 z=this.Ej
-z=H.v4(z.source,z.multiline,!z.ignoreCase,!0)
-this.Ii=z
+z=H.ol(this.zO,z.multiline,!z.ignoreCase,!0)
+this.BT=z
 return z},
-gAT:function(){var z=this.Ua
+gAT:function(){var z=this.xJ
 if(z!=null)return z
 z=this.Ej
-z=H.v4(z.source+"|()",z.multiline,!z.ignoreCase,!0)
-this.Ua=z
+z=H.ol(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
+this.xJ=z
 return z},
 ej:function(a){var z
 if(typeof a!=="string")H.vh(P.u(a))
 z=this.Ej.exec(a)
 if(z==null)return
-return H.yx(this,z)},
+return H.Mr(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.gl9()
+z=this.gF4()
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
-return H.yx(this,y)},
+return H.Mr(this,y)},
 Bh:function(a,b){var z,y,x,w
 z=this.gAT()
 z.lastIndex=b
@@ -2142,7 +2025,7 @@
 if(w<0)return H.e(y,w)
 if(y[w]!=null)return
 C.Nm.sB(y,w)
-return H.yx(this,y)},
+return H.Mr(this,y)},
 wL:function(a,b,c){var z
 if(c>=0){z=J.q8(b)
 if(typeof z!=="number")return H.s(z)
@@ -2151,32 +2034,32 @@
 return this.Bh(b,c)},
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
-$isSP:true,
-static:{v4:[function(a,b,c,d){var z,y,x,w,v
+$iswL:true,
+static:{ol:function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
 x=d?"g":""
 w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"$4","HU",8,0,null,106,[],107,[],108,[],109,[]]}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},
 AX:{
 "^":"a;zO,QK",
 t:function(a,b){var z=this.QK
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-VO:function(a,b){},
+Ko:function(a,b){},
 $isOd:true,
-static:{yx:function(a,b){var z=new H.AX(a,b)
-z.VO(a,b)
+static:{Mr:function(a,b){var z=new H.AX(a,b)
+z.Ko(a,b)
 return z}}},
 KW:{
-"^":"mW;Gf,rv",
-gA:function(a){return new H.Pb(this.Gf,this.rv,null)},
+"^":"mW;rN,rv",
+gA:function(a){return new H.Pb(this.rN,this.rv,null)},
 $asmW:function(){return[P.Od]},
-$asQV:function(){return[P.Od]}},
+$ascX:function(){return[P.Od]}},
 Pb:{
-"^":"a;VV,rv,Wh",
+"^":"a;xz,rv,Wh",
 gl:function(){return this.Wh},
 G:function(){var z,y,x
 if(this.rv==null)return!1
@@ -2188,94 +2071,88 @@
 if(typeof z!=="number")return H.s(z)
 x=y+z
 if(this.Wh.QK.index===x)++x}else x=0
-z=this.VV.yk(this.rv,x)
+z=this.xz.yk(this.rv,x)
 this.Wh=z
 if(z==null){this.rv=null
 return!1}return!0}},
-tQ:{
+Vo:{
 "^":"a;M,J9,zO",
-t:function(a,b){if(!J.de(b,0))H.vh(P.N(b))
+t:function(a,b){if(!J.xC(b,0))H.vh(P.N(b))
 return this.zO},
 $isOd:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
 "^":"",
 hV:{
-"^":["LP;fi%-304,dB%-85,KW%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gO9:[function(a){return a.fi},null,null,1,0,307,"busy",308,309],
-sO9:[function(a,b){a.fi=this.ct(a,C.S4,a.fi,b)},null,null,3,0,310,30,[],"busy",308],
-gFR:[function(a){return a.dB},null,null,1,0,115,"callback",308,311],
+"^":"LP;IF,Qw,cw,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gv8:function(a){return a.IF},
+sv8: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)},null,null,3,0,116,30,[],"callback",308],
-gph:[function(a){return a.KW},null,null,1,0,312,"label",308,311],
-sph:[function(a,b){a.KW=this.ct(a,C.y2,a.KW,b)},null,null,3,0,32,30,[],"label",308],
-pp:[function(a,b,c,d){var z=a.fi
+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)},
+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,313,118,[],199,[],289,[],"doAction"],
-"@":function(){return[C.F9]},
-static:{zy:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.fi=!1
-a.dB=null
-a.KW="action"
-a.SO=z
-a.B7=y
-a.X0=w
-C.Uy.ZL(a)
-C.Uy.oX(a)
-return a},null,null,0,0,115,"new ActionLinkElement$created"]}},
-"+ActionLinkElement":[314],
+if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
+this.LY(a,null).wM(new X.jE(a))}},"$3","gNa",6,0,55,24,25,56],
+static:{zy:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.IF=!1
+a.Qw=null
+a.cw="action"
+a.on=z
+a.BA=y
+a.LL=w
+C.Gx.ZL(a)
+C.Gx.XI(a)
+return a}}},
 LP:{
-"^":"xc+Pi;",
+"^":"ir+Pi;",
 $isd3:true},
 jE:{
-"^":"Tp:115;a-85",
-$0:[function(){var z,y
-z=this.a
-y=J.RE(z)
-y.sfi(z,y.ct(z,C.S4,y.gfi(z),!1))},"$0",null,0,0,115,"call"],
-$isEH:true},
-"+ jE":[315]}],["app","package:observatory/app.dart",,G,{
+"^":"Xs:42;a",
+$0:[function(){var z=this.a
+z.IF=J.Q5(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
+$isEH:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
 m7:[function(a){var z
-N.Jx("").To("Google Charts API loaded")
-z=J.UQ(J.UQ($.cM(),"google"),"visualization")
-$.NR=z
-return z},"$1","vN",2,0,116,117,[]],
-G0:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","ez",4,0,null,118,[],119,[]],
-ap:[function(a,b){var z
+N.QM("").To("Google Charts API loaded")
+z=J.UQ(J.UQ($.ca(),"google"),"visualization")
+$.BY=z
+return z},"$1","vN",2,0,10,11],
+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)},"$2","Bn",4,0,null,30,[],120,[]],
-av:[function(a){var z,y,x
+if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
+DD:[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.ap(y,3)
-for(;z=J.Wx(a),z.D(a,1000);){x=G.ap(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","Vj",2,0,121,122,[]],
-P0:[function(a){var z,y,x,w
-if(a==null)return"-"
-z=J.LL(J.vX(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","xo",2,0,12],
+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.jn.Y(z,3600000)
 x=C.jn.cU(z,60000)
 z=C.jn.Y(z,60000)
 w=C.jn.cU(z,1000)
 z=C.jn.Y(z,1000)
-if(y>0)return G.ap(y,2)+":"+G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)
-else return G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)},"$1","DQ",2,0,null,123,[]],
+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)},
 Xz:[function(a){var z=J.Wx(a)
 if(z.C(a,1024))return H.d(a)+"B"
 else if(z.C(a,1048576))return""+C.CD.yu(C.CD.UD(z.V(a,1024)))+"KB"
 else if(z.C(a,1073741824))return""+C.CD.yu(C.CD.UD(z.V(a,1048576)))+"MB"
 else if(z.C(a,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(a,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","AF",2,0,121,124,[]],
-mG:[function(a){var z,y,x,w
+else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","Gt",2,0,12,13],
+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)
@@ -2285,442 +2162,1805 @@
 P.p9("")
 if(y!==0)return""+y+"h "+x+"m "+w+"s"
 if(x!==0)return""+x+"m "+w+"s"
-return""+w+"s"},"$1","N2",2,0,null,123,[]],
+return""+w+"s"},
 mL:{
-"^":["Pi;Z6<-316,zf>-317,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,318,"isolate",308,309],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,319,30,[],"isolate",308],
-gvJ:[function(a){return this.AJ},null,null,1,0,320,"response",308,309],
-svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,321,30,[],"response",308],
-gKw:[function(){return this.fz},null,null,1,0,312,"args",308,309],
-sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,32,30,[],"args",308],
+"^":"Pi;Z6,wv>,Eb,AJ,fz,AP,fn",
+god:function(a){return this.Eb},
+sod:function(a,b){this.Eb=F.Wi(this,C.rB,this.Eb,b)},
+gbA:function(a){return this.AJ},
+sbA:function(a,b){this.AJ=F.Wi(this,C.F3,this.AJ,b)},
 Da:function(){var z,y
 z=this.Z6
-z.sec(this)
+z.ec=this
 z.kI()
-z=this.zf
-y=z.gG2()
+z=this.wv
+y=z.G2
 H.VM(new P.Ik(y),[H.Kp(y,0)]).yI(this.gbf())
-z=z.gLi()
+z=z.Li
 H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
-kj:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gbf",2,0,322,171,[]],
-t1:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gXa",2,0,323,324,[]],
+kj:[function(a){this.AJ=F.Wi(this,C.F3,this.AJ,a)
+window.location.hash=""},"$1","gbf",2,0,57,21],
+t1:[function(a){this.AJ=F.Wi(this,C.F3,this.AJ,a)
+window.location.hash=""},"$1","gXa",2,0,58,59],
 US:function(){this.Da()},
 hq:function(){this.Da()}},
-ig:{
-"^":"a;Yb<",
+Kf:{
+"^":"a;Yb",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
-gzU:function(a){return this.Yb.nQ("getNumberOfRows")},
-Gl:function(a,b){this.Yb.V7("addColumn",[a,b])},
-lb:function(){var z=this.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
-aJ:function(a,b){var z=[]
+gWT:function(a){return this.Yb.nQ("getNumberOfRows")},
+B7:function(){var z=this.Yb
+z.K9("removeRows",[0,z.nQ("getNumberOfRows")])},
+Id:function(a,b){var z=[]
 C.Nm.FV(z,J.kl(b,P.En()))
-this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])}},
+this.Yb.K9("addRow",[H.VM(new P.Tz(z),[null])])}},
 qu:{
 "^":"a;vR,bG",
 W2:function(a){var z=P.jT(this.bG)
-this.vR.V7("draw",[a.gYb(),z])}},
+this.vR.K9("draw",[a.Yb,z])}},
 dZ:{
-"^":"Pi;ec?,JL,AP,fn",
-gjW:[function(){return this.JL},null,null,1,0,312,"currentHash",308,309],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",308],
-kI:function(){var z=C.PP.aM(window)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
+"^":"Pi;ec,JL,AP,fn",
+kI:function(){var z=H.VM(new W.RO(window,C.Bn.Ph,!1),[null])
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(new G.OH(this)),z.Sg),[H.Kp(z,0)]).Zz()
 if(window.location.hash==="")window.location.hash="#/vm"
 else this.df()},
-Mp:function(){window.location.hash=""},
 df:function(){var z,y,x
 z=window.location.hash
-z=F.Wi(this,C.h1,this.JL,z)
+z=F.Wi(this,C.M8,this.JL,z)
 this.JL=z
 if(!J.co(z,"#/"))return
 y=J.ZZ(this.JL,2).split("#")
 z=y.length
 if(0>=z)return H.e(y,0)
 x=z>1?y[1]:""
-if(z>2)N.Jx("").j2("Found more than 2 #-characters in "+H.d(this.JL))
-this.ec.zf.cv(J.ZZ(this.JL,2)).ml(new G.GH(this,x))},
-static:{"^":"K3D"}},
-Qe:{
-"^":"Tp:116;a",
-$1:[function(a){this.a.df()},"$1",null,2,0,null,325,[],"call"],
+if(z>2)N.QM("").j2("Found more than 2 #-characters in "+H.d(this.JL))
+this.ec.wv.cv(J.ZZ(this.JL,2)).ml(new G.wX(this,x))},
+static:{"^":"xp"}},
+OH:{
+"^":"Xs:10;a",
+$1:[function(a){this.a.df()},"$1",null,2,0,null,60,"call"],
 $isEH:true},
-GH:{
-"^":"Tp:116;a,b",
+wX:{
+"^":"Xs:10;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=z.ec
-y.AJ=F.Wi(y,C.mE,y.AJ,a)
+y.AJ=F.Wi(y,C.F3,y.AJ,a)
 z=z.ec
-z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,101,[],"call"],
+z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,61,"call"],
 $isEH:true},
 Y2:{
-"^":["Pi;eT>,yt<-326,wd>-327,oH<-328",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
-gyX:[function(a){return this.R7},null,null,1,0,312,"expander",308,309],
-Qx:function(a){return this.gyX(this).$0()},
-syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,32,30,[],"expander",308],
-grm:[function(){return this.aZ},null,null,1,0,312,"expanderStyle",308,309],
-srm:[function(a){this.aZ=F.Wi(this,C.Jt,this.aZ,a)},null,null,3,0,32,30,[],"expanderStyle",308],
-goE:function(a){return this.cp},
-soE:function(a,b){var z=this.cp
-this.cp=b
-if(z!==b){z=this.R7
-if(b){this.R7=F.Wi(this,C.Of,z,"\u21b3")
-this.C4(0)}else{this.R7=F.Wi(this,C.Of,z,"\u2192")
-this.o8()}}},
-r8:function(){this.soE(0,!this.cp)
-return this.cp},
-k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Jt,this.aZ,"visibility:hidden;")},
+"^":"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
+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.cO()}}},
+r8:function(){this.soE(0,this.yq!==!0)
+return this.yq},
+k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
 $isY2:true},
 XN:{
-"^":["Pi;zU>-327,AP,fn",function(){return[C.J19]},null,null],
-rT:function(a){var z,y
-z=this.zU
-y=J.w1(z)
-y.V1(z)
-a.C4(0)
-y.FV(z,a.wd)},
-qU:function(a){var z,y,x
-z=this.zU
-y=J.U6(z)
-x=y.t(z,a)
-if(x.r8())y.oF(z,y.u8(z,x)+1,J.uw(x))
-else this.PP(x)},
-PP:function(a){var z,y,x,w,v
+"^":"Pi;WT>,AP,fn",
+FS:function(a){var z,y,x,w,v
 z=J.RE(a)
-y=J.q8(z.gwd(a))
-if(J.de(y,0))return
-if(typeof y!=="number")return H.s(y)
-x=0
-for(;x<y;++x)if(J.YV(J.UQ(z.gwd(a),x))===!0)this.PP(J.UQ(z.gwd(a),x))
+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))
 z.soE(a,!1)
-z=this.zU
+z=this.WT
 w=J.U6(z)
 v=w.u8(z,a)+1
 w.UZ(z,v,v+y)}},
-Kt:{
+YA:{
 "^":"a;ph>,xy<",
-static:{r1:[function(a){return a!=null?J.AG(a):"<null>"},"$1","My",2,0,125,122,[]]}},
+static:{cR:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Tp",2,0,14]}},
 Ni:{
 "^":"a;UQ>",
 $isNi:true},
 Vz:{
-"^":"Pi;oH<,zU>,tW,pT,jV,AP,fn",
+"^":"Pi;oH<,WT>,tW,pT,jV,AP,fn",
 sxp:function(a){this.pT=a
 F.Wi(this,C.JB,0,1)},
 gxp:function(){return this.pT},
-np:function(a){H.rd(this.tW,new G.Nu(this))
-F.Wi(this,C.AH,0,1)},
-gIN:[function(){return this.tW},null,null,1,0,329,"sortedRows",309],
-lb:function(){C.Nm.sB(this.zU,0)
+Jd:function(a){H.rd(this.tW,new G.NM(this))
+F.Wi(this,C.DW,0,1)},
+gGD:function(){return this.tW},
+B7:function(){C.Nm.sB(this.WT,0)
 C.Nm.sB(this.tW,0)},
-aJ:function(a,b){var z=this.zU
+Id:function(a,b){var z=this.WT
 this.tW.push(z.length)
 z.push(b)
-F.Wi(this,C.AH,0,1)},
+F.Wi(this,C.DW,0,1)},
 tM:[function(a,b){var z,y
-z=this.zU
+z=this.WT
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-y=J.UQ(J.U8(z[a]),b)
+y=J.UQ(J.U8o(z[a]),b)
 z=this.oH
-if(b>>>0!==b||b>=9)return H.e(z,b)
-return z[b].gxy().$1(y)},"$2","gls",4,0,330,331,[],332,[],"getFormattedValue",308],
+if(b>>>0!==b||b>=z.length)return H.e(z,b)
+return z[b].gxy().$1(y)},"$2","gwy",4,0,62,63,64],
 Qs:[function(a){var z
-if(!J.de(a,this.pT)){z=this.oH
-if(a>>>0!==a||a>=9)return H.e(z,a)
-return J.WB(J.Kz(z[a]),"\u2003")}z=this.oH
-if(a>>>0!==a||a>=9)return H.e(z,a)
-z=J.Kz(z[a])
-return J.WB(z,this.jV?"\u25bc":"\u25b2")},"$1","gpo",2,0,121,332,[],"getColumnLabel",308],
-TK:[function(a,b){var z=this.zU
+if(!J.xC(a,this.pT)){z=this.oH
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8(z[a]),b)},"$2","gyY",4,0,333,331,[],332,[],"getValue",308]},
-Nu:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z,y,x,w
+return J.ew(J.Q4(z[a]),"\u2003")}z=this.oH
+if(a>>>0!==a||a>=z.length)return H.e(z,a)
+z=J.Q4(z[a])
+return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,12,64],
+TK:[function(a,b){var z=this.WT
+if(a>>>0!==a||a>=z.length)return H.e(z,a)
+return J.UQ(J.U8o(z[a]),b)},"$2","gyY",4,0,65,63,64]},
+NM:{
+"^":"Xs:51;a",
+$2:function(a,b){var z,y,x,w
 z=this.a
-y=z.zU
+y=z.WT
 if(a>>>0!==a||a>=y.length)return H.e(y,a)
-x=J.UQ(J.U8(y[a]),z.pT)
+x=J.UQ(J.U8o(y[a]),z.pT)
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
-w=J.UQ(J.U8(y[b]),z.pT)
+w=J.UQ(J.U8o(y[b]),z.pT)
 if(z.jV)return J.oE(w,x)
-else return J.oE(x,w)},"$2",null,4,0,null,334,[],335,[],"call"],
-$isEH:true}}],["app_bootstrap","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/index.html_bootstrap.dart",,E,{
+else return J.oE(x,w)},
+$isEH:true}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
 "^":"",
-De:[function(){$.x2=["package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/action_link.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
-$.uP=!1
-F.E2()},"$0","KU",0,0,126]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+Id:[function(){var z,y,x,w,v
+z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.ET,new E.ed(),C.WC,new E.wa(),C.S4,new E.Or(),C.Ro,new E.YL(),C.AV,new E.wf(),C.C0,new E.Oa(),C.eZ,new E.emv(),C.bk,new E.Lbd(),C.lH,new E.QAa(),C.kG,new E.CvS(),C.OI,new E.edy(),C.XA,new E.waE(),C.i4,new E.Ore(),C.qt,new E.YLa(),C.p1,new E.wfa(),C.bJ,new E.Oaa(),C.ox,new E.e0(),C.WZ,new E.e1(),C.i0,new E.e2(),C.iE,new E.e3(),C.f4,new E.e4(),C.VK,new E.e5(),C.aH,new E.e6(),C.PI,new E.e7(),C.aK,new E.e8(),C.GP,new E.e9(),C.Gr,new E.e10(),C.tP,new E.e11(),C.yh,new E.e12(),C.Zb,new E.e13(),C.u7,new E.e14(),C.ne,new E.e15(),C.B0,new E.e16(),C.r1,new E.e17(),C.mr,new E.e18(),C.Ek,new E.e19(),C.Pn,new E.e20(),C.YT,new E.e21(),C.WQ,new E.e22(),C.Gd,new E.e23(),C.FP,new E.e24(),C.kF,new E.e25(),C.UD,new E.e26(),C.Aq,new E.e27(),C.DS,new E.e28(),C.C9,new E.e29(),C.VF,new E.e30(),C.uU,new E.e31(),C.YJ,new E.e32(),C.eF,new E.e33(),C.oI,new E.e34(),C.ST,new E.e35(),C.QH,new E.e36(),C.qX,new E.e37(),C.rE,new E.e38(),C.nf,new E.e39(),C.pO,new E.e40(),C.EI,new E.e41(),C.JB,new E.e42(),C.Uq,new E.e43(),C.A8,new E.e44(),C.Ql,new E.e45(),C.SI,new E.e46(),C.zS,new E.e47(),C.ak,new E.e48(),C.eo,new E.e49(),C.Ge,new E.e50(),C.He,new E.e51(),C.wq,new E.e52(),C.k6,new E.e53(),C.oj,new E.e54(),C.PJ,new E.e55(),C.Ms,new E.e56(),C.q2,new E.e57(),C.d2,new E.e58(),C.kN,new E.e59(),C.fn,new E.e60(),C.eJ,new E.e61(),C.iG,new E.e62(),C.Py,new E.e63(),C.uu,new E.e64(),C.qs,new E.e65(),C.h7,new E.e66(),C.I9,new E.e67(),C.C1,new E.e68(),C.a0,new E.e69(),C.Yg,new E.e70(),C.bR,new E.e71(),C.ai,new E.e72(),C.ob,new E.e73(),C.Iv,new E.e74(),C.Wg,new E.e75(),C.tD,new E.e76(),C.nZ,new E.e77(),C.Of,new E.e78(),C.pY,new E.e79(),C.Lk,new E.e80(),C.dK,new E.e81(),C.xf,new E.e82(),C.rB,new E.e83(),C.bz,new E.e84(),C.Jx,new E.e85(),C.b5,new E.e86(),C.Lc,new E.e87(),C.hf,new E.e88(),C.uk,new E.e89(),C.kA,new E.e90(),C.Wn,new E.e91(),C.ur,new E.e92(),C.VN,new E.e93(),C.EV,new E.e94(),C.VI,new E.e95(),C.eh,new E.e96(),C.SA,new E.e97(),C.kV,new E.e98(),C.vp,new E.e99(),C.DY,new E.e100(),C.wT,new E.e101(),C.SR,new E.e102(),C.t6,new E.e103(),C.rP,new E.e104(),C.pX,new E.e105(),C.VD,new E.e106(),C.NN,new E.e107(),C.UX,new E.e108(),C.YS,new E.e109(),C.pu,new E.e110(),C.So,new E.e111(),C.EK,new E.e112(),C.td,new E.e113(),C.Gn,new E.e114(),C.zO,new E.e115(),C.eH,new E.e116(),C.ap,new E.e117(),C.Ys,new E.e118(),C.zm,new E.e119(),C.XM,new E.e120(),C.Ic,new E.e121(),C.yG,new E.e122(),C.tW,new E.e123(),C.CG,new E.e124(),C.vb,new E.e125(),C.UL,new E.e126(),C.QK,new E.e127(),C.AO,new E.e128(),C.xP,new E.e129(),C.Wm,new E.e130(),C.GR,new E.e131(),C.KX,new E.e132(),C.ja,new E.e133(),C.Dj,new E.e134(),C.Gi,new E.e135(),C.X2,new E.e136(),C.F3,new E.e137(),C.UY,new E.e138(),C.Aa,new E.e139(),C.nY,new E.e140(),C.HD,new E.e141(),C.iU,new E.e142(),C.eN,new E.e143(),C.ue,new E.e144(),C.nh,new E.e145(),C.L2,new E.e146(),C.Gs,new E.e147(),C.bE,new E.e148(),C.YD,new E.e149(),C.PX,new E.e150(),C.N8,new E.e151(),C.EA,new E.e152(),C.oW,new E.e153(),C.hd,new E.e154(),C.XY,new E.e155(),C.kz,new E.e156(),C.DW,new E.e157(),C.PM,new E.e158(),C.Nv,new E.e159(),C.TW,new E.e160(),C.xS,new E.e161(),C.mi,new E.e162(),C.zz,new E.e163(),C.hO,new E.e164(),C.ei,new E.e165(),C.HK,new E.e166(),C.je,new E.e167(),C.hN,new E.e168(),C.Q1,new E.e169(),C.ID,new E.e170(),C.z6,new E.e171(),C.bc,new E.e172(),C.kw,new E.e173(),C.ep,new E.e174(),C.J2,new E.e175(),C.zU,new E.e176(),C.bn,new E.e177(),C.mh,new E.e178(),C.Fh,new E.e179(),C.jh,new E.e180(),C.xw,new E.e181(),C.zn,new E.e182(),C.RJ,new E.e183(),C.Tc,new E.e184()],null,null)
+y=P.EF([C.aP,new E.e185(),C.cg,new E.e186(),C.j2,new E.e187(),C.S4,new E.e188(),C.AV,new E.e189(),C.bk,new E.e190(),C.lH,new E.e191(),C.kG,new E.e192(),C.XA,new E.e193(),C.i4,new E.e194(),C.bJ,new E.e195(),C.WZ,new E.e196(),C.VK,new E.e197(),C.aH,new E.e198(),C.PI,new E.e199(),C.Gr,new E.e200(),C.tP,new E.e201(),C.yh,new E.e202(),C.Zb,new E.e203(),C.ne,new E.e204(),C.B0,new E.e205(),C.mr,new E.e206(),C.YT,new E.e207(),C.WQ,new E.e208(),C.Gd,new E.e209(),C.QH,new E.e210(),C.rE,new E.e211(),C.nf,new E.e212(),C.Ql,new E.e213(),C.ak,new E.e214(),C.eo,new E.e215(),C.Ge,new E.e216(),C.He,new E.e217(),C.oj,new E.e218(),C.Ms,new E.e219(),C.d2,new E.e220(),C.fn,new E.e221(),C.Py,new E.e222(),C.uu,new E.e223(),C.qs,new E.e224(),C.a0,new E.e225(),C.rB,new E.e226(),C.Lc,new E.e227(),C.hf,new E.e228(),C.uk,new E.e229(),C.kA,new E.e230(),C.ur,new E.e231(),C.EV,new E.e232(),C.eh,new E.e233(),C.SA,new E.e234(),C.kV,new E.e235(),C.vp,new E.e236(),C.SR,new E.e237(),C.t6,new E.e238(),C.UX,new E.e239(),C.YS,new E.e240(),C.td,new E.e241(),C.zO,new E.e242(),C.Ys,new E.e243(),C.XM,new E.e244(),C.Ic,new E.e245(),C.tW,new E.e246(),C.vb,new E.e247(),C.QK,new E.e248(),C.AO,new E.e249(),C.xP,new E.e250(),C.GR,new E.e251(),C.KX,new E.e252(),C.ja,new E.e253(),C.Dj,new E.e254(),C.X2,new E.e255(),C.F3,new E.e256(),C.UY,new E.e257(),C.Aa,new E.e258(),C.nY,new E.e259(),C.HD,new E.e260(),C.iU,new E.e261(),C.eN,new E.e262(),C.Gs,new E.e263(),C.bE,new E.e264(),C.YD,new E.e265(),C.PX,new E.e266(),C.XY,new E.e267(),C.PM,new E.e268(),C.Nv,new E.e269(),C.TW,new E.e270(),C.mi,new E.e271(),C.zz,new E.e272(),C.z6,new E.e273(),C.kw,new E.e274(),C.zU,new E.e275(),C.RJ,new E.e276()],null,null)
+x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.xE,C.Mt,C.oT,C.il,C.jR,C.Mt,C.bh,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.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.k5,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Wh,C.Mt,C.tU,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.BV,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.TU,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.Zj,C.Mt,C.ms,C.Mt,C.FA,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.hG,C.Vh,C.Mt,C.Zt,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.hG,C.Mt,C.l4,C.al,C.il],null,null)
+w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.h1,C.hf,C.n6],null,null),C.yS,P.EF([C.UX,C.X4],null,null),C.OG,C.CM,C.xE,P.EF([C.XA,C.CO],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.h9],null,null),C.bh,P.EF([C.PI,C.lg,C.Ms,C.Gl],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.h1,C.B0,C.Rf,C.r1,C.nP,C.mr,C.DC],null,null),C.KO,P.EF([C.yh,C.GE],null,null),C.wk,P.EF([C.AV,C.ti,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.h1,C.YT,C.V0,C.hf,C.n6,C.UY,C.rT],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.NA],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.VQ,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.Up,C.pO,C.au,C.Lc,C.Tt,C.AO,C.UE],null,null),C.iD,P.EF([C.QH,C.kt,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.dh,C.vb,C.eq,C.UL,C.mM],null,null),C.Wz,C.CM,C.k5,P.EF([C.fn,C.cV,C.XM,C.hL],null,null),C.qF,P.EF([C.vp,C.K9],null,null),C.nX,C.CM,C.Wh,P.EF([C.oj,C.dF],null,null),C.tU,P.EF([C.qs,C.ly],null,null),C.ce,P.EF([C.aH,C.hR,C.He,C.oV,C.vb,C.eq,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.bw,C.zz,C.lS],null,null),C.UJ,C.CM,C.BV,P.EF([C.bJ,C.iF,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.ZQ],null,null),C.j4,P.EF([C.rB,C.ZQ],null,null),C.TU,P.EF([C.rB,C.ZQ],null,null),C.CT,P.EF([C.rB,C.ZQ],null,null),C.mq,P.EF([C.rB,C.ZQ],null,null),C.Tq,P.EF([C.SR,C.HL,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.Ei],null,null),C.Ey,P.EF([C.XA,C.CO,C.uk,C.Mq],null,null),C.km,P.EF([C.rB,C.ZQ,C.bz,C.Bk,C.uk,C.Mq],null,null),C.vw,P.EF([C.uk,C.Mq,C.EV,C.Ei],null,null),C.Zj,P.EF([C.Ys,C.hK],null,null),C.ms,P.EF([C.cg,C.pU,C.uk,C.Mq,C.kV,C.Os],null,null),C.FA,P.EF([C.cg,C.pU,C.kV,C.Os],null,null),C.JW,P.EF([C.aP,C.xO,C.AV,C.h1,C.hf,C.n6],null,null),C.Mf,P.EF([C.uk,C.Mq],null,null),C.Dl,P.EF([C.j2,C.zJ,C.VK,C.m8],null,null),C.l4,C.CM,C.Vh,P.EF([C.j2,C.zJ],null,null),C.Zt,P.EF([C.WZ,C.Um,C.i0,C.GH,C.Gr,C.j3,C.SA,C.KI,C.tW,C.HM,C.CG,C.Ml,C.PX,C.Cj,C.N8,C.qE],null,null),C.Sb,P.EF([C.tW,C.HM,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.Cj,C.XY,C.ec,C.kz,C.db],null,null),C.wH,P.EF([C.yh,C.xQ],null,null),C.pK,P.EF([C.ne,C.l6],null,null),C.il,P.EF([C.uu,C.x3,C.xP,C.hI,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.No,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Nu,C.lH,C.A5,C.zU,C.IK],null,null),C.NR,P.EF([C.rE,C.Kv],null,null),C.vu,P.EF([C.kw,C.W9],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.yc,C.RJ,C.Ce],null,null)],null,null)
+v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.ET,"assertsEnabled",C.WC,"bpt",C.S4,"busy",C.Ro,"buttonClick",C.AV,"callback",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.kG,"classTable",C.OI,"classes",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.bJ,"counters",C.ox,"countersChanged",C.WZ,"coverage",C.i0,"coverageChanged",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.PI,"displayValue",C.aK,"doAction",C.GP,"element",C.Gr,"endPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.WQ,"field",C.Gd,"firstTokenPos",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.Uq,"getFormattedValue",C.A8,"getValue",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.ak,"hasParent",C.eo,"hashLink",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.wq,"hitStyle",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Ms,"iconClass",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.uu,"internal",C.qs,"io",C.h7,"ioEnabled",C.I9,"isBool",C.C1,"isComment",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.pY,"isOptimized",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.kA,"lastTokenPos",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.kV,"link",C.vp,"list",C.DY,"loading",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.So,"newHeapCapacity",C.EK,"newHeapUsed",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.eH,"oldHeapCapacity",C.ap,"oldHeapUsed",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.tW,"pos",C.CG,"posChanged",C.vb,"profile",C.UL,"profileChanged",C.QK,"qualified",C.AO,"qualifiedName",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.Gi,"relativeHashLink",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",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.XY,"showCoverage",C.kz,"showCoverageChanged",C.DW,"sortedRows",C.PM,"status",C.Nv,"subclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.hN,"tipTime",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.jh,"v",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName"],null,null),!1))
+$.j8=new O.LT(z,y,C.CM)
+$.Yv=new O.bY(x,w,!1)
+$.qe=v
+A.X1([new E.e277(),new E.e278(),new E.e279(),new E.e280(),new E.e281(),new E.e282(),new E.e283(),new E.e284(),new E.e285(),new E.e286(),new E.e287(),new E.e288(),new E.e289(),new E.e290(),new E.e291(),new E.e292(),new E.e293(),new E.e294(),new E.e295(),new E.e296(),new E.e297(),new E.e298(),new E.e299(),new E.e300(),new E.e301(),new E.e302(),new E.e303(),new E.e304(),new E.e305(),new E.e306(),new E.e307(),new E.e308(),new E.e309(),new E.e310(),new E.e311(),new E.e312(),new E.e313(),new E.e314(),new E.e315(),new E.e316(),new E.e317(),new E.e318(),new E.e319(),new E.e320(),new E.e321(),new E.e322(),new E.e323(),new E.e324(),new E.e325(),new E.e326(),new E.e327(),new E.e328(),new E.e329(),new E.e330(),new E.e331(),new E.e332(),new E.e333(),F.wV()],!0)},"$0","Tb",0,0,15],
+em:{
+"^":"Xs:10;",
+$1:function(a){return J.Jp(a)},
+$isEH:true},
+Lb:{
+"^":"Xs:10;",
+$1:function(a){return a.gYu()},
+$isEH:true},
+QA:{
+"^":"Xs:10;",
+$1:function(a){return J.Ln(a)},
+$isEH:true},
+Cv:{
+"^":"Xs:10;",
+$1:function(a){return J.un(a)},
+$isEH:true},
+ed:{
+"^":"Xs:10;",
+$1:function(a){return a.gA3()},
+$isEH:true},
+wa:{
+"^":"Xs:10;",
+$1:function(a){return a.gqr()},
+$isEH:true},
+Or:{
+"^":"Xs:10;",
+$1:function(a){return J.nG(a)},
+$isEH:true},
+YL:{
+"^":"Xs:10;",
+$1:function(a){return J.aA(a)},
+$isEH:true},
+wf:{
+"^":"Xs:10;",
+$1:function(a){return J.WT(a)},
+$isEH:true},
+Oa:{
+"^":"Xs:10;",
+$1:function(a){return J.Wp(a)},
+$isEH:true},
+emv:{
+"^":"Xs:10;",
+$1:function(a){return J.n9(a)},
+$isEH:true},
+Lbd:{
+"^":"Xs:10;",
+$1:function(a){return J.K0(a)},
+$isEH:true},
+QAa:{
+"^":"Xs:10;",
+$1:function(a){return J.hn(a)},
+$isEH:true},
+CvS:{
+"^":"Xs:10;",
+$1:function(a){return J.yz(a)},
+$isEH:true},
+edy:{
+"^":"Xs:10;",
+$1:function(a){return J.pP(a)},
+$isEH:true},
+waE:{
+"^":"Xs:10;",
+$1:function(a){return J.E3(a)},
+$isEH:true},
+Ore:{
+"^":"Xs:10;",
+$1:function(a){return J.on(a)},
+$isEH:true},
+YLa:{
+"^":"Xs:10;",
+$1:function(a){return J.SM(a)},
+$isEH:true},
+wfa:{
+"^":"Xs:10;",
+$1:function(a){return a.goH()},
+$isEH:true},
+Oaa:{
+"^":"Xs:10;",
+$1:function(a){return J.zD(a)},
+$isEH:true},
+e0:{
+"^":"Xs:10;",
+$1:function(a){return J.Ok(a)},
+$isEH:true},
+e1:{
+"^":"Xs:10;",
+$1:function(a){return J.wd(a)},
+$isEH:true},
+e2:{
+"^":"Xs:10;",
+$1:function(a){return J.RC(a)},
+$isEH:true},
+e3:{
+"^":"Xs:10;",
+$1:function(a){return a.gSL()},
+$isEH:true},
+e4:{
+"^":"Xs:10;",
+$1:function(a){return a.guH()},
+$isEH:true},
+e5:{
+"^":"Xs:10;",
+$1:function(a){return J.mP(a)},
+$isEH:true},
+e6:{
+"^":"Xs:10;",
+$1:function(a){return J.BT(a)},
+$isEH:true},
+e7:{
+"^":"Xs:10;",
+$1:function(a){return J.yA(a)},
+$isEH:true},
+e8:{
+"^":"Xs:10;",
+$1:function(a){return J.vi(a)},
+$isEH:true},
+e9:{
+"^":"Xs:10;",
+$1:function(a){return a.gFL()},
+$isEH:true},
+e10:{
+"^":"Xs:10;",
+$1:function(a){return J.rw(a)},
+$isEH:true},
+e11:{
+"^":"Xs:10;",
+$1:function(a){return a.gw2()},
+$isEH:true},
+e12:{
+"^":"Xs:10;",
+$1:function(a){return J.w8(a)},
+$isEH:true},
+e13:{
+"^":"Xs:10;",
+$1:function(a){return J.is(a)},
+$isEH:true},
+e14:{
+"^":"Xs:10;",
+$1:function(a){return J.yi(a)},
+$isEH:true},
+e15:{
+"^":"Xs:10;",
+$1:function(a){return J.Vl(a)},
+$isEH:true},
+e16:{
+"^":"Xs:10;",
+$1:function(a){return J.kE(a)},
+$isEH:true},
+e17:{
+"^":"Xs:10;",
+$1:function(a){return J.Ak(a)},
+$isEH:true},
+e18:{
+"^":"Xs:10;",
+$1:function(a){return J.Mz(a)},
+$isEH:true},
+e19:{
+"^":"Xs:10;",
+$1:function(a){return J.S9(a)},
+$isEH:true},
+e20:{
+"^":"Xs:10;",
+$1:function(a){return a.gty()},
+$isEH:true},
+e21:{
+"^":"Xs:10;",
+$1:function(a){return J.yn(a)},
+$isEH:true},
+e22:{
+"^":"Xs:10;",
+$1:function(a){return J.pm(a)},
+$isEH:true},
+e23:{
+"^":"Xs:10;",
+$1:function(a){return a.ghY()},
+$isEH:true},
+e24:{
+"^":"Xs:10;",
+$1:function(a){return J.WX(a)},
+$isEH:true},
+e25:{
+"^":"Xs:10;",
+$1:function(a){return J.JD(a)},
+$isEH:true},
+e26:{
+"^":"Xs:10;",
+$1:function(a){return a.gZd()},
+$isEH:true},
+e27:{
+"^":"Xs:10;",
+$1:function(a){return J.lT(a)},
+$isEH:true},
+e28:{
+"^":"Xs:10;",
+$1:function(a){return J.M4(a)},
+$isEH:true},
+e29:{
+"^":"Xs:10;",
+$1:function(a){return a.gkA()},
+$isEH:true},
+e30:{
+"^":"Xs:10;",
+$1:function(a){return a.gGK()},
+$isEH:true},
+e31:{
+"^":"Xs:10;",
+$1:function(a){return a.gan()},
+$isEH:true},
+e32:{
+"^":"Xs:10;",
+$1:function(a){return a.gcQ()},
+$isEH:true},
+e33:{
+"^":"Xs:10;",
+$1:function(a){return a.gS7()},
+$isEH:true},
+e34:{
+"^":"Xs:10;",
+$1:function(a){return a.gP3()},
+$isEH:true},
+e35:{
+"^":"Xs:10;",
+$1:function(a){return J.PY(a)},
+$isEH:true},
+e36:{
+"^":"Xs:10;",
+$1:function(a){return J.bu(a)},
+$isEH:true},
+e37:{
+"^":"Xs:10;",
+$1:function(a){return J.VL(a)},
+$isEH:true},
+e38:{
+"^":"Xs:10;",
+$1:function(a){return J.zN(a)},
+$isEH:true},
+e39:{
+"^":"Xs:10;",
+$1:function(a){return J.FI(a)},
+$isEH:true},
+e40:{
+"^":"Xs:10;",
+$1:function(a){return J.WY(a)},
+$isEH:true},
+e41:{
+"^":"Xs:10;",
+$1:function(a){return a.gmu()},
+$isEH:true},
+e42:{
+"^":"Xs:10;",
+$1:function(a){return a.gCO()},
+$isEH:true},
+e43:{
+"^":"Xs:10;",
+$1:function(a){return a.gwy()},
+$isEH:true},
+e44:{
+"^":"Xs:10;",
+$1:function(a){return a.gyY()},
+$isEH:true},
+e45:{
+"^":"Xs:10;",
+$1:function(a){return J.wO(a)},
+$isEH:true},
+e46:{
+"^":"Xs:10;",
+$1:function(a){return a.gGf()},
+$isEH:true},
+e47:{
+"^":"Xs:10;",
+$1:function(a){return a.gUa()},
+$isEH:true},
+e48:{
+"^":"Xs:10;",
+$1:function(a){return J.Mb(a)},
+$isEH:true},
+e49:{
+"^":"Xs:10;",
+$1:function(a){return a.gHP()},
+$isEH:true},
+e50:{
+"^":"Xs:10;",
+$1:function(a){return J.z3(a)},
+$isEH:true},
+e51:{
+"^":"Xs:10;",
+$1:function(a){return J.yZ(a)},
+$isEH:true},
+e52:{
+"^":"Xs:10;",
+$1:function(a){return J.Hr(a)},
+$isEH:true},
+e53:{
+"^":"Xs:10;",
+$1:function(a){return J.fA(a)},
+$isEH:true},
+e54:{
+"^":"Xs:10;",
+$1:function(a){return J.cd(a)},
+$isEH:true},
+e55:{
+"^":"Xs:10;",
+$1:function(a){return a.gL4()},
+$isEH:true},
+e56:{
+"^":"Xs:10;",
+$1:function(a){return J.pB(a)},
+$isEH:true},
+e57:{
+"^":"Xs:10;",
+$1:function(a){return a.gaj()},
+$isEH:true},
+e58:{
+"^":"Xs:10;",
+$1:function(a){return a.giq()},
+$isEH:true},
+e59:{
+"^":"Xs:10;",
+$1:function(a){return a.gBm()},
+$isEH:true},
+e60:{
+"^":"Xs:10;",
+$1:function(a){return J.xR(a)},
+$isEH:true},
+e61:{
+"^":"Xs:10;",
+$1:function(a){return a.gNI()},
+$isEH:true},
+e62:{
+"^":"Xs:10;",
+$1:function(a){return a.gva()},
+$isEH:true},
+e63:{
+"^":"Xs:10;",
+$1:function(a){return a.gKt()},
+$isEH:true},
+e64:{
+"^":"Xs:10;",
+$1:function(a){return J.ns(a)},
+$isEH:true},
+e65:{
+"^":"Xs:10;",
+$1:function(a){return J.Ew(a)},
+$isEH:true},
+e66:{
+"^":"Xs:10;",
+$1:function(a){return a.gwg()},
+$isEH:true},
+e67:{
+"^":"Xs:10;",
+$1:function(a){return J.Ja(a)},
+$isEH:true},
+e68:{
+"^":"Xs:10;",
+$1:function(a){return a.gUB()},
+$isEH:true},
+e69:{
+"^":"Xs:10;",
+$1:function(a){return J.To(a)},
+$isEH:true},
+e70:{
+"^":"Xs:10;",
+$1:function(a){return a.gkU()},
+$isEH:true},
+e71:{
+"^":"Xs:10;",
+$1:function(a){return J.wz(a)},
+$isEH:true},
+e72:{
+"^":"Xs:10;",
+$1:function(a){return J.FN(a)},
+$isEH:true},
+e73:{
+"^":"Xs:10;",
+$1:function(a){return J.ls(a)},
+$isEH:true},
+e74:{
+"^":"Xs:10;",
+$1:function(a){return J.yq(a)},
+$isEH:true},
+e75:{
+"^":"Xs:10;",
+$1:function(a){return J.SZ(a)},
+$isEH:true},
+e76:{
+"^":"Xs:10;",
+$1:function(a){return J.DL(a)},
+$isEH:true},
+e77:{
+"^":"Xs:10;",
+$1:function(a){return J.yx(a)},
+$isEH:true},
+e78:{
+"^":"Xs:10;",
+$1:function(a){return J.cU(a)},
+$isEH:true},
+e79:{
+"^":"Xs:10;",
+$1:function(a){return a.gYG()},
+$isEH:true},
+e80:{
+"^":"Xs:10;",
+$1:function(a){return J.UM(a)},
+$isEH:true},
+e81:{
+"^":"Xs:10;",
+$1:function(a){return J.ZN(a)},
+$isEH:true},
+e82:{
+"^":"Xs:10;",
+$1:function(a){return J.xa(a)},
+$isEH:true},
+e83:{
+"^":"Xs:10;",
+$1:function(a){return J.aT(a)},
+$isEH:true},
+e84:{
+"^":"Xs:10;",
+$1:function(a){return J.hb(a)},
+$isEH:true},
+e85:{
+"^":"Xs:10;",
+$1:function(a){return a.gi2()},
+$isEH:true},
+e86:{
+"^":"Xs:10;",
+$1:function(a){return a.gEB()},
+$isEH:true},
+e87:{
+"^":"Xs:10;",
+$1:function(a){return J.Iz(a)},
+$isEH:true},
+e88:{
+"^":"Xs:10;",
+$1:function(a){return J.Q4(a)},
+$isEH:true},
+e89:{
+"^":"Xs:10;",
+$1:function(a){return J.MQ(a)},
+$isEH:true},
+e90:{
+"^":"Xs:10;",
+$1:function(a){return a.gSK()},
+$isEH:true},
+e91:{
+"^":"Xs:10;",
+$1:function(a){return J.q8(a)},
+$isEH:true},
+e92:{
+"^":"Xs:10;",
+$1:function(a){return a.ghX()},
+$isEH:true},
+e93:{
+"^":"Xs:10;",
+$1:function(a){return a.gvU()},
+$isEH:true},
+e94:{
+"^":"Xs:10;",
+$1:function(a){return J.IJ(a)},
+$isEH:true},
+e95:{
+"^":"Xs:10;",
+$1:function(a){return a.gRd()},
+$isEH:true},
+e96:{
+"^":"Xs:10;",
+$1:function(a){return J.zY(a)},
+$isEH:true},
+e97:{
+"^":"Xs:10;",
+$1:function(a){return J.de(a)},
+$isEH:true},
+e98:{
+"^":"Xs:10;",
+$1:function(a){return J.Ds(a)},
+$isEH:true},
+e99:{
+"^":"Xs:10;",
+$1:function(a){return J.cO(a)},
+$isEH:true},
+e100:{
+"^":"Xs:10;",
+$1:function(a){return a.gn0()},
+$isEH:true},
+e101:{
+"^":"Xs:10;",
+$1:function(a){return a.geH()},
+$isEH:true},
+e102:{
+"^":"Xs:10;",
+$1:function(a){return J.Yf(a)},
+$isEH:true},
+e103:{
+"^":"Xs:10;",
+$1:function(a){return J.kv(a)},
+$isEH:true},
+e104:{
+"^":"Xs:10;",
+$1:function(a){return J.QD(a)},
+$isEH:true},
+e105:{
+"^":"Xs:10;",
+$1:function(a){return J.z2(a)},
+$isEH:true},
+e106:{
+"^":"Xs:10;",
+$1:function(a){return J.ZL(a)},
+$isEH:true},
+e107:{
+"^":"Xs:10;",
+$1:function(a){return J.ba(a)},
+$isEH:true},
+e108:{
+"^":"Xs:10;",
+$1:function(a){return J.Zv(a)},
+$isEH:true},
+e109:{
+"^":"Xs:10;",
+$1:function(a){return J.O6(a)},
+$isEH:true},
+e110:{
+"^":"Xs:10;",
+$1:function(a){return J.yK(a)},
+$isEH:true},
+e111:{
+"^":"Xs:10;",
+$1:function(a){return a.gxs()},
+$isEH:true},
+e112:{
+"^":"Xs:10;",
+$1:function(a){return a.gCi()},
+$isEH:true},
+e113:{
+"^":"Xs:10;",
+$1:function(a){return J.Jj(a)},
+$isEH:true},
+e114:{
+"^":"Xs:10;",
+$1:function(a){return J.t8(a)},
+$isEH:true},
+e115:{
+"^":"Xs:10;",
+$1:function(a){return a.gL1()},
+$isEH:true},
+e116:{
+"^":"Xs:10;",
+$1:function(a){return a.gQB()},
+$isEH:true},
+e117:{
+"^":"Xs:10;",
+$1:function(a){return a.guq()},
+$isEH:true},
+e118:{
+"^":"Xs:10;",
+$1:function(a){return J.EC(a)},
+$isEH:true},
+e119:{
+"^":"Xs:10;",
+$1:function(a){return J.JG(a)},
+$isEH:true},
+e120:{
+"^":"Xs:10;",
+$1:function(a){return J.AF(a)},
+$isEH:true},
+e121:{
+"^":"Xs:10;",
+$1:function(a){return J.LB(a)},
+$isEH:true},
+e122:{
+"^":"Xs:10;",
+$1:function(a){return J.Kl(a)},
+$isEH:true},
+e123:{
+"^":"Xs:10;",
+$1:function(a){return J.io(a)},
+$isEH:true},
+e124:{
+"^":"Xs:10;",
+$1:function(a){return J.Ff(a)},
+$isEH:true},
+e125:{
+"^":"Xs:10;",
+$1:function(a){return J.ks(a)},
+$isEH:true},
+e126:{
+"^":"Xs:10;",
+$1:function(a){return J.CN(a)},
+$isEH:true},
+e127:{
+"^":"Xs:10;",
+$1:function(a){return J.Pr(a)},
+$isEH:true},
+e128:{
+"^":"Xs:10;",
+$1:function(a){return J.Sz(a)},
+$isEH:true},
+e129:{
+"^":"Xs:10;",
+$1:function(a){return J.Gc(a)},
+$isEH:true},
+e130:{
+"^":"Xs:10;",
+$1:function(a){return J.Dd(a)},
+$isEH:true},
+e131:{
+"^":"Xs:10;",
+$1:function(a){return J.OP(a)},
+$isEH:true},
+e132:{
+"^":"Xs:10;",
+$1:function(a){return J.zv(a)},
+$isEH:true},
+e133:{
+"^":"Xs:10;",
+$1:function(a){return J.tF(a)},
+$isEH:true},
+e134:{
+"^":"Xs:10;",
+$1:function(a){return J.QX(a)},
+$isEH:true},
+e135:{
+"^":"Xs:10;",
+$1:function(a){return a.gw6()},
+$isEH:true},
+e136:{
+"^":"Xs:10;",
+$1:function(a){return J.iL(a)},
+$isEH:true},
+e137:{
+"^":"Xs:10;",
+$1:function(a){return J.jP(a)},
+$isEH:true},
+e138:{
+"^":"Xs:10;",
+$1:function(a){return J.uW(a)},
+$isEH:true},
+e139:{
+"^":"Xs:10;",
+$1:function(a){return J.W2(a)},
+$isEH:true},
+e140:{
+"^":"Xs:10;",
+$1:function(a){return J.UT(a)},
+$isEH:true},
+e141:{
+"^":"Xs:10;",
+$1:function(a){return J.jH(a)},
+$isEH:true},
+e142:{
+"^":"Xs:10;",
+$1:function(a){return J.jo(a)},
+$isEH:true},
+e143:{
+"^":"Xs:10;",
+$1:function(a){return a.gVc()},
+$isEH:true},
+e144:{
+"^":"Xs:10;",
+$1:function(a){return a.gpF()},
+$isEH:true},
+e145:{
+"^":"Xs:10;",
+$1:function(a){return J.oL(a)},
+$isEH:true},
+e146:{
+"^":"Xs:10;",
+$1:function(a){return a.gA6()},
+$isEH:true},
+e147:{
+"^":"Xs:10;",
+$1:function(a){return J.Ry(a)},
+$isEH:true},
+e148:{
+"^":"Xs:10;",
+$1:function(a){return J.UP(a)},
+$isEH:true},
+e149:{
+"^":"Xs:10;",
+$1:function(a){return J.fw(a)},
+$isEH:true},
+e150:{
+"^":"Xs:10;",
+$1:function(a){return J.zH(a)},
+$isEH:true},
+e151:{
+"^":"Xs:10;",
+$1:function(a){return J.Vi(a)},
+$isEH:true},
+e152:{
+"^":"Xs:10;",
+$1:function(a){return a.ghp()},
+$isEH:true},
+e153:{
+"^":"Xs:10;",
+$1:function(a){return J.P5(a)},
+$isEH:true},
+e154:{
+"^":"Xs:10;",
+$1:function(a){return a.gzS()},
+$isEH:true},
+e155:{
+"^":"Xs:10;",
+$1:function(a){return J.iY(a)},
+$isEH:true},
+e156:{
+"^":"Xs:10;",
+$1:function(a){return J.kS(a)},
+$isEH:true},
+e157:{
+"^":"Xs:10;",
+$1:function(a){return a.gGD()},
+$isEH:true},
+e158:{
+"^":"Xs:10;",
+$1:function(a){return J.Td(a)},
+$isEH:true},
+e159:{
+"^":"Xs:10;",
+$1:function(a){return a.gDo()},
+$isEH:true},
+e160:{
+"^":"Xs:10;",
+$1:function(a){return J.j1(a)},
+$isEH:true},
+e161:{
+"^":"Xs:10;",
+$1:function(a){return J.Aw(a)},
+$isEH:true},
+e162:{
+"^":"Xs:10;",
+$1:function(a){return J.dY(a)},
+$isEH:true},
+e163:{
+"^":"Xs:10;",
+$1:function(a){return J.OL(a)},
+$isEH:true},
+e164:{
+"^":"Xs:10;",
+$1:function(a){return a.gki()},
+$isEH:true},
+e165:{
+"^":"Xs:10;",
+$1:function(a){return a.gZn()},
+$isEH:true},
+e166:{
+"^":"Xs:10;",
+$1:function(a){return a.gvs()},
+$isEH:true},
+e167:{
+"^":"Xs:10;",
+$1:function(a){return a.gVh()},
+$isEH:true},
+e168:{
+"^":"Xs:10;",
+$1:function(a){return a.gZX()},
+$isEH:true},
+e169:{
+"^":"Xs:10;",
+$1:function(a){return J.SG(a)},
+$isEH:true},
+e170:{
+"^":"Xs:10;",
+$1:function(a){return J.eU(a)},
+$isEH:true},
+e171:{
+"^":"Xs:10;",
+$1:function(a){return a.gVF()},
+$isEH:true},
+e172:{
+"^":"Xs:10;",
+$1:function(a){return a.gkw()},
+$isEH:true},
+e173:{
+"^":"Xs:10;",
+$1:function(a){return J.K2(a)},
+$isEH:true},
+e174:{
+"^":"Xs:10;",
+$1:function(a){return J.uy(a)},
+$isEH:true},
+e175:{
+"^":"Xs:10;",
+$1:function(a){return a.gEy()},
+$isEH:true},
+e176:{
+"^":"Xs:10;",
+$1:function(a){return J.Kd(a)},
+$isEH:true},
+e177:{
+"^":"Xs:10;",
+$1:function(a){return J.Sl(a)},
+$isEH:true},
+e178:{
+"^":"Xs:10;",
+$1:function(a){return a.gJk()},
+$isEH:true},
+e179:{
+"^":"Xs:10;",
+$1:function(a){return J.Nl(a)},
+$isEH:true},
+e180:{
+"^":"Xs:10;",
+$1:function(a){return a.gFc()},
+$isEH:true},
+e181:{
+"^":"Xs:10;",
+$1:function(a){return a.gZ3()},
+$isEH:true},
+e182:{
+"^":"Xs:10;",
+$1:function(a){return a.gYe()},
+$isEH:true},
+e183:{
+"^":"Xs:10;",
+$1:function(a){return J.I2(a)},
+$isEH:true},
+e184:{
+"^":"Xs:10;",
+$1:function(a){return a.gzz()},
+$isEH:true},
+e185:{
+"^":"Xs:51;",
+$2:function(a,b){J.Ex(a,b)},
+$isEH:true},
+e186:{
+"^":"Xs:51;",
+$2:function(a,b){J.a8(a,b)},
+$isEH:true},
+e187:{
+"^":"Xs:51;",
+$2:function(a,b){J.oO(a,b)},
+$isEH:true},
+e188:{
+"^":"Xs:51;",
+$2:function(a,b){J.l7(a,b)},
+$isEH:true},
+e189:{
+"^":"Xs:51;",
+$2:function(a,b){J.kB(a,b)},
+$isEH:true},
+e190:{
+"^":"Xs:51;",
+$2:function(a,b){J.Ae(a,b)},
+$isEH:true},
+e191:{
+"^":"Xs:51;",
+$2:function(a,b){J.IX(a,b)},
+$isEH:true},
+e192:{
+"^":"Xs:51;",
+$2:function(a,b){J.WI(a,b)},
+$isEH:true},
+e193:{
+"^":"Xs:51;",
+$2:function(a,b){J.o0(a,b)},
+$isEH:true},
+e194:{
+"^":"Xs:51;",
+$2:function(a,b){J.fH(a,b)},
+$isEH:true},
+e195:{
+"^":"Xs:51;",
+$2:function(a,b){J.Fg(a,b)},
+$isEH:true},
+e196:{
+"^":"Xs:51;",
+$2:function(a,b){J.qA(a,b)},
+$isEH:true},
+e197:{
+"^":"Xs:51;",
+$2:function(a,b){J.LM(a,b)},
+$isEH:true},
+e198:{
+"^":"Xs:51;",
+$2:function(a,b){J.qq(a,b)},
+$isEH:true},
+e199:{
+"^":"Xs:51;",
+$2:function(a,b){J.Pk(a,b)},
+$isEH:true},
+e200:{
+"^":"Xs:51;",
+$2:function(a,b){J.Yz(a,b)},
+$isEH:true},
+e201:{
+"^":"Xs:51;",
+$2:function(a,b){a.sw2(b)},
+$isEH:true},
+e202:{
+"^":"Xs:51;",
+$2:function(a,b){J.Qr(a,b)},
+$isEH:true},
+e203:{
+"^":"Xs:51;",
+$2:function(a,b){J.xW(a,b)},
+$isEH:true},
+e204:{
+"^":"Xs:51;",
+$2:function(a,b){J.BC(a,b)},
+$isEH:true},
+e205:{
+"^":"Xs:51;",
+$2:function(a,b){J.VJ(a,b)},
+$isEH:true},
+e206:{
+"^":"Xs:51;",
+$2:function(a,b){J.NO(a,b)},
+$isEH:true},
+e207:{
+"^":"Xs:51;",
+$2:function(a,b){J.WB(a,b)},
+$isEH:true},
+e208:{
+"^":"Xs:51;",
+$2:function(a,b){J.JZ(a,b)},
+$isEH:true},
+e209:{
+"^":"Xs:51;",
+$2:function(a,b){a.shY(b)},
+$isEH:true},
+e210:{
+"^":"Xs:51;",
+$2:function(a,b){J.Nf(a,b)},
+$isEH:true},
+e211:{
+"^":"Xs:51;",
+$2:function(a,b){J.Pl(a,b)},
+$isEH:true},
+e212:{
+"^":"Xs:51;",
+$2:function(a,b){J.Mu(a,b)},
+$isEH:true},
+e213:{
+"^":"Xs:51;",
+$2:function(a,b){J.xH(a,b)},
+$isEH:true},
+e214:{
+"^":"Xs:51;",
+$2:function(a,b){J.o2(a,b)},
+$isEH:true},
+e215:{
+"^":"Xs:51;",
+$2:function(a,b){a.sHP(b)},
+$isEH:true},
+e216:{
+"^":"Xs:51;",
+$2:function(a,b){J.AI(a,b)},
+$isEH:true},
+e217:{
+"^":"Xs:51;",
+$2:function(a,b){J.LI(a,b)},
+$isEH:true},
+e218:{
+"^":"Xs:51;",
+$2:function(a,b){J.fb(a,b)},
+$isEH:true},
+e219:{
+"^":"Xs:51;",
+$2:function(a,b){J.Dz(a,b)},
+$isEH:true},
+e220:{
+"^":"Xs:51;",
+$2:function(a,b){a.siq(b)},
+$isEH:true},
+e221:{
+"^":"Xs:51;",
+$2:function(a,b){J.Qy(a,b)},
+$isEH:true},
+e222:{
+"^":"Xs:51;",
+$2:function(a,b){a.sKt(b)},
+$isEH:true},
+e223:{
+"^":"Xs:51;",
+$2:function(a,b){J.hQ(a,b)},
+$isEH:true},
+e224:{
+"^":"Xs:51;",
+$2:function(a,b){J.mU(a,b)},
+$isEH:true},
+e225:{
+"^":"Xs:51;",
+$2:function(a,b){J.T3(a,b)},
+$isEH:true},
+e226:{
+"^":"Xs:51;",
+$2:function(a,b){J.uM(a,b)},
+$isEH:true},
+e227:{
+"^":"Xs:51;",
+$2:function(a,b){J.Er(a,b)},
+$isEH:true},
+e228:{
+"^":"Xs:51;",
+$2:function(a,b){J.uX(a,b)},
+$isEH:true},
+e229:{
+"^":"Xs:51;",
+$2:function(a,b){J.hS(a,b)},
+$isEH:true},
+e230:{
+"^":"Xs:51;",
+$2:function(a,b){a.sSK(b)},
+$isEH:true},
+e231:{
+"^":"Xs:51;",
+$2:function(a,b){a.shX(b)},
+$isEH:true},
+e232:{
+"^":"Xs:51;",
+$2:function(a,b){J.cl(a,b)},
+$isEH:true},
+e233:{
+"^":"Xs:51;",
+$2:function(a,b){J.Jb(a,b)},
+$isEH:true},
+e234:{
+"^":"Xs:51;",
+$2:function(a,b){J.k7(a,b)},
+$isEH:true},
+e235:{
+"^":"Xs:51;",
+$2:function(a,b){J.jM(a,b)},
+$isEH:true},
+e236:{
+"^":"Xs:51;",
+$2:function(a,b){J.A4(a,b)},
+$isEH:true},
+e237:{
+"^":"Xs:51;",
+$2:function(a,b){J.wD(a,b)},
+$isEH:true},
+e238:{
+"^":"Xs:51;",
+$2:function(a,b){J.wJ(a,b)},
+$isEH:true},
+e239:{
+"^":"Xs:51;",
+$2:function(a,b){J.oJ(a,b)},
+$isEH:true},
+e240:{
+"^":"Xs:51;",
+$2:function(a,b){J.DF(a,b)},
+$isEH:true},
+e241:{
+"^":"Xs:51;",
+$2:function(a,b){J.Mi(a,b)},
+$isEH:true},
+e242:{
+"^":"Xs:51;",
+$2:function(a,b){a.sL1(b)},
+$isEH:true},
+e243:{
+"^":"Xs:51;",
+$2:function(a,b){J.XF(a,b)},
+$isEH:true},
+e244:{
+"^":"Xs:51;",
+$2:function(a,b){J.SF(a,b)},
+$isEH:true},
+e245:{
+"^":"Xs:51;",
+$2:function(a,b){J.Qv(a,b)},
+$isEH:true},
+e246:{
+"^":"Xs:51;",
+$2:function(a,b){J.Xg(a,b)},
+$isEH:true},
+e247:{
+"^":"Xs:51;",
+$2:function(a,b){J.CJ(a,b)},
+$isEH:true},
+e248:{
+"^":"Xs:51;",
+$2:function(a,b){J.El(a,b)},
+$isEH:true},
+e249:{
+"^":"Xs:51;",
+$2:function(a,b){J.fv(a,b)},
+$isEH:true},
+e250:{
+"^":"Xs:51;",
+$2:function(a,b){J.PP(a,b)},
+$isEH:true},
+e251:{
+"^":"Xs:51;",
+$2:function(a,b){J.yk(a,b)},
+$isEH:true},
+e252:{
+"^":"Xs:51;",
+$2:function(a,b){J.TR(a,b)},
+$isEH:true},
+e253:{
+"^":"Xs:51;",
+$2:function(a,b){J.w7(a,b)},
+$isEH:true},
+e254:{
+"^":"Xs:51;",
+$2:function(a,b){J.ME(a,b)},
+$isEH:true},
+e255:{
+"^":"Xs:51;",
+$2:function(a,b){J.kX(a,b)},
+$isEH:true},
+e256:{
+"^":"Xs:51;",
+$2:function(a,b){J.S5(a,b)},
+$isEH:true},
+e257:{
+"^":"Xs:51;",
+$2:function(a,b){J.q0(a,b)},
+$isEH:true},
+e258:{
+"^":"Xs:51;",
+$2:function(a,b){J.EJ(a,b)},
+$isEH:true},
+e259:{
+"^":"Xs:51;",
+$2:function(a,b){J.ND(a,b)},
+$isEH:true},
+e260:{
+"^":"Xs:51;",
+$2:function(a,b){J.B9(a,b)},
+$isEH:true},
+e261:{
+"^":"Xs:51;",
+$2:function(a,b){J.PN(a,b)},
+$isEH:true},
+e262:{
+"^":"Xs:51;",
+$2:function(a,b){a.sVc(b)},
+$isEH:true},
+e263:{
+"^":"Xs:51;",
+$2:function(a,b){J.By(a,b)},
+$isEH:true},
+e264:{
+"^":"Xs:51;",
+$2:function(a,b){J.jd(a,b)},
+$isEH:true},
+e265:{
+"^":"Xs:51;",
+$2:function(a,b){J.Rx(a,b)},
+$isEH:true},
+e266:{
+"^":"Xs:51;",
+$2:function(a,b){J.ZI(a,b)},
+$isEH:true},
+e267:{
+"^":"Xs:51;",
+$2:function(a,b){J.wg(a,b)},
+$isEH:true},
+e268:{
+"^":"Xs:51;",
+$2:function(a,b){J.Tx(a,b)},
+$isEH:true},
+e269:{
+"^":"Xs:51;",
+$2:function(a,b){a.sDo(b)},
+$isEH:true},
+e270:{
+"^":"Xs:51;",
+$2:function(a,b){J.H3(a,b)},
+$isEH:true},
+e271:{
+"^":"Xs:51;",
+$2:function(a,b){J.t3(a,b)},
+$isEH:true},
+e272:{
+"^":"Xs:51;",
+$2:function(a,b){J.GT(a,b)},
+$isEH:true},
+e273:{
+"^":"Xs:51;",
+$2:function(a,b){a.sVF(b)},
+$isEH:true},
+e274:{
+"^":"Xs:51;",
+$2:function(a,b){J.yO(a,b)},
+$isEH:true},
+e275:{
+"^":"Xs:51;",
+$2:function(a,b){J.ZU(a,b)},
+$isEH:true},
+e276:{
+"^":"Xs:51;",
+$2:function(a,b){J.tQ(a,b)},
+$isEH:true},
+e277:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e278:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e279:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e280:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e281:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e282:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("nav-bar",C.Zj)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e283:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e284:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e285:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e286:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e287:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e288:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e289:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e290:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e291:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e292:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e293:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e294:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e295:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e296:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e297:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e298:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e299:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e300:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e301:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("collapsible-content",C.bh)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e302:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e303:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e304:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("script-inset",C.Zt)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e305:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e306:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e307:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e308:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e309:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e310:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("io-http-server-view",C.Wh)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e311:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e312:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e313:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e314:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e315:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("isolate-shared-summary",C.TU)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e316:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("isolate-counter-chart",C.BV)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e317:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e318:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("instance-view",C.k5)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e319:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e320:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e321:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e322:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e323:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e324:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e325:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e326:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e327:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e328:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e329:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("response-viewer",C.Vh)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e330:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e331:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e332:{
+"^":"Xs:42;",
+$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e333:{
+"^":"Xs:42;",
+$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,{
 "^":"",
-pz:{
-"^":["pv;BW%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grs:[function(a){return a.BW},null,null,1,0,337,"msg",308,311],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,338,30,[],"msg",308],
-pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.jy]},
-static:{t4:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+G6:{
+"^":"Vf;BW,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+grs:function(a){return a.BW},
+srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
+RF:[function(a,b){J.LE(a.BW).wM(b)},"$1","gVm",2,0,17,66],
+static:{Dw:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.J0.ZL(a)
-C.J0.oX(a)
-return a},null,null,0,0,115,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[340],
-pv:{
+C.J0.XI(a)
+return a}}},
+Vf:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
-Tg:{
-"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.tSc]},
-static:{rt:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+eW:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{rt:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.oq.ZL(a)
-C.oq.oX(a)
-return a},null,null,0,0,115,"new ClassRefElement$created"]}},
-"+ClassRefElement":[342]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+a.on=z
+a.BA=y
+a.LL=w
+C.YZz.ZL(a)
+C.YZz.XI(a)
+return a}}}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
-Jc:{
-"^":["Dsd;Om%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Om},null,null,1,0,337,"cls",308,311],
-sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,338,30,[],"cls",308],
-vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
-Xe:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/retained"))},"$1","ghN",2,0,343,344,[],"retainedSize"],
-pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.aQx]},
-static:{zg:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+aC:{
+"^":"Vfx;lb,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gRu:function(a){return a.lb},
+sRu:function(a,b){a.lb=this.ct(a,C.XA,a.lb,b)},
+vV:[function(a,b){return J.aT(a.lb).cv(J.ew(J.F8(a.lb),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,67,68],
+S1:[function(a,b){return J.aT(a.lb).cv(J.ew(J.F8(a.lb),"/retained"))},"$1","ghN",2,0,67,69],
+RF:[function(a,b){J.LE(a.lb).wM(b)},"$1","gVm",2,0,17,66],
+static:{zg:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.ka.ZL(a)
-C.ka.oX(a)
-return a},null,null,0,0,115,"new ClassViewElement$created"]}},
-"+ClassViewElement":[345],
-Dsd:{
+C.ka.XI(a)
+return a}}},
+Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
-CN:{
-"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.tY},null,null,1,0,346,"code",309],
-P9:[function(a,b){Q.xI.prototype.P9.call(this,a,b)
-this.ct(a,C.b1,0,1)},"$1","gLe",2,0,116,242,[],"refChanged"],
-"@":function(){return[C.H3]},
-static:{On:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+VY:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gtT:function(a){return a.tY},
+Qj:[function(a,b){Q.xI.prototype.Qj.call(this,a,b)
+this.ct(a,C.i4,0,1)},"$1","gLe",2,0,10,35],
+static:{On:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.IK.ZL(a)
-C.IK.oX(a)
-return a},null,null,0,0,115,"new CodeRefElement$created"]}},
-"+CodeRefElement":[342]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+a.on=z
+a.BA=y
+a.LL=w
+C.tA.ZL(a)
+C.tA.XI(a)
+return a}}}}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":["tuj;Xx%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.Xx},null,null,1,0,346,"code",308,311],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,348,30,[],"code",308],
-i4:[function(a){var z
-Z.uL.prototype.i4.call(this,a)
+"^":"Dsd;Xx,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gtT:function(a){return a.Xx},
+stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
+q0:function(a){var z
+Z.uL.prototype.q0.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z).ml(new F.hf())},"$0","gQd",0,0,126,"enteredView"],
-pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-m2:[function(a,b){var z,y,x
+J.SK(z).ml(new F.Ma())},
+RF:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gVm",2,0,17,66],
+m2:function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
 y=H.BU(z,null,null)
 x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
 if(x==null)return
-return x},"$1","gnV",2,0,349,82,[],"_findJumpTarget"],
+return x},
 YI:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gff",6,0,350,21,[],351,[],82,[],"mouseOver"],
+J.pP(z).h(0,"highlight")},"$3","gKJ",6,0,70,1,71,72],
 ZC:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,350,21,[],351,[],82,[],"mouseOut"],
-"@":function(){return[C.xW]},
-static:{Fe:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,70,1,71,72],
+static:{f9:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.ux.ZL(a)
-C.ux.oX(a)
-return a},null,null,0,0,115,"new CodeViewElement$created"]}},
-"+CodeViewElement":[352],
-tuj:{
+C.ux.XI(a)
+return a}}},
+Dsd:{
 "^":"uL+Pi;",
 $isd3:true},
-hf:{
-"^":"Tp:348;",
-$1:[function(a){a.QW()},"$1",null,2,0,348,289,[],"call"],
-$isEH:true},
-"+ hf":[315]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
+Ma:{
+"^":"Xs:73;",
+$1:[function(a){a.OF()},"$1",null,2,0,null,56,"call"],
+$isEH:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 i6:{
-"^":["Vct;zh%-305,HX%-305,Uy%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gAQ:[function(a){return a.zh},null,null,1,0,312,"iconClass",308,309],
-sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",308],
-gai:[function(a){return a.HX},null,null,1,0,312,"displayValue",308,309],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",308],
-gxj:[function(a){return a.Uy},null,null,1,0,307,"collapsed"],
-sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,310,353,[],"collapsed"],
-i4:[function(a){Z.uL.prototype.i4.call(this,a)
-this.SS(a)},"$0","gQd",0,0,126,"enteredView"],
-jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
-this.SS(a)
-this.SS(a)},"$3","gl8",6,0,350,21,[],351,[],82,[],"toggleDisplay"],
-SS:[function(a){var z,y
-z=a.Uy
-y=a.zh
-if(z===!0){a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-down")
-a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
-a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,126,"_refresh"],
-"@":function(){return[C.Gu]},
-static:{"^":"Vl<-305,DI<-305",Hv:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.zh="glyphicon glyphicon-chevron-down"
-a.HX="none"
-a.Uy=!0
-a.SO=z
-a.B7=y
-a.X0=w
-C.j8.ZL(a)
-C.j8.oX(a)
-return a},null,null,0,0,115,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[354],
-Vct:{
+"^":"tuj;Xf,VA,P2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gDX:function(a){return a.Xf},
+sDX:function(a,b){a.Xf=this.ct(a,C.Ms,a.Xf,b)},
+gvu:function(a){return a.VA},
+svu:function(a,b){a.VA=this.ct(a,C.PI,a.VA,b)},
+q0:function(a){var z
+Z.uL.prototype.q0.call(this,a)
+z=a.Xf
+if(a.P2){a.Xf=this.ct(a,C.Ms,z,"glyphicon glyphicon-chevron-down")
+a.VA=this.ct(a,C.PI,a.VA,"none")}else{a.Xf=this.ct(a,C.Ms,z,"glyphicon glyphicon-chevron-up")
+a.VA=this.ct(a,C.PI,a.VA,"block")}},
+static:{"^":"A2,DI",IT:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Xf="glyphicon glyphicon-chevron-down"
+a.VA="none"
+a.P2=!0
+a.on=z
+a.BA=y
+a.LL=w
+C.T0.ZL(a)
+C.T0.XI(a)
+return a}}},
+tuj:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
-lw:{
-"^":["Nr;GV%-304,Hu%-304,nx%-85,oM%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-goE:[function(a){return a.GV},null,null,1,0,307,"expanded",308,309],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,310,30,[],"expanded",308],
-gO9:[function(a){return a.Hu},null,null,1,0,307,"busy",308,309],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,310,30,[],"busy",308],
-gFR:[function(a){return a.nx},null,null,1,0,115,"callback",308,311],
+JI:{
+"^":"Nr;GV,uo,nx,oM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+goE:function(a){return a.GV},
+soE:function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},
+gv8:function(a){return a.uo},
+sv8: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)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,116,30,[],"callback",308],
-git:[function(a){return a.oM},null,null,1,0,307,"expand",308,311],
-sit:[function(a,b){a.oM=this.ct(a,C.dI,a.oM,b)},null,null,3,0,310,30,[],"expand",308],
-rL:[function(a,b){var z=a.oM
-a.GV=this.ct(a,C.mr,a.GV,z)},"$1","gzr",2,0,169,242,[],"expandChanged"],
-Ey:[function(a){var z=a.GV
+sFR:function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},
+git:function(a){return a.oM},
+sit:function(a,b){a.oM=this.ct(a,C.B0,a.oM,b)},
+na:[function(a,b){var z=a.oM
+a.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,17,35],
+Db:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
-a.Hu=this.ct(a,C.S4,a.Hu,!1)},"$0","goJ",0,0,126,"doneCallback"],
-AZ:[function(a,b,c,d){var z=a.Hu
+a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,15],
+AZ:[function(a,b,c,d){var z=a.uo
 if(z===!0)return
-if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
-this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,313,118,[],199,[],289,[],"toggleExpand"],
-"@":function(){return[C.DKS]},
-static:{fR:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
+this.AV(a,a.GV!==!0,this.gN2(a))}else{z=a.GV
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,55,24,25,56],
+static:{p7:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.GV=!1
-a.Hu=!1
+a.uo=!1
 a.nx=null
 a.oM=!1
-a.SO=z
-a.B7=y
-a.X0=w
+a.on=z
+a.BA=y
+a.LL=w
 C.O0.ZL(a)
-C.O0.oX(a)
-return a},null,null,0,0,115,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[355],
+C.O0.XI(a)
+return a}}},
 Nr:{
-"^":"xc+Pi;",
-$isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
+"^":"ir+Pi;",
+$isd3:true}}],["dart._internal","dart:_internal",,H,{
 "^":"",
-G9:function(){var z,y
-z=$.cM()
-if(z==null)return!0
-y=J.UQ(z,"CustomElements")
-if(y==null)return"registerElement" in document
-return J.de(J.UQ(y,"ready"),!0)},
-wJ:{
-"^":"Tp:115;",
-$0:[function(){if(B.G9())return P.Ab(null,null)
-var z=H.VM(new W.RO(document,"WebComponentsReady",!1),[null])
-return z.gtH(z)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["dart._internal","dart:_internal",,H,{
-"^":"",
-bQ:[function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},"$2","Mn",4,0,null,127,[],128,[]],
-Ck:[function(a,b){var z
+bQ:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},
+Ck:function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
-return!1},"$2","cs",4,0,null,127,[],128,[]],
-n3:[function(a,b,c){var z
+return!1},
+n3:function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.$2(b,z.lo)
-return b},"$3","cS",6,0,null,127,[],129,[],130,[]],
-mx:[function(a,b,c){var z,y,x,w
-for(y=0;x=$.RM(),y<x.length;++y){x=x[y]
-w=a
-if(x==null?w==null:x===w)return H.d(b)+"..."+H.d(c)}z=P.p9("")
-try{$.RM().push(a)
+return b},
+mx:function(a,b,c){var z,y,x
+for(y=0;x=$.oM(),y<x.length;++y)if(x[y]===a)return H.d(b)+"..."+H.d(c)
+z=P.p9("")
+try{$.oM().push(a)
 z.KF(b)
 z.We(a,", ")
-z.KF(c)}finally{x=$.RM()
+z.KF(c)}finally{x=$.oM()
 if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},"$3","l7",6,0,null,127,[],131,[],132,[]],
-rd:[function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},"$2","xX",4,0,null,76,[],133,[]],
-K0:[function(a,b,c){var z=J.Wx(b)
+x.pop()}return z.gvM()},
+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))},"$3","Ze",6,0,null,76,[],134,[],135,[]],
-qG:[function(a,b,c,d,e){var z,y,x,w
-H.K0(a,b,c)
-z=J.xH(c,b)
-if(J.de(z,0))return
+if(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.$isList){x=e
+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(P.w("Not enough elements"))
-H.tb(w,x,a,b,z)},"$5","it",10,0,null,76,[],134,[],135,[],113,[],136,[]],
-IC:[function(a,b,c){var z,y,x,w,v,u
+x=0}if(J.z8(J.ew(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,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 y=J.x(c)
@@ -2735,138 +3975,130 @@
 if(!!a.immutable$list)H.vh(P.f("set range"))
 H.qG(a,z,w,a,b)
 for(z=y.gA(c);z.G();b=u){v=z.gl()
-u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"$3","QB",6,0,null,76,[],15,[],127,[]],
-ed:[function(a,b,c){var z,y
+u=J.ew(b,1)
+C.Nm.u(a,b,v)}},
+xr:function(a,b,c){var z,y
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
-for(z=J.GP(c);z.G();b=y){y=b+1
-C.Nm.u(a,b,z.gl())}},"$3","Y1",6,0,null,76,[],15,[],127,[]],
-tb:[function(a,b,c,d,e){var z,y,x,w,v
+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
 z=J.Wx(b)
-if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"$5","e8",10,0,null,137,[],138,[],139,[],140,[],141,[]],
-TK:[function(a,b,c,d){var z
+if(z.C(b,d))for(y=J.Hn(z.g(b,e),1),x=J.Hn(J.ew(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.Hn(x,1))C.Nm.u(c,x,z.t(a,y))
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.ew(x,1))C.Nm.u(c,x,w.t(a,y))},
+TK:function(a,b,c,d){var z
 if(c>=a.length)return-1
-if(c<0)c=0
-for(z=c;z<d;++z){if(z<0||z>=a.length)return H.e(a,z)
-if(J.de(a[z],b))return z}return-1},"$4","vu",8,0,null,118,[],142,[],88,[],143,[]],
-lO:[function(a,b,c){var z,y
+for(z=c;z<d;++z){if(z>=a.length)return H.e(a,z)
+if(J.xC(a[z],b))return z}return-1},
+lO:function(a,b,c){var z,y
 if(typeof c!=="number")return c.C()
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
 for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.de(a[y],b))return y}return-1},"$3","MW",6,0,null,118,[],142,[],88,[]],
-ZE:[function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
-else H.d4(a,b,c,d)},"$4","UR",8,0,null,118,[],144,[],145,[],133,[]],
-w9:[function(a,b,c,d){var z,y,x,w,v,u
-for(z=J.WB(b,1),y=J.U6(a);x=J.Wx(z),x.E(z,c);z=x.g(z,1)){w=y.t(a,z)
-v=z
-while(!0){u=J.Wx(v)
-if(!(u.D(v,b)&&J.z8(d.$2(y.t(a,u.W(v,1)),w),0)))break
-y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},"$4","f7",8,0,null,118,[],144,[],145,[],133,[]],
-d4:[function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
-z=J.Wx(a0)
-y=J.Ts(J.WB(z.W(a0,b),1),6)
-x=J.Qc(b)
-w=x.g(b,y)
-v=z.W(a0,y)
-u=J.Ts(x.g(b,a0),2)
-t=J.Wx(u)
-s=t.W(u,y)
-r=t.g(u,y)
+if(J.xC(a[y],b))return y}return-1},
+ZE:function(a,b,c,d){if(c-b<=32)H.w9(a,b,c,d)
+else H.d4(a,b,c,d)},
+w9:function(a,b,c,d){var z,y,x,w,v
+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
+v=w-1
+y.u(a,w,y.t(a,v))
+w=v}y.u(a,w,x)}},
+d4: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)
+y=b+z
+x=c-z
+w=C.jn.cU(b+c,2)
+v=w-z
+u=w+z
 t=J.U6(a)
+s=t.t(a,y)
+r=t.t(a,v)
 q=t.t(a,w)
-p=t.t(a,s)
-o=t.t(a,u)
-n=t.t(a,r)
-m=t.t(a,v)
-if(J.z8(a1.$2(q,p),0)){l=p
+p=t.t(a,u)
+o=t.t(a,x)
+if(J.z8(d.$2(s,r),0)){n=r
+r=s
+s=n}if(J.z8(d.$2(p,o),0)){n=o
+o=p
+p=n}if(J.z8(d.$2(s,q),0)){n=q
+q=s
+s=n}if(J.z8(d.$2(r,q),0)){n=q
+q=r
+r=n}if(J.z8(d.$2(s,p),0)){n=p
+p=s
+s=n}if(J.z8(d.$2(q,p),0)){n=p
 p=q
-q=l}if(J.z8(a1.$2(n,m),0)){l=m
-m=n
-n=l}if(J.z8(a1.$2(q,o),0)){l=o
-o=q
-q=l}if(J.z8(a1.$2(p,o),0)){l=o
+q=n}if(J.z8(d.$2(r,o),0)){n=o
+o=r
+r=n}if(J.z8(d.$2(r,q),0)){n=q
+q=r
+r=n}if(J.z8(d.$2(p,o),0)){n=o
 o=p
-p=l}if(J.z8(a1.$2(q,n),0)){l=n
-n=q
-q=l}if(J.z8(a1.$2(o,n),0)){l=n
-n=o
-o=l}if(J.z8(a1.$2(p,m),0)){l=m
-m=p
-p=l}if(J.z8(a1.$2(p,o),0)){l=o
-o=p
-p=l}if(J.z8(a1.$2(n,m),0)){l=m
-m=n
-n=l}t.u(a,w,q)
-t.u(a,u,o)
-t.u(a,v,m)
-t.u(a,s,t.t(a,b))
-t.u(a,r,t.t(a,a0))
-k=x.g(b,1)
-j=z.W(a0,1)
-if(J.de(a1.$2(p,n),0)){for(i=k;z=J.Wx(i),z.E(i,j);i=z.g(i,1)){h=t.t(a,i)
-g=a1.$2(h,p)
-x=J.x(g)
-if(x.n(g,0))continue
-if(x.C(g,0)){if(!z.n(i,k)){t.u(a,i,t.t(a,k))
-t.u(a,k,h)}k=J.WB(k,1)}else for(;!0;){g=a1.$2(t.t(a,j),p)
-x=J.Wx(g)
-if(x.D(g,0)){j=J.xH(j,1)
-continue}else{f=J.Wx(j)
-if(x.C(g,0)){t.u(a,i,t.t(a,k))
-e=J.WB(k,1)
-t.u(a,k,t.t(a,j))
-d=f.W(j,1)
-t.u(a,j,h)
-j=d
-k=e
-break}else{t.u(a,i,t.t(a,j))
-d=f.W(j,1)
-t.u(a,j,h)
-j=d
-break}}}}c=!0}else{for(i=k;z=J.Wx(i),z.E(i,j);i=z.g(i,1)){h=t.t(a,i)
-if(J.u6(a1.$2(h,p),0)){if(!z.n(i,k)){t.u(a,i,t.t(a,k))
-t.u(a,k,h)}k=J.WB(k,1)}else if(J.z8(a1.$2(h,n),0))for(;!0;)if(J.z8(a1.$2(t.t(a,j),n),0)){j=J.xH(j,1)
-if(J.u6(j,i))break
-continue}else{x=J.Wx(j)
-if(J.u6(a1.$2(t.t(a,j),p),0)){t.u(a,i,t.t(a,k))
-e=J.WB(k,1)
-t.u(a,k,t.t(a,j))
-d=x.W(j,1)
-t.u(a,j,h)
-j=d
-k=e}else{t.u(a,i,t.t(a,j))
-d=x.W(j,1)
-t.u(a,j,h)
-j=d}break}}c=!1}z=J.Wx(k)
-t.u(a,b,t.t(a,z.W(k,1)))
-t.u(a,z.W(k,1),p)
-x=J.Qc(j)
-t.u(a,a0,t.t(a,x.g(j,1)))
-t.u(a,x.g(j,1),n)
-H.ZE(a,b,z.W(k,2),a1)
-H.ZE(a,x.g(j,2),a0,a1)
-if(c)return
-if(z.C(k,w)&&x.D(j,v)){for(;J.de(a1.$2(t.t(a,k),p),0);)k=J.WB(k,1)
-for(;J.de(a1.$2(t.t(a,j),n),0);)j=J.xH(j,1)
-for(i=k;z=J.Wx(i),z.E(i,j);i=z.g(i,1)){h=t.t(a,i)
-if(J.de(a1.$2(h,p),0)){if(!z.n(i,k)){t.u(a,i,t.t(a,k))
-t.u(a,k,h)}k=J.WB(k,1)}else if(J.de(a1.$2(h,n),0))for(;!0;)if(J.de(a1.$2(t.t(a,j),n),0)){j=J.xH(j,1)
-if(J.u6(j,i))break
-continue}else{x=J.Wx(j)
-if(J.u6(a1.$2(t.t(a,j),p),0)){t.u(a,i,t.t(a,k))
-e=J.WB(k,1)
-t.u(a,k,t.t(a,j))
-d=x.W(j,1)
-t.u(a,j,h)
-j=d
-k=e}else{t.u(a,i,t.t(a,j))
-d=x.W(j,1)
-t.u(a,j,h)
-j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"$4","Hm",8,0,null,118,[],144,[],145,[],133,[]],
+p=n}t.u(a,y,s)
+t.u(a,w,q)
+t.u(a,x,o)
+t.u(a,v,t.t(a,b))
+t.u(a,u,t.t(a,c))
+m=b+1
+l=c-1
+if(J.xC(d.$2(r,p),0)){for(k=m;k<=l;++k){j=t.t(a,k)
+i=d.$2(j,r)
+h=J.x(i)
+if(h.n(i,0))continue
+if(h.C(i,0)){if(k!==m){t.u(a,k,t.t(a,m))
+t.u(a,m,j)}++m}else for(;!0;){i=d.$2(t.t(a,l),r)
+h=J.Wx(i)
+if(h.D(i,0)){--l
+continue}else{g=l-1
+if(h.C(i,0)){t.u(a,k,t.t(a,m))
+f=m+1
+t.u(a,m,t.t(a,l))
+t.u(a,l,j)
+l=g
+m=f
+break}else{t.u(a,k,t.t(a,l))
+t.u(a,l,j)
+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
+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))
+f=m+1
+t.u(a,m,t.t(a,l))
+t.u(a,l,j)
+l=g
+m=f}else{t.u(a,k,t.t(a,l))
+t.u(a,l,j)
+l=g}break}}e=!1}h=m-1
+t.u(a,b,t.t(a,h))
+t.u(a,h,r)
+h=l+1
+t.u(a,c,t.t(a,h))
+t.u(a,h,p)
+H.ZE(a,b,m-2,d)
+H.ZE(a,l+2,c,d)
+if(e)return
+if(m<y&&l>x){for(;J.xC(d.$2(t.t(a,m),r),0);)++m
+for(;J.xC(d.$2(t.t(a,l),p),0);)--l
+for(k=m;k<=l;++k){j=t.t(a,k)
+if(J.xC(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.xC(d.$2(j,p),0))for(;!0;)if(J.xC(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))
+f=m+1
+t.u(a,m,t.t(a,l))
+t.u(a,l,j)
+l=g
+m=f}else{t.u(a,k,t.t(a,l))
+t.u(a,l,j)
+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)])},
@@ -2876,14 +4108,14 @@
 y=0
 for(;y<z;++y){b.$1(this.Zv(0,y))
 if(z!==this.gB(this))throw H.b(P.a4(this))}},
-gl0:function(a){return J.de(this.gB(this),0)},
-grZ:function(a){if(J.de(this.gB(this),0))throw H.b(P.w("No elements"))
-return this.Zv(0,J.xH(this.gB(this),1))},
+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))},
 tg:function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=0
-for(;y<z;++y){if(J.de(this.Zv(0,y),b))return!0
+for(;y<z;++y){if(J.xC(this.Zv(0,y),b))return!0
 if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
 Vr:function(a,b){var z,y
 z=this.gB(this)
@@ -2910,15 +4142,7 @@
 w.vM+=typeof u==="string"?u:H.d(u)
 if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
 ev:function(a,b){return P.mW.prototype.ev.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},128,[]],
-es:function(a,b,c){var z,y,x
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
-y=b
-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.q9(this,b,null,null)},
+ez:[function(a,b){return H.VM(new H.lJ(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.cX,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},48],
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
@@ -2951,21 +4175,21 @@
 y=this.SH
 if(J.J5(y,z))return 0
 x=this.AN
-if(x==null||J.J5(x,z))return J.xH(z,y)
-return J.xH(x,y)},
-Zv:function(a,b){var z=J.WB(this.gjX(),b)
+if(x==null||J.J5(x,z))return J.Hn(z,y)
+return J.Hn(x,y)},
+Zv:function(a,b){var z=J.ew(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.i4(this.l6,z)},
+return J.i9(this.l6,z)},
 eR:function(a,b){if(J.u6(b,0))throw H.b(P.N(b))
-return H.q9(this.l6,J.WB(this.SH,b),this.AN,null)},
+return H.j5(this.l6,J.ew(this.SH,b),this.AN,null)},
 qZ:function(a,b){var z,y,x
-if(J.u6(b,0))throw H.b(P.N(b))
+if(b<0)throw H.b(P.N(b))
 z=this.AN
 y=this.SH
-if(z==null)return H.q9(this.l6,y,J.WB(y,b),null)
-else{x=J.WB(y,b)
+if(z==null)return H.j5(this.l6,y,J.ew(y,b),null)
+else{x=J.ew(y,b)
 if(J.u6(z,x))return this
-return H.q9(this.l6,y,x,null)}},
+return H.j5(this.l6,y,x,null)}},
 Hd:function(a,b,c,d){var z,y,x
 z=this.SH
 y=J.Wx(z)
@@ -2973,7 +4197,7 @@
 x=this.AN
 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:{q9:function(a,b,c,d){var z=H.VM(new H.nH(a,b,c),[d])
+static:{j5:function(a,b,c,d){var z=H.VM(new H.nH(a,b,c),[d])
 z.Hd(a,b,c,d)
 return z}}},
 a7:{
@@ -2983,7 +4207,7 @@
 z=this.l6
 y=J.U6(z)
 x=y.gB(z)
-if(!J.de(this.SW,x))throw H.b(P.a4(z))
+if(!J.xC(this.SW,x))throw H.b(P.a4(z))
 w=this.G7
 if(typeof x!=="number")return H.s(x)
 if(w>=x){this.lo=null
@@ -2992,15 +4216,14 @@
 i1:{
 "^":"mW;l6,T6",
 mb:function(a){return this.T6.$1(a)},
-gA:function(a){var z=new H.MH(null,J.GP(this.l6),this.T6)
+gA:function(a){var z=new H.MH(null,J.mY(this.l6),this.T6)
 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.MQ(this.l6))},
-Zv:function(a,b){return this.mb(J.i4(this.l6,b))},
 $asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]},
+$ascX:function(a,b){return[b]},
 static:{K1: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:{
@@ -3015,18 +4238,18 @@
 return!1},
 gl:function(){return this.lo},
 $asAC:function(a,b){return[b]}},
-A8:{
+lJ:{
 "^":"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.i4(this.CR,b))},
+Zv:function(a,b){return this.mb(J.i9(this.CR,b))},
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]},
+$ascX:function(a,b){return[b]},
 $isyN:true},
 U5:{
 "^":"mW;l6,T6",
-gA:function(a){var z=new H.SO(J.GP(this.l6),this.T6)
+gA:function(a){var z=new H.SO(J.mY(this.l6),this.T6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 SO:{
@@ -3035,1325 +4258,194 @@
 G:function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
 return!1},
 gl:function(){return this.OI.gl()}},
-kV:{
+zs:{
 "^":"mW;l6,T6",
-gA:function(a){var z=new H.rR(J.GP(this.l6),this.T6,C.Gw,null)
+gA:function(a){var z=new H.rR(J.mY(this.l6),this.T6,C.Gw,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]}},
+$ascX:function(a,b){return[b]}},
 rR:{
-"^":"a;OI,T6,C2,lo",
+"^":"a;OI,T6,e0,lo",
 mb:function(a){return this.T6.$1(a)},
 gl:function(){return this.lo},
 G:function(){var z,y
-z=this.C2
+z=this.e0
 if(z==null)return!1
 for(y=this.OI;!z.G();){this.lo=null
-if(y.G()){this.C2=null
-z=J.GP(this.mb(y.gl()))
-this.C2=z}else return!1}this.lo=this.C2.gl()
+if(y.G()){this.e0=null
+z=J.mY(this.mb(y.gl()))
+this.e0=z}else return!1}this.lo=this.e0.gl()
 return!0}},
-ao:{
-"^":"mW;l6,Vg",
-gA:function(a){var z=this.l6
-z=new H.y9(z.gA(z),this.Vg)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-static:{Dw:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.u(b))
-if(!!a.$isyN)return H.VM(new H.YZ(a,b),[c])
-return H.VM(new H.ao(a,b),[c])}}},
-YZ:{
-"^":"ao;l6,Vg",
-gB:function(a){var z,y
-z=this.l6
-y=z.gB(z)
-z=this.Vg
-if(J.z8(y,z))return z
-return y},
-$isyN:true},
-y9:{
-"^":"AC;OI,GE",
-G:function(){var z=J.xH(this.GE,1)
-this.GE=z
-if(J.J5(z,0))return this.OI.G()
-this.GE=-1
-return!1},
-gl:function(){if(J.u6(this.GE,0))return
-return this.OI.gl()}},
-AM:{
-"^":"mW;l6,FT",
-eR:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
-return H.ke(this.l6,J.WB(this.FT,b),H.Kp(this,0))},
-gA:function(a){var z=this.l6
-z=new H.U1(z.gA(z),this.FT)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-jb:function(a,b,c){var z=this.FT
-if(typeof z!=="number"||Math.floor(z)!==z||J.u6(z,0))throw H.b(P.C3(z))},
-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.bk(a,b,c)},bk: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",
-gB:function(a){var z,y
-z=this.l6
-y=J.xH(z.gB(z),this.FT)
-if(J.J5(y,0))return y
-return 0},
-$isyN:true},
-U1:{
-"^":"AC;OI,FT",
-G:function(){var z,y,x
-z=this.OI
-y=0
-while(!0){x=this.FT
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-z.G();++y}this.FT=0
-return z.G()},
-gl:function(){return this.OI.gl()}},
-yq:{
+Xc:{
 "^":"a;",
 G:function(){return!1},
 gl:function(){return}},
-SU7:{
+Lj:{
 "^":"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"))},
+aP: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"))},
 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"))}},
-Tv:{
+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"))},
 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"))},
+aP: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"))},
-GT:function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},
-np:function(a){return this.GT(a,null)},
+XP:function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},
+Jd:function(a){return this.XP(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)},
+vg: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"))},
-$isList:true,
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null},
-w2Y:{
-"^":"ar+Tv;",
-$isList:true,
+$iscX:true,
+$ascX:null},
+XC:{
+"^":"rm+JJ;",
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null},
+$iscX:true,
+$ascX:null},
 iK:{
 "^":"aL;CR",
 gB:function(a){return J.q8(this.CR)},
-Zv:function(a,b){var z,y
+Zv:function(a,b){var z,y,x
 z=this.CR
 y=J.U6(z)
-return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))}},
+x=y.gB(z)
+if(typeof b!=="number")return H.s(b)
+return y.Zv(z,x-1-b)}},
 GD:{
-"^":"a;fN>",
+"^":"a;fN<",
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isGD&&J.de(this.fN,b.fN)},
+return!!J.x(b).$isGD&&J.xC(this.fN,b.fN)},
 giO:function(a){var z=J.v1(this.fN)
 if(typeof z!=="number")return H.s(z)
 return 536870911&664597*z},
 bu:function(a){return"Symbol(\""+H.d(this.fN)+"\")"},
 $isGD:true,
-$iswv:true,
-static:{"^":"RWj,ES1,quP,L3,Np,p1",u1:[function(a){var z,y
-z=J.U6(a)
-if(z.gl0(a)!==!0){y=$.bw().Ej
-if(typeof a!=="string")H.vh(P.u(a))
-y=y.test(a)}else y=!0
-if(y)return a
-if(z.nC(a,"_"))throw H.b(P.u("\""+H.d(a)+"\" is a private identifier"))
-throw H.b(P.u("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))},"$1","kf",2,0,null,12,[]]}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
+$isIN:true,
+static:{"^":"RWj,ES1,quP,KGP,q3,fbV"}}}],["dart._js_names","dart:_js_names",,H,{
 "^":"",
-TS:[function(a){return J.GL(a)},"$1","DP",2,0,null,146,[]],
-YC:[function(a){if(a==null)return
-return new H.GD(a)},"$1","Rc",2,0,null,12,[]],
-vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
-else return new H.iu(a,4)},"$1","Yf",2,0,147,148,[]],
-jO:[function(a){var z,y
-z=$.Sl().t(0,a)
-y=J.x(a)
-if(y.n(a,"dynamic"))return $.P8()
-if(y.n(a,"void"))return $.oj()
-return H.tT(H.YC(z==null?a:z),a)},"$1","vC",2,0,null,149,[]],
-tT:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-z=J.U6(b)
-y=z.u8(b,"/")
-if(y>-1)b=z.yn(b,y+1)
-z=$.tY
-if(z==null){z=H.Pq()
-$.tY=z}x=z[b]
-if(x!=null)return x
-z=J.U6(b)
-w=z.u8(b,"<")
-if(w!==-1){v=H.jO(z.Nj(b,0,w)).gJi()
-x=new H.bl(v,z.Nj(b,w+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,v.gIf())
-$.tY[b]=x
-return x}u=H.mN(b)
-if(u==null){t=init.functionAliases[b]
-if(t!=null){x=new H.ng(b,null,a)
-x.CM=new H.Ar(init.metadata[t],null,null,null,x)
-$.tY[b]=x
-return x}throw H.b(P.f("Cannot find class for: "+H.d(H.TS(a))))}s=H.SG(u)?u.constructor:u
-r=s["@"]
-if(r==null){q=null
-p=null}else{q=r["^"]
-z=J.x(q)
-if(!!z.$isList){p=z.Mu(q,1,z.gB(q)).br(0)
-q=z.t(q,0)}else p=null
-if(typeof q!=="string")q=""}z=J.uH(q,";")
-if(0>=z.length)return H.e(z,0)
-o=J.uH(z[0],"+")
-if(o.length>1&&$.Sl().t(0,b)==null)x=H.MJ(o,b)
-else{n=new H.Wf(b,u,q,p,H.Pq(),null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a)
-m=s.prototype["<>"]
-if(m==null||m.length===0)x=n
-else{for(z=m.length,l="dynamic",k=1;k<z;++k)l+=",dynamic"
-x=new H.bl(n,l,null,null,null,null,null,null,null,null,null,null,null,null,null,n.If)}}$.tY[b]=x
-return x},"$2","ER",4,0,null,146,[],149,[]],
-Vv:[function(a){var z,y,x
-z=P.L5(null,null,null,null,null)
-for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"$1","yM",2,0,null,150,[]],
-Fk:[function(a){var z,y,x
-z=P.L5(null,null,null,null,null)
-for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.gxV())z.u(0,x.gIf(),x)}return z},"$1","Pj",2,0,null,150,[]],
-EK:[function(a,b){var z,y,x,w
-z=P.L5(null,null,null,null,null)
-for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.glT()){w=x.gIf()
-if(b.nb.t(0,w)!=null)continue
-z.u(0,x.gIf(),x)}}return z},"$2","rX",4,0,null,150,[],151,[]],
-vE:[function(a,b){var z,y,x,w,v
-z=P.L5(null,null,null,null,null)
-z.FV(0,b)
-for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.ghB()){w=x.gIf().fN
-v=J.U6(w)
-if(!!J.x(z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))).$isRY)continue}if(x.gxV())continue
-z.to(x.gIf(),new H.YX(x))}return z},"$2","un",4,0,null,150,[],152,[]],
-MJ:[function(a,b){var z,y,x,w
-z=[]
-for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();)z.push(H.jO(y.lo))
-x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
-x.G()
-w=x.lo
-for(;x.G();)w=new H.BI(w,x.lo,null,null,H.YC(b))
-return w},"$2","R9",4,0,null,153,[],149,[]],
-w2:[function(a,b){var z,y,x
-z=J.U6(a)
-y=0
-while(!0){x=z.gB(a)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(P.u("Type variable not present in list."))},"$2","CE",4,0,null,155,[],12,[]],
-Jf:[function(a,b){var z,y,x,w,v,u,t
-z={}
-z.a=null
-for(y=a;y!=null;){x=J.x(y)
-if(!!x.$isMs){z.a=y
-break}if(!!x.$isrN)break
-y=y.gXP()}if(b==null)return $.P8()
-else{x=z.a
-if(x==null)w=H.Ko(b,null)
-else if(x.gHA())if(typeof b==="number"){v=init.metadata[b]
-u=x.gNy()
-return J.UQ(u,H.w2(u,J.O6(v)))}else w=H.Ko(b,null)
-else{z=new H.rh(z)
-if(typeof b==="number"){t=z.$1(b)
-if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.iW(z))}}if(w!=null)return H.jO(w)
-return P.re(C.yQ)},"$2","xN",4,0,null,156,[],11,[]],
-fb:[function(a,b){if(a==null)return b
-return H.YC(H.d(J.GL(J.Ba(a)))+"."+H.d(b.fN))},"$2","WS",4,0,null,156,[],157,[]],
-pj:[function(a){var z,y,x,w
-z=a["@"]
-if(z!=null)return z()
-if(typeof a!="function")return C.xD
-if("$metadataIndex" in a){y=a.$reflectionInfo.splice(a.$metadataIndex)
-y.fixed$length=init
-return H.VM(new H.A8(y,new H.ye()),[null,null]).br(0)}x=Function.prototype.toString.call(a)
-w=C.xB.cn(x,new H.VR(H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
-if(w===-1)return C.xD;++w
-return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"$1","C7",2,0,null,158,[]],
-jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
-z=J.x(b)
-if(!!z.$isList){y=H.Mk(z.t(b,0),",")
-x=z.Jk(b,1)}else{y=typeof b==="string"?H.Mk(b,","):[]
-x=null}for(z=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=x!=null,v=0;z.G();){u=z.lo
-if(w){t=v+1
-if(v>=x.length)return H.e(x,v)
-s=x[v]
-v=t}else s=null
-r=H.pS(u,s,a,c)
-if(r!=null)d.push(r)}},"$4","Sv",8,0,null,156,[],159,[],67,[],57,[]],
-Mk:[function(a,b){var z=J.U6(a)
-if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"$2","EO",4,0,null,14,[],106,[]],
-BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
-default:return!1}},"$1","IX",2,0,null,12,[]],
-Y6:[function(a){var z,y
-z=J.x(a)
-if(z.n(a,"^")||z.n(a,"$methodsWithOptionalArguments"))return!0
-y=z.t(a,0)
-z=J.x(y)
-return z.n(y,"*")||z.n(y,"+")},"$1","uG",2,0,null,49,[]],
-Sn:{
-"^":"a;L5,F1>",
-gvU:function(){var z,y,x,w
-z=this.L5
-if(z!=null)return z
-y=P.L5(null,null,null,null,null)
-for(z=$.vK(),z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)for(x=J.GP(z.lo);x.G();){w=x.gl()
-y.u(0,w.gFP(),w)}z=H.VM(new H.Oh(y),[P.iD,P.D4])
-this.L5=z
-return z},
-static:{"^":"QG,Q3,Ct",dF:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=P.L5(null,null,null,J.O,[J.Q,P.D4])
-y=init.libraries
-if(y==null)return z
-for(x=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);x.G();){w=x.lo
-v=J.U6(w)
-u=v.t(w,0)
-t=P.hK(v.t(w,1))
-s=v.t(w,2)
-r=v.t(w,3)
-q=v.t(w,4)
-p=v.t(w,5)
-o=v.t(w,6)
-n=v.t(w,7)
-m=q==null?C.xD:q()
-J.wT(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"$0","jc",0,0,null]}},
-nI:{
-"^":"Tp:115;",
-$0:[function(){return H.VM([],[P.D4])},"$0",null,0,0,null,"call"],
-$isEH:true},
-jU:{
-"^":"a;",
-bu:function(a){return this.gOO()},
-IB:function(a){throw H.b(P.SY(null))},
-$isQF:true},
-Lj:{
-"^":"jU;MA",
-gOO:function(){return"Isolate"},
-gcZ:function(){var z=$.Cm().gvU().nb
-return z.gUQ(z).XG(0,new H.mb())},
-$isQF:true},
-mb:{
-"^":"Tp:357;",
-$1:[function(a){return a.gGD()},"$1",null,2,0,null,356,[],"call"],
-$isEH:true},
-amu:{
-"^":"jU;If<",
-gUx:function(a){return H.fb(this.gXP(),this.gIf())},
-gq4:function(){return J.co(this.gIf().fN,"_")},
-bu:function(a){return this.gOO()+" on '"+H.d(this.gIf().fN)+"'"},
-jd:function(a,b){throw H.b(H.Ef("Should not call _invoke"))},
-$isNL:true,
-$isQF:true},
-cw:{
-"^":"EE;XP<,zn,Nz,LQ,If",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},
-giO:function(a){var z,y
-z=J.v1(C.Gp.LU)
-if(typeof z!=="number")return H.s(z)
-y=this.XP
-return(1073741823&z^17*J.v1(this.If)^19*y.giO(y))>>>0},
-gOO:function(){return"TypeVariableMirror"},
-gFo:function(){return!1},
-$iscw:true,
-$istg:true,
-$isX9:true,
-$isNL:true,
-$isQF:true},
-EE:{
-"^":"amu;If",
-gOO:function(){return"TypeMirror"},
-gXP:function(){return},
-gc9:function(){return H.vh(P.SY(null))},
-gYj:function(){throw H.b(P.f("This type does not support reflectedType"))},
-gNy:function(){return C.dn},
-gw8:function(){return C.hU},
-gHA:function(){return!0},
-gJi:function(){return this},
-$isX9:true,
-$isNL:true,
-$isQF:true},
-Uz:{
-"^":"uh;FP<,aP,wP,le,LB,GD<,ae<,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
-gOO:function(){return"LibraryMirror"},
-gUx:function(a){return this.If},
-gEO:function(){return this.gm8()},
-gqh:function(){var z,y,x
-z=this.P8
-if(z!=null)return z
-y=P.L5(null,null,null,null,null)
-for(z=J.GP(this.aP);z.G();){x=H.jO(z.gl())
-if(!!J.x(x).$isMs){x=x.gJi()
-if(!!x.$isWf){y.u(0,x.If,x)
-x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
-this.P8=z
-return z},
-rN:function(a){var z,y
-z=this.gQH().nb.t(0,a)
-if(z==null)throw H.b(P.lr(this,a,[],null,null))
-if(!J.x(z).$isRS)return H.vn(z.IB(this))
-if(z.glT())return H.vn(z.IB(this))
-y=z.dl.$getter
-if(y==null)throw H.b(P.SY(null))
-return H.vn(y())},
-F2:function(a,b,c){var z,y,x
-z=this.gQH().nb.t(0,a)
-y=!!J.x(z).$isZk
-if(y&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
-if(z!=null)x=y&&z.hB
-else x=!0
-if(x)throw H.b(P.lr(this,a,b,c,null))
-if(y&&!z.lT)return H.vn(z.jd(b,c))
-return this.rN(a).F2(C.Ka,b,c)},
-CI:function(a,b){return this.F2(a,b,null)},
-gm8:function(){var z,y,x,w,v,u,t,s,r,q,p
-z=this.SD
-if(z!=null)return z
-y=H.VM([],[H.Zk])
-z=this.wP
-x=J.U6(z)
-w=this.ae
-v=0
-while(!0){u=x.gB(z)
-if(typeof u!=="number")return H.s(u)
-if(!(v<u))break
-c$0:{t=x.t(z,v)
-s=w[t]
-r=$.Sl().t(0,t)
-if(r==null||!!s.$getterStub)break c$0
-q=J.rY(r).nC(r,"new ")
-if(q){u=C.xB.yn(r,4)
-r=H.ys(u,"$",".")}p=H.S5(r,s,!q,q)
-y.push(p)
-p.jE=this}++v}this.SD=y
-return y},
-gTH:function(){var z,y
-z=this.zE
-if(z!=null)return z
-y=H.VM([],[P.RY])
-H.jw(this,this.LB,!0,y)
-this.zE=y
-return y},
-gQn:function(){var z,y,x
-z=this.mX
-if(z!=null)return z
-y=P.L5(null,null,null,null,null)
-for(z=this.gm8(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-if(!x.gxV())y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RS])
-this.mX=z
-return z},
-gF4:function(){var z=this.T1
-if(z!=null)return z
-z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
-this.T1=z
-return z},
-gM1:function(){var z=this.fX
-if(z!=null)return z
-z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
-this.fX=z
-return z},
-gcc:function(){var z,y,x
-z=this.M2
-if(z!=null)return z
-y=P.L5(null,null,null,null,null)
-for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
-this.M2=z
-return z},
-gQH:function(){var z,y
-z=this.uA
-if(z!=null)return z
-z=this.gqh()
-y=P.L5(null,null,null,null,null)
-y.FV(0,z)
-z=new H.IB(y)
-this.gQn().nb.aN(0,z)
-this.gF4().nb.aN(0,z)
-this.gM1().nb.aN(0,z)
-this.gcc().nb.aN(0,z)
-z=H.VM(new H.Oh(y),[P.wv,P.QF])
-this.uA=z
-return z},
-gYK:function(){var z,y
-z=this.Db
-if(z!=null)return z
-y=P.L5(null,null,null,P.wv,P.NL)
-this.gQH().nb.aN(0,new H.oP(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
-this.Db=z
-return z},
-gc9:function(){var z=this.xO
-if(z!=null)return z
-z=H.VM(new P.Yp(J.kl(this.le,H.Yf())),[P.vr])
-this.xO=z
-return z},
-gXP:function(){return},
-$isD4:true,
-$isQF:true,
-$isNL:true},
-uh:{
-"^":"amu+M2;",
-$isQF:true},
-IB:{
-"^":"Tp:358;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
-$isEH:true},
-oP:{
-"^":"Tp:358;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
-$isEH:true},
-YX:{
-"^":"Tp:115;a",
-$0:[function(){return this.a},"$0",null,0,0,null,"call"],
-$isEH:true},
-BI:{
-"^":"Un;AY<,XW,BB,i1,If",
-gOO:function(){return"ClassMirror"},
-gIf:function(){var z,y
-z=this.BB
-if(z!=null)return z
-y=J.GL(J.Ba(this.AY))
-z=this.XW
-z=J.kE(y," with ")===!0?H.YC(H.d(y)+", "+H.d(J.GL(J.Ba(z)))):H.YC(H.d(y)+" with "+H.d(J.GL(J.Ba(z))))
-this.BB=z
-return z},
-gUx:function(a){return this.gIf()},
-gYK:function(){return this.XW.gYK()},
-F2:function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},
-CI:function(a,b){return this.F2(a,b,null)},
-rN:function(a){throw H.b(P.lr(this,a,null,null,null))},
-gkZ:function(){return[this.XW]},
-gHA:function(){return!0},
-gJi:function(){return this},
-gNy:function(){throw H.b(P.SY(null))},
-gw8:function(){return C.hU},
-$isMs:true,
-$isQF:true,
-$isX9:true,
-$isNL:true},
-Un:{
-"^":"EE+M2;",
-$isQF:true},
-M2:{
-"^":"a;",
-$isQF:true},
-iu:{
-"^":"M2;Ax<,xq",
-gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
-F2:function(a,b,c){return this.tu(a,0,b,c==null?C.CM:c)},
-CI:function(a,b){return this.F2(a,b,null)},
-Z7:function(a,b,c){var z,y,x,w,v,u,t,s
-z=this.Ax
-y=J.x(z)[a]
-if(y==null)throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))
-x=H.zh(y)
-b=P.F(b,!0,null)
-w=x.Rv
-if(w!==b.length)throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))
-v=P.L5(null,null,null,null,null)
-for(u=x.hG,t=0;t<u;++t){s=t+w
-v.u(0,x.XL(s),init.metadata[x.BX(0,s)])}c.aN(0,new H.vo(v))
-C.Nm.FV(b,v.gUQ(v))
-return H.vn(y.apply(z,b))},
-gK8:function(){var z,y,x
-z=$.eb
-y=this.Ax
-if(y==null)y=J.x(null)
-x=y.constructor[z]
-if(x==null){x=H.Pq()
-y.constructor[z]=x}return x},
-oD:function(a,b,c,d){var z,y
-z=J.GL(a)
-switch(b){case 1:return z
-case 2:return H.d(z)+"="
-case 0:if(!J.de(d.gB(d),0))return H.d(z)+"*"
-y=c.length
-return H.d(z)+":"+y+":0"}throw H.b(H.Ef("Could not compute reflective name for "+H.d(z)))},
-wQ:function(a,b,c,d,e){var z,y
-z=this.gK8()
-y=z[c]
-if(y==null){y=new H.LI(a,$.I6().t(0,c),b,d,C.xD,null).ZU(this.Ax)
-z[c]=y}return y},
-tu:function(a,b,c,d){var z,y,x,w
-z=this.oD(a,b,c,d)
-if(!J.de(d.gB(d),0))return this.Z7(z,c,d)
-y=this.wQ(a,b,z,c,d)
-if(y.gpf()){if(b===0){x=this.wQ(a,1,this.oD(a,1,C.xD,C.CM),C.xD,C.CM)
-w=!x.gpf()&&!x.gIt()}else w=!1
-if(w)return this.rN(a).F2(C.Ka,c,d)
-if(b===2)a=H.YC(H.d(J.GL(a))+"=")
-return H.vn(y.Bj(this.Ax,new H.LI(a,$.I6().t(0,z),b,c,[],null)))}else return H.vn(y.Bj(this.Ax,c))},
-rN:function(a){var z,y,x,w
-$loop$0:{z=this.xq
-if(typeof z=="number"||typeof a.$p=="undefined")break $loop$0
-y=a.$p(z)
-if(typeof y=="undefined")break $loop$0
-x=y(this.Ax)
-if(x===y.v)return y.m
-else{w=H.vn(x)
-y.v=x
-y.m=w
-return w}}return this.Dm(a)},
-Dm:function(a){var z,y,x,w,v,u,t
-z=this.tu(a,1,C.xD,C.CM)
-y=J.GL(a)
-x=this.gK8()[y]
-if(x.gpf())return z
-w=this.xq
-if(typeof w=="number"){w=J.xH(w,1)
-this.xq=w
-if(!J.de(w,0))return z
-w={}
-this.xq=w}v=typeof dart_precompiled!="function"
-if(typeof a.$p=="undefined")a.$p=this.ds(y,v)
-u=x.gPi()
-t=x.geK()?this.QN(u,v):this.x0(u,v)
-w[y]=t
-t.v=t.m=w
-return z},
-ds:function(a,b){if(b)return function(c){return eval(c)}("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
-else return function(c){return function(d){return d[c]}}(a)},
-x0:function(a,b){if(!b)return function(c){return function(d){return d[c]()}}(a)
-return function(c){return eval(c)}("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},
-QN:function(a,b){var z,y
-z=J.x(this.Ax)
-if(!b)return function(c,d){return function(e){return d[c](e)}}(a,z)
-y=z.constructor.name+"$"+H.d(a)
-return function(c){return eval(c)}("(function(i) {  function "+y+"(o){return i."+H.d(a)+"(o)}  return "+y+";})")(z)},
-n:function(a,b){var z,y
-if(b==null)return!1
-if(!!J.x(b).$isiu){z=this.Ax
-y=b.Ax
-y=z==null?y==null:z===y
-z=y}else z=!1
-return z},
-giO:function(a){return J.UN(H.CU(this.Ax),909522486)},
-bu:function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},
-$isiu:true,
-$isvr:true,
-$isQF:true},
-vo:{
-"^":"Tp:359;a",
-$2:[function(a,b){var z,y
-z=J.GL(a)
-y=this.a
-if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"$2",null,4,0,null,146,[],30,[],"call"],
-$isEH:true},
-bl:{
-"^":"amu;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,yF,If",
-gOO:function(){return"ClassMirror"},
-bu:function(a){var z,y,x
-z="ClassMirror on "+H.d(this.NK.gIf().fN)
-if(this.gw8()!=null){y=z+"<"
-x=this.gw8()
-z=y+x.zV(x,", ")+">"}return z},
-gCr:function(){for(var z=this.gw8(),z=z.gA(z);z.G();)if(!J.de(z.lo,$.P8()))return H.d(this.NK.gCr())+"<"+this.EZ+">"
-return this.NK.gCr()},
-gNy:function(){return this.NK.gNy()},
-gw8:function(){var z,y,x,w,v,u,t,s
-z=this.ut
-if(z!=null)return z
-y=[]
-z=new H.tB(y)
-x=this.EZ
-if(C.xB.u8(x,"<")===-1)H.bQ(x.split(","),new H.Tc(z))
-else{for(w=x.length,v=0,u="",t=0;t<w;++t){s=x[t]
-if(s===" ")continue
-else if(s==="<"){u+=s;++v}else if(s===">"){u+=s;--v}else if(s===",")if(v>0)u+=s
-else{z.$1(u)
-u=""}else u+=s}z.$1(u)}z=H.VM(new P.Yp(y),[null])
-this.ut=z
-return z},
-gEO:function(){var z=this.qu
-if(z!=null)return z
-z=this.NK.ly(this)
-this.qu=z
-return z},
-gEz:function(){var z=this.b0
-if(z!=null)return z
-z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
-this.b0=z
-return z},
-gcc:function(){var z,y,x
-z=this.M2
-if(z!=null)return z
-y=P.L5(null,null,null,null,null)
-for(z=this.NK.ws(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
-this.M2=z
-return z},
-gQH:function(){var z=this.uA
-if(z!=null)return z
-z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.NL])
-this.uA=z
-return z},
-gYK:function(){var z,y
-z=this.Db
-if(z!=null)return z
-y=P.L5(null,null,null,P.wv,P.NL)
-y.FV(0,this.gQH())
-y.FV(0,this.gEz())
-J.kH(this.NK.gNy(),new H.Ax(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
-this.Db=z
-return z},
-rN:function(a){return this.NK.rN(a)},
-gXP:function(){return this.NK.gXP()},
-gc9:function(){return this.NK.gc9()},
-gAY:function(){var z=this.qN
-if(z!=null)return z
-z=H.Jf(this,init.metadata[J.UQ(init.typeInformation[this.NK.gCr()],0)])
-this.qN=z
-return z},
-F2:function(a,b,c){return this.NK.F2(a,b,c)},
-CI:function(a,b){return this.F2(a,b,null)},
-gHA:function(){return!1},
-gJi:function(){return this.NK},
-gkZ:function(){var z=this.qm
-if(z!=null)return z
-z=this.NK.MR(this)
-this.qm=z
-return z},
-gq4:function(){return J.co(this.NK.gIf().fN,"_")},
-gUx:function(a){var z=this.NK
-return z.gUx(z)},
-gYj:function(){return new H.cu(this.gCr(),null)},
-gIf:function(){return this.NK.gIf()},
-$isbl:true,
-$isMs:true,
-$isQF:true,
-$isX9:true,
-$isNL:true},
-tB:{
-"^":"Tp:32;a",
-$1:[function(a){var z,y,x
-z=H.BU(a,null,new H.Oo())
-y=this.a
-if(J.de(z,-1))y.push(H.jO(J.rr(a)))
-else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"$1",null,2,0,null,360,[],"call"],
-$isEH:true},
-Oo:{
-"^":"Tp:116;",
-$1:[function(a){return-1},"$1",null,2,0,null,117,[],"call"],
-$isEH:true},
-Tc:{
-"^":"Tp:116;b",
-$1:[function(a){return this.b.$1(a)},"$1",null,2,0,null,95,[],"call"],
-$isEH:true},
-Ax:{
-"^":"Tp:116;a",
-$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,361,[],"call"],
-$isEH:true},
-Wf:{
-"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
-gOO:function(){return"ClassMirror"},
-gaB:function(){var z=this.Tx
-if(H.SG(z))return z.constructor
-else return z},
-gEz:function(){var z=this.b0
-if(z!=null)return z
-z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
-this.b0=z
-return z},
-ly:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=this.gaB().prototype
-y=H.kU(z)
-x=H.VM([],[H.Zk])
-for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){v=w.lo
-if(H.Y6(v))continue
-u=$.bx().t(0,v)
-if(u==null)continue
-t=z[v]
-if(t.$reflectable==2)continue
-s=H.S5(u,t,!1,!1)
-x.push(s)
-s.jE=a}y=H.kU(init.statics[this.Cr])
-for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){r=w.lo
-if(H.Y6(r))continue
-q=this.gXP().gae()[r]
-if("$reflectable" in q){p=q.$reflectionName
-if(p==null)continue
-o=C.xB.nC(p,"new ")
-if(o){n=C.xB.yn(p,4)
-p=H.ys(n,"$",".")}}else continue
-s=H.S5(p,q,!o,o)
-x.push(s)
-s.jE=a}return x},
-gEO:function(){var z=this.qu
-if(z!=null)return z
-z=this.ly(this)
-this.qu=z
-return z},
-ws:function(a){var z,y,x,w
-z=H.VM([],[P.RY])
-y=this.H8.split(";")
-if(1>=y.length)return H.e(y,1)
-x=y[1]
-y=this.Ht
-if(y!=null){x=[x]
-C.Nm.FV(x,y)}H.jw(a,x,!1,z)
-w=init.statics[this.Cr]
-if(w!=null)H.jw(a,w["^"],!0,z)
-return z},
-gTH:function(){var z=this.zE
-if(z!=null)return z
-z=this.ws(this)
-this.zE=z
-return z},
-ghp:function(){var z=this.FU
-if(z!=null)return z
-z=H.VM(new H.Oh(H.Vv(this.gEO())),[P.wv,P.RS])
-this.FU=z
-return z},
-gF4:function(){var z=this.T1
-if(z!=null)return z
-z=H.VM(new H.Oh(H.EK(this.gEO(),this.gcc())),[P.wv,P.RS])
-this.T1=z
-return z},
-gcc:function(){var z,y,x
-z=this.M2
-if(z!=null)return z
-y=P.L5(null,null,null,null,null)
-for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
-this.M2=z
-return z},
-gQH:function(){var z=this.uA
-if(z!=null)return z
-z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
-this.uA=z
-return z},
-gYK:function(){var z,y
-z=this.Db
-if(z!=null)return z
-y=P.L5(null,null,null,P.wv,P.NL)
-z=new H.Ei(y)
-this.gQH().nb.aN(0,z)
-this.gEz().nb.aN(0,z)
-J.kH(this.gNy(),new H.Ci(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
-this.Db=z
-return z},
-Ve:function(a){var z,y
-z=this.gcc().nb.t(0,a)
-if(z!=null)return z.gFo()
-y=this.gF4().nb.t(0,a)
-return y!=null&&y.gFo()},
-rN:function(a){var z,y,x,w
-z=this.gcc().nb.t(0,a)
-if(z!=null&&z.gFo()){y=z.gcK()
-if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
-if(y in init.lazies)return H.vn($[init.lazies[y]]())
-else return H.vn($[y])}x=this.gF4().nb.t(0,a)
-if(x!=null&&x.gFo())return H.vn(x.jd(C.xD,C.CM))
-w=this.ghp().nb.t(0,a)
-if(w!=null&&w.gFo()){x=w.gdl().$getter
-if(x==null)throw H.b(P.SY(null))
-return H.vn(x())}throw H.b(P.lr(this,a,null,null,null))},
-gXP:function(){var z,y
-z=this.jE
-if(z==null){if(H.SG(this.Tx))this.jE=H.jO(C.nY.LU).gXP()
-else{z=$.vK()
-z=z.gUQ(z)
-y=new H.MH(null,J.GP(z.l6),z.T6)
-y.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()}z=this.jE
-if(z==null)throw H.b(P.w("Class \""+H.d(H.TS(this.If))+"\" has no owner"))}return z},
-gc9:function(){var z=this.xO
-if(z!=null)return z
-z=this.le
-if(z==null){z=H.pj(this.gaB().prototype)
-this.le=z}z=H.VM(new P.Yp(J.kl(z,H.Yf())),[P.vr])
-this.xO=z
-return z},
-gAY:function(){var z,y,x,w,v,u
-z=this.qN
-if(z==null){y=init.typeInformation[this.Cr]
-if(y!=null){z=H.Jf(this,init.metadata[J.UQ(y,0)])
-this.qN=z}else{z=this.H8
-x=z.split(";")
-if(0>=x.length)return H.e(x,0)
-w=x[0]
-x=J.rY(w)
-v=x.Fr(w,"+")
-u=v.length
-if(u>1){if(u!==2)throw H.b(H.Ef("Strange mixin: "+z))
-z=H.jO(v[0])
-this.qN=z}else{z=x.n(w,"")?this:H.jO(w)
-this.qN=z}}}return J.de(z,this)?null:this.qN},
-F2:function(a,b,c){var z,y
-z=this.ghp().nb.t(0,a)
-y=z==null
-if(y&&this.Ve(a))return this.rN(a).F2(C.Ka,b,c)
-if(y||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
-if(!z.tB())H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},
-CI:function(a,b){return this.F2(a,b,null)},
-gHA:function(){return!0},
-gJi:function(){return this},
-MR:function(a){var z,y
-z=init.typeInformation[this.Cr]
-y=z!=null?H.VM(new H.A8(J.Ld(z,1),new H.t0(a)),[null,null]).br(0):C.Me
-return H.VM(new P.Yp(y),[P.Ms])},
-gkZ:function(){var z=this.qm
-if(z!=null)return z
-z=this.MR(this)
-this.qm=z
-return z},
-gNy:function(){var z,y,x,w,v
-z=this.UF
-if(z!=null)return z
-y=[]
-x=this.gaB().prototype["<>"]
-if(x==null)return y
-for(w=0;w<x.length;++w){z=x[w]
-v=init.metadata[z]
-y.push(new H.cw(this,v,z,null,H.YC(J.O6(v))))}z=H.VM(new P.Yp(y),[null])
-this.UF=z
-return z},
-gw8:function(){return C.hU},
-gYj:function(){if(!J.de(J.q8(this.gNy()),0))throw H.b(P.f("Declarations of generics have no reflected type"))
-return new H.cu(this.Cr,null)},
-$isWf:true,
-$isMs:true,
-$isQF:true,
-$isX9:true,
-$isNL:true},
-vk:{
-"^":"EE+M2;",
-$isQF:true},
-Ei:{
-"^":"Tp:358;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
-$isEH:true},
-Ci:{
-"^":"Tp:116;b",
-$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,361,[],"call"],
-$isEH:true},
-t0:{
-"^":"Tp:362;a",
-$1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,334,[],"call"],
-$isEH:true},
-XJ:{
-"^":"amu;cK<,V5>,Fo<,n6,jE,Ay>,le,If",
-gOO:function(){return"VariableMirror"},
-gt5:function(a){return H.Jf(this.jE,init.metadata[this.Ay])},
-gXP:function(){return this.jE},
-gc9:function(){var z=this.le
-if(z==null){z=this.n6
-z=z==null?C.xD:z()
-this.le=z}return J.qA(J.kl(z,H.Yf()))},
-IB:function(a){return $[this.cK]},
-$isRY:true,
-$isNL:true,
-$isQF:true,
-static:{pS:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o
-z=J.uH(a,"-")
-y=z.length
-if(y===1)return
-if(0>=y)return H.e(z,0)
-x=z[0]
-y=J.U6(x)
-w=y.gB(x)
-v=J.Wx(w)
-u=H.GQ(y.j(x,v.W(w,1)))
-if(u===0)return
-t=C.jn.GG(u,2)===0
-s=y.Nj(x,0,v.W(w,1))
-r=y.u8(x,":")
-if(r>0){q=C.xB.Nj(s,0,r)
-s=y.yn(x,r+1)}else q=s
-p=d?$.Sl().t(0,q):$.bx().t(0,"g"+q)
-if(p==null)p=q
-if(t){o=H.YC(H.d(p)+"=")
-y=c.gEO()
-v=new H.a7(y,y.length,0,null)
-v.$builtinTypeInfo=[H.Kp(y,0)]
-for(;t=!0,v.G();)if(J.de(v.lo.gIf(),o)){t=!1
-break}}if(1>=z.length)return H.e(z,1)
-return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
-if(a>=123&&a<=126)return a-117
-if(a>=37&&a<=43)return a-27
-return 0},"$1","Na",2,0,null,154,[]]}},
-Sz:{
-"^":"iu;Ax,xq",
-gMj:function(a){var z,y,x,w,v,u,t,s
-z=$.te
-y=this.Ax
-x=function(b){for(var r in b){if("$"==r.substring(0,1)&&r[1]>='0'&&r[1]<='9')return r}return null}(y)
-if(x==null)throw H.b(H.Ef("Cannot find callName on \""+H.d(y)+"\""))
-w=x.split("$")
-if(1>=w.length)return H.e(w,1)
-v=H.BU(w[1],null,null)
-w=J.x(y)
-if(!!w.$isv){u=y.gjm()
-H.eZ(y)
-t=$.bx().t(0,w.gRA(y))
-if(t==null)H.Hz(t)
-s=H.S5(t,u,!1,!1)}else s=new H.Zk(y[x],v,!1,!1,!0,!1,!1,null,null,null,null,H.YC(x))
-y.constructor[z]=s
-return s},
-bu:function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},
-$isvr:true,
-$isQF:true},
-Zk:{
-"^":"amu;dl<,Yq,lT<,hB<,Fo<,xV<,qx,jE,le,wM,H3,If",
-gOO:function(){return"MethodMirror"},
-gMP:function(){var z=this.H3
-if(z!=null)return z
-this.gc9()
-return this.H3},
-tB:function(){return"$reflectable" in this.dl},
-gXP:function(){return this.jE},
-gdw:function(){this.gc9()
-return this.wM},
-gc9:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h
-z=this.le
-if(z==null){z=this.dl
-y=H.pj(z)
-x=this.Yq
-if(typeof x!=="number")return H.s(x)
-w=Array(x)
-v=H.zh(z)
-if(v!=null){u=v.AM
-if(typeof u==="number"&&Math.floor(u)===u)t=new H.Ar(v.hl(null),null,null,null,this)
-else{z=this.gXP()
-t=z!=null&&!!J.x(z).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
-else this.wM=t.gdw()
-s=v.Mo
-for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.Rv,q=v.Rn,p=v.hG,o=0;z.G();o=h){n=z.lo
-m=v.XL(o)
-l=q[2*o+p+3+1]
-k=J.RE(n)
-if(o<r)j=new H.fu(this,k.gAy(n),!1,!1,null,l,H.YC(m))
-else{i=v.BX(0,o)
-j=new H.fu(this,k.gAy(n),!0,s,i,l,H.YC(m))}h=o+1
-if(o>=x)return H.e(w,o)
-w[o]=j}}this.H3=H.VM(new P.Yp(w),[P.Ys])
-z=H.VM(new P.Yp(J.kl(y,H.Yf())),[null])
-this.le=z}return z},
-jd:function(a,b){if(b!=null&&!J.de(b.gB(b),0))throw H.b(P.f("Named arguments are not implemented."))
-if(!this.Fo&&!this.xV)throw H.b(H.Ef("Cannot invoke instance method without receiver."))
-if(!J.de(this.Yq,a.length)||this.dl==null)throw H.b(P.lr(this.gXP(),this.If,a,b,null))
-return this.dl.apply($,P.F(a,!0,null))},
-IB:function(a){if(this.lT)return this.jd([],null)
-else throw H.b(P.SY("getField on "+a.bu(0)))},
-guU:function(){return!this.lT&&!this.hB&&!this.xV},
-$isZk:true,
-$isRS:true,
-$isNL:true,
-$isQF:true,
-static:{S5:function(a,b,c,d){var z,y,x,w,v,u,t
-z=a.split(":")
-if(0>=z.length)return H.e(z,0)
-a=z[0]
-y=H.BF(a)
-x=!y&&J.Eg(a,"=")
-w=z.length
-if(w===1){if(x){v=1
-u=!1}else{v=0
-u=!0}t=0}else{if(1>=w)return H.e(z,1)
-v=H.BU(z[1],null,null)
-if(2>=z.length)return H.e(z,2)
-t=H.BU(z[2],null,null)
-u=!1}w=H.YC(a)
-return new H.Zk(b,J.WB(v,t),u,x,c,d,y,null,null,null,null,w)}}},
-fu:{
-"^":"amu;XP<,Ay>,Q2<,Sh,BE,QY,If",
-gOO:function(){return"ParameterMirror"},
-gt5:function(a){return H.Jf(this.XP,this.Ay)},
-gFo:function(){return!1},
-gV5:function(a){return!1},
-gc9:function(){return J.qA(J.kl(this.QY,new H.wt()))},
-$isYs:true,
-$isRY:true,
-$isNL:true,
-$isQF:true},
-wt:{
-"^":"Tp:363;",
-$1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,334,[],"call"],
-$isEH:true},
-ng:{
-"^":"amu;Cr<,CM,If",
-gP:function(a){return this.CM},
-gOO:function(){return"TypedefMirror"},
-gYj:function(){return H.vh(P.SY(null))},
-gJi:function(){return H.vh(P.SY(null))},
-gXP:function(){return H.vh(P.SY(null))},
-gc9:function(){return H.vh(P.SY(null))},
-$isrN:true,
-$isX9:true,
-$isNL:true,
-$isQF:true},
-TN:{
-"^":"a;",
-gYj:function(){return H.vh(P.SY(null))},
-gAY:function(){return H.vh(P.SY(null))},
-gkZ:function(){return H.vh(P.SY(null))},
-gYK:function(){return H.vh(P.SY(null))},
-F2:function(a,b,c){return H.vh(P.SY(null))},
-CI:function(a,b){return this.F2(a,b,null)},
-rN:function(a){return H.vh(P.SY(null))},
-gNy:function(){return H.vh(P.SY(null))},
-gw8:function(){return H.vh(P.SY(null))},
-gJi:function(){return H.vh(P.SY(null))},
-gIf:function(){return H.vh(P.SY(null))},
-gUx:function(a){return H.vh(P.SY(null))},
-gq4:function(){return H.vh(P.SY(null))},
-gc9:function(){return H.vh(P.SY(null))}},
-Ar:{
-"^":"TN;d9,o3,yA,zM,XP<",
-gHA:function(){return!0},
-gdw:function(){var z=this.yA
-if(z!=null)return z
-z=this.d9
-if(!!z.void){z=$.oj()
-this.yA=z
-return z}if(!("ret" in z)){z=$.P8()
-this.yA=z
-return z}z=H.Jf(this.XP,z.ret)
-this.yA=z
-return z},
-gMP:function(){var z,y,x,w,v,u
-z=this.zM
-if(z!=null)return z
-y=[]
-z=this.d9
-if("args" in z)for(x=z.args,x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]),w=0;x.G();w=v){v=w+1
-y.push(new H.fu(this,x.lo,!1,!1,null,C.iH,H.YC("argument"+w)))}else w=0
-if("opt" in z)for(x=z.opt,x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();w=v){v=w+1
-y.push(new H.fu(this,x.lo,!1,!1,null,C.iH,H.YC("argument"+w)))}if("named" in z)for(x=H.kU(z.named),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){u=x.lo
-y.push(new H.fu(this,z.named[u],!1,!1,null,C.iH,H.YC(u)))}z=H.VM(new P.Yp(y),[P.Ys])
-this.zM=z
-return z},
-bu:function(a){var z,y,x,w,v,u
-z=this.o3
-if(z!=null)return z
-z=this.d9
-if("args" in z)for(y=z.args,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x="FunctionTypeMirror on '(",w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,H.Ko(v,null))}else{x="FunctionTypeMirror on '("
-w=""}if("opt" in z){x+=w+"["
-for(y=z.opt,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,H.Ko(v,null))}x+="]"}if("named" in z){x+=w+"{"
-for(y=H.kU(z.named),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){u=y.lo
-x=C.xB.g(x+w+(H.d(u)+": "),H.Ko(z.named[u],null))}x+="}"}x+=") -> "
-if(!!z.void)x+="void"
-else x="ret" in z?C.xB.g(x,H.Ko(z.ret,null)):x+"dynamic"
-z=x+"'"
-this.o3=z
-return z},
-gah:function(){return H.vh(P.SY(null))},
-V7:function(a,b){return this.gah().$2(a,b)},
-nQ:function(a){return this.gah().$1(a)},
-$isMs:true,
-$isQF:true,
-$isX9:true,
-$isNL:true},
-rh:{
-"^":"Tp:364;a",
-$1:[function(a){var z,y,x
-z=init.metadata[a]
-y=this.a
-x=H.w2(y.a.gNy(),J.O6(z))
-return J.UQ(y.a.gw8(),x)},"$1",null,2,0,null,15,[],"call"],
-$isEH:true},
-iW:{
-"^":"Tp:121;b",
-$1:[function(a){var z,y
-z=this.b.$1(a)
-y=J.x(z)
-if(!!y.$iscw)return H.d(z.Nz)
-if(!y.$isWf&&!y.$isbl)if(y.n(z,$.P8()))return"dynamic"
-else if(y.n(z,$.oj()))return"void"
-else return"dynamic"
-return z.gCr()},"$1",null,2,0,null,15,[],"call"],
-$isEH:true},
-ye:{
-"^":"Tp:363;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,334,[],"call"],
-$isEH:true},
-O1:{
-"^":"Tp:363;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,334,[],"call"],
-$isEH:true},
-Oh:{
-"^":"a;nb",
-gB:function(a){return this.nb.X5},
-gl0:function(a){return this.nb.X5===0},
-gor:function(a){return this.nb.X5!==0},
-t:function(a,b){return this.nb.t(0,b)},
-x4:function(a){return this.nb.x4(a)},
-di:function(a){return this.nb.di(a)},
-aN:function(a,b){return this.nb.aN(0,b)},
-gvc:function(){var z=this.nb
-return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gUQ:function(a){var z=this.nb
-return z.gUQ(z)},
-u:function(a,b,c){return H.kT()},
-FV:function(a,b){return H.kT()},
-Rz:function(a,b){H.kT()},
-V1:function(a){return H.kT()},
-$isZ0:true,
-static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","lY",0,0,null]}}}],["dart._js_names","dart:_js_names",,H,{
-"^":"",
-hY:[function(a,b){var z,y,x,w,v,u,t
-z=H.kU(a)
-y=P.Fl(J.O,J.O)
-for(x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),w=!b;x.G();){v=x.lo
-u=a[v]
-y.u(0,v,u)
-if(w){t=J.rY(v)
-if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"$2","Il",4,0,null,160,[],161,[]],
-YK:[function(a){var z=P.Fl(J.O,J.O)
-a.aN(0,new H.Xh(z))
-return z},"$1","OX",2,0,null,162,[]],
-kU:[function(a){var z=H.VM(function(b,c){var y=[]
+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},"$1","DF",2,0,null,158,[]],
-Xh:{
-"^":"Tp:366;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,149,[],365,[],"call"],
-$isEH:true}}],["dart.async","dart:async",,P,{
+return z}}],["dart.async","dart:async",,P,{
 "^":"",
-Oj:[function(){if($.jk().scheduleImmediate!=null)return P.Sx()
-return P.K7()},"$0","n9",0,0,null],
+C2:function(){if($.jk().scheduleImmediate!=null)return P.vd()
+return P.a3()},
 ZV:[function(a){++init.globalState.Xz.GL
-$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","Sx",2,0,163,164,[]],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,163,164,[]],
-VH:[function(a,b){var z=H.N7()
+$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,16],
+Hk:[function(a){P.jL(C.ny,a)},"$1","a3",2,0,16],
+VH:function(a,b){var z=H.G3()
 z=H.KT(z,[z,z]).BD(a)
-if(z)return b.O8(a)
-else return b.cR(a)},"$2","zZ",4,0,null,165,[],166,[]],
-e4:function(a,b){var z=P.Dt(b)
-P.rT(C.ny,new P.ZC(a,z))
+if(z){b.toString
+return a}else{b.toString
+return a}},
+Iw:function(a,b){var z=P.Dt(b)
+P.ww(C.ny,new P.w4(a,z))
 return z},
-Cx:[function(){var z=$.S6
+Cx:function(){var z=$.S6
 for(;z!=null;){J.cG(z)
 z=z.gaw()
-$.S6=z}$.k8=null},"$0","BN",0,0,null],
+$.S6=z}$.k8=null},
 BG:[function(){var z
 try{P.Cx()}catch(z){H.Ru(z)
-$.ej().$1(P.qZ())
+$.ej().$1(P.rh())
 $.S6=$.S6.gaw()
-throw z}},"$0","qZ",0,0,126],
-IA:[function(a){var z,y
+throw z}},"$0","rh",0,0,15],
+IA:function(a){var z,y
 z=$.k8
 if(z==null){z=new P.OM(a,null)
 $.k8=z
 $.S6=z
-$.ej().$1(P.qZ())}else{y=new P.OM(a,null)
+$.ej().$1(P.rh())}else{y=new P.OM(a,null)
 z.aw=y
-$.k8=y}},"$1","e6",2,0,null,164,[]],
-rb:[function(a){var z
-if(J.de($.X3,C.NU)){$.X3.wr(a)
-return}z=$.X3
-z.wr(z.xi(a,!0))},"$1","Rf",2,0,null,164,[]],
+$.k8=y}},
+rb:function(a){var z=$.X3
+if(z===C.NU){z.toString
+P.Tk(z,null,z,a)
+return}P.Tk(z,null,z,z.xi(a,!0))},
 bK:function(a,b,c,d){var z
-if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
+if(c){z=H.VM(new P.zW(b,a,0,null,null,null,null),[d])
 z.SJ=z
-z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
+z.iE=z}else{z=H.VM(new P.HX(b,a,0,null,null,null,null),[d])
 z.SJ=z
 z.iE=z}return z},
-ot:[function(a){var z,y,x,w,v
+ot:function(a){var z,y,x,w,v
 if(a==null)return
 try{z=a.$0()
 if(!!J.x(z).$isb8)return z
 return}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
-$.X3.hk(y,x)}},"$1","DC",2,0,null,168,[]],
-YE:[function(a){},"$1","bZ",2,0,169,30,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,170,85,171,[],172,[]],
-dL:[function(){},"$0","v3",0,0,126],
-FE:[function(a,b,c){var z,y,x,w
+x=new H.oP(w,null)
+v=$.X3
+v.toString
+P.CK(v,null,v,y,x)}},
+YE:[function(a){},"$1","bZ",2,0,17,18],
+XH:[function(a,b){var z=$.X3
+z.toString
+P.CK(z,null,z,a,b)},function(a){return P.XH(a,null)},null,"$2","$1","vD",2,2,19,20,21,22],
+dL:[function(){},"$0","v3",0,0,15],
+FE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
-c.$2(z,y)}},"$3","mc",6,0,null,173,[],174,[],175,[]],
-NX:[function(a,b,c,d){a.ed()
-b.K5(c,d)},"$4","QD",8,0,null,176,[],177,[],171,[],172,[]],
-TB:[function(a,b){return new P.uR(a,b)},"$2","cH",4,0,null,176,[],177,[]],
-Bb:[function(a,b,c){a.ed()
-b.rX(c)},"$3","E1",6,0,null,176,[],177,[],30,[]],
-rT:function(a,b){var z
-if(J.de($.X3,C.NU))return $.X3.uN(a,b)
-z=$.X3
-return z.uN(a,z.xi(b,!0))},
-jL:[function(a,b){var z=a.gVs()
-return H.cy(z<0?0:z,b)},"$2","et",4,0,null,178,[],164,[]],
-PJ:[function(a){var z=$.X3
+y=new H.oP(x,null)
+c.$2(z,y)}},
+NX:function(a,b,c,d){a.ed()
+b.K5(c,d)},
+TB:function(a,b){return new P.uR(a,b)},
+Bb:function(a,b,c){a.ed()
+b.rX(c)},
+ww:function(a,b){var z=$.X3
+if(z===C.NU){z.toString
+return P.h8(z,null,z,a,b)}return P.h8(z,null,z,a,z.xi(b,!0))},
+jL:function(a,b){var z=C.CD.cU(a.Fq,1000)
+return H.cy(z<0?0:z,b)},
+Us:function(a){var z=$.X3
 $.X3=a
-return z},"$1","kb",2,0,null,166,[]],
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","Gx",10,0,179,180,[],181,[],166,[],171,[],172,[]],
-T8:[function(a,b,c,d){var z,y
-if(J.de($.X3,c))return d.$0()
-z=P.PJ(c)
+return z},
+CK:function(a,b,c,d,e){P.T8(a,null,a,new P.FO(d,e))},
+T8:function(a,b,c,d){var z,y
+if($.X3===c)return d.$0()
+z=P.Us(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","AI",8,0,182,180,[],181,[],166,[],128,[]],
-V7:[function(a,b,c,d,e){var z,y
-if(J.de($.X3,c))return d.$1(e)
-z=P.PJ(c)
+return y}finally{$.X3=z}},
+V7:function(a,b,c,d,e){var z,y
+if($.X3===c)return d.$1(e)
+z=P.Us(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,183,180,[],181,[],166,[],128,[],184,[]],
-Qx:[function(a,b,c,d,e,f){var z,y
-if(J.de($.X3,c))return d.$2(e,f)
-z=P.PJ(c)
+return y}finally{$.X3=z}},
+BD:function(a,b,c,d,e,f){var z,y
+if($.X3===c)return d.$2(e,f)
+z=P.Us(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","l4",12,0,185,180,[],181,[],166,[],128,[],60,[],61,[]],
-Ee:[function(a,b,c,d){return d},"$4","EU",8,0,186,180,[],181,[],166,[],128,[]],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,187,180,[],181,[],166,[],128,[]],
-VI:[function(a,b,c,d){return d},"$4","uu",8,0,188,180,[],181,[],166,[],128,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,189,180,[],181,[],166,[],128,[]],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,190,180,[],181,[],166,[],178,[],164,[]],
-XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,191,180,[],181,[],166,[],192,[]],
-CI:[function(a){J.O2($.X3,a)},"$1","Ib",2,0,193,192,[]],
-UA:[function(a,b,c,d,e){var z
-$.oK=P.Ib()
-z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","hn",10,0,194,180,[],181,[],166,[],195,[],196,[]],
+return y}finally{$.X3=z}},
+Tk:function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},
+h8:function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},
 C6:{
-"^":"Tp:115;a",
-$0:[function(){H.ox()
+"^":"Xs:42;a",
+$0:[function(){H.cv()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 Ca:{
 "^":"a;kc>,I4<",
-$isGe:true},
+$isXS:true},
 Ik:{
 "^":"O9;Y8"},
-JI:{
-"^":"yU;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,Ri",
+f6:{
+"^":"oh;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,Ri",
 gY8:function(){return this.Y8},
 uR:function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
@@ -4370,17 +4462,16 @@
 gHj:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,126],
-LP:[function(){},"$0","gZ9",0,0,126],
-static:{"^":"FJ,RG,cP"}},
-WVu:{
+uO:[function(){},"$0","gp4",0,0,15],
+LP:[function(){},"$0","gZ9",0,0,15],
+static:{"^":"FJ,H6,id"}},
+WV:{
 "^":"a;iE@,SJ@",
-gRW:function(){return!1},
-gP4:function(){return(this.Gv&2)!==0},
-SL:function(){var z=this.Ip
+gUF:function(){return!1},
+im:function(){var z=this.yx
 if(z!=null)return z
 z=P.Dt(null)
-this.Ip=z
+this.yx=z
 return z},
 p1:function(a){var z,y
 z=a.gSJ()
@@ -4396,20 +4487,20 @@
 q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},248,[]],
-fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,367,85,171,[],172,[]],
-cO:function(a){var z,y
+this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WV")},74],
+zw:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
+this.NA(a,b)},function(a){return this.zw(a,null)},"JT","$2","$1","gGj",2,2,75,20,21,22],
+xO:function(a){var z,y
 z=this.Gv
-if((z&4)!==0)return this.Ip
+if((z&4)!==0)return this.yx
 if(z>=4)throw H.b(this.q7())
 this.Gv=z|4
-y=this.SL()
-this.SY()
+y=this.im()
+this.Pl()
 return y},
-Rg:function(a,b){this.Iv(b)},
-V8:function(a,b){this.pb(a,b)},
-Qj:function(){var z=this.WX
+Rg:function(a){this.Iv(a)},
+V8:function(a,b){this.NA(a,b)},
+YB:function(){var z=this.WX
 this.WX=null
 this.Gv&=4294967287
 C.jN.tZ(z)},
@@ -4433,76 +4524,76 @@
 y=w}else y=y.giE()
 this.Gv&=4294967293
 if(this.iE===this)this.Of()},
-Of:function(){if((this.Gv&4)!==0&&this.Ip.Gv===0)this.Ip.OH(null)
+Of:function(){if((this.Gv&4)!==0&&this.yx.Gv===0)this.yx.OH(null)
 P.ot(this.QC)}},
-dz:{
-"^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
+zW:{
+"^":"WV;nL,QC,Gv,iE,SJ,WX,yx",
 Iv:function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.Gv|=2
-this.iE.Rg(0,a)
+this.iE.Rg(a)
 this.Gv&=4294967293
 if(this.iE===this)this.Of()
 return}this.nE(new P.tK(this,a))},
-pb:function(a,b){if(this.iE===this)return
+NA:function(a,b){if(this.iE===this)return
 this.nE(new P.OR(this,a,b))},
-SY:function(){if(this.iE!==this)this.nE(new P.Bg(this))
-else this.Ip.OH(null)}},
+Pl:function(){if(this.iE!==this)this.nE(new P.eB(this))
+else this.yx.OH(null)}},
 tK:{
-"^":"Tp;a,b",
-$1:[function(a){a.Rg(0,this.b)},"$1",null,2,0,null,176,[],"call"],
+"^":"Xs;a,b",
+$1:function(a){a.Rg(this.b)},
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
+$signature:function(){return H.IG(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
 OR:{
-"^":"Tp;a,b,c",
-$1:[function(a){a.V8(this.b,this.c)},"$1",null,2,0,null,176,[],"call"],
+"^":"Xs;a,b,c",
+$1:function(a){a.V8(this.b,this.c)},
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
-Bg:{
-"^":"Tp;a",
-$1:[function(a){a.Qj()},"$1",null,2,0,null,176,[],"call"],
+$signature:function(){return H.IG(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
+eB:{
+"^":"Xs;a",
+$1:function(a){a.YB()},
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"WhE",args:[[P.JI,a]]}},this.a,"dz")}},
-DL:{
-"^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
+$signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.f6,a]]}},this.a,"zW")}},
+HX:{
+"^":"WV;nL,QC,Gv,iE,SJ,WX,yx",
 Iv:function(a){var z,y
-for(z=this.iE;z!==this;z=z.giE()){y=new P.LV(a,null)
+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.DS(a,b,null))},
-SY:function(){var z=this.iE
-if(z!==this)for(;z!==this;z=z.giE())z.w6(C.Wj)
-else this.Ip.OH(null)}},
+z.VI(y)}},
+NA:function(a,b){var z
+for(z=this.iE;z!==this;z=z.giE())z.VI(new P.WG(a,b,null))},
+Pl:function(){var z=this.iE
+if(z!==this)for(;z!==this;z=z.giE())z.VI(C.Wj)
+else this.yx.OH(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
-ZC:{
-"^":"Tp:115;a,b",
+w4:{
+"^":"Xs:42;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 Pf0:{
 "^":"a;"},
 Zf:{
 "^":"Pf0;MM",
-oo:[function(a,b){var z=this.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.oo(a,null)},"tZ","$1","$0","gv6",0,2,368,85,30,[]],
+z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,76,20,18],
 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,367,85,171,[],172,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"rC","$2","$1","gYJ",2,2,75,20,21,22]},
 vs:{
 "^":"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
+snc: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},
@@ -4510,20 +4601,23 @@
 gIa:function(){return this.Gv===2?null:this.o4},
 Rx:function(a,b){var z,y
 z=$.X3
-y=H.VM(new P.vs(0,z,null,null,z.cR(a),null,P.VH(b,$.X3),null),[null])
+z.toString
+y=H.VM(new P.vs(0,z,null,null,a,null,P.VH(b,z),null),[null])
 this.au(y)
 return y},
 ml:function(a){return this.Rx(a,null)},
-yd:function(a,b){var z,y,x
+co:function(a,b){var z,y,x
 z=$.X3
 y=P.VH(a,z)
-x=H.VM(new P.vs(0,z,null,null,null,$.X3.cR(b),y,null),[null])
+$.X3.toString
+x=H.VM(new P.vs(0,z,null,null,null,b,y,null),[null])
 this.au(x)
 return x},
-OA:function(a){return this.yd(a,null)},
-YM:function(a){var z,y
+OA:function(a){return this.co(a,null)},
+wM:function(a){var z,y
 z=$.X3
-y=new P.vs(0,z,null,null,null,null,null,z.Al(a))
+z.toString
+y=new P.vs(0,z,null,null,null,null,null,a)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 this.au(y)
 return y},
@@ -4533,8 +4627,10 @@
 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)
+au:function(a){var z
+if(this.Gv>=4){z=this.Lj
+z.toString
+P.Tk(z,null,z,new P.da(this,a))}else{a.sBQ(this.jk)
 this.jk=a}},
 L3:function(){var z,y,x
 z=this.jk
@@ -4553,372 +4649,350 @@
 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,170,85,171,[],172,[]],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,19,20,21,22],
 OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isvs){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.rH(this,a))}else P.A9(a,this)}else P.k3(a,this)
+z=this.Lj
+z.toString
+P.Tk(z,null,z,new P.eX(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.cX(this,a))},
-CG:function(a,b){if(this.Gv!==0)H.vh(P.w("Future already completed"))
+z=this.Lj
+z.toString
+P.Tk(z,null,z,new P.pZ(this,a))},
+CG:function(a,b){var z
+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)},
+z=this.Lj
+z.toString
+P.Tk(z,null,z,new P.In(this,a,b))},
 L7:function(a,b){this.OH(a)},
+X8:function(a,b,c){this.CG(a,b)},
 $isvs:true,
 $isb8:true,
-static:{"^":"ewM,JE,C3n,oN1,NK",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
+static:{"^":"ewM,JE,C3n,Xh,NKU",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},PG:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
 z.L7(a,b)
 return z},Vu:function(a,b,c){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
-return z},k3:[function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},"$2","KP",4,0,null,33,[],82,[]],A9:[function(a,b){b.swG(!0)
+return z},k3:function(a,b){b.snc(!0)
+a.Rx(new P.pV(b),new P.U7(b))},A9:function(a,b){b.snc(!0)
 if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},"$2","dd",4,0,null,33,[],82,[]],yE:[function(a,b){var z
+else a.au(b)},yE:function(a,b){var z
 do{z=b.gBQ()
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"$2","cN",4,0,null,33,[],167,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
+continue}else break}while(!0)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 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())
+y=z.e.gLj()
+x=J.w8(v)
+u=v.gI4()
+y.toString
+P.CK(y,null,y,x,u)
 return}if(b==null)return
 if(b.gBQ()!=null){P.yE(z.e,b)
 return}x.b=!0
-u=z.e.gWj()?z.e.gDL():null
-x.c=u
+t=z.e.gWj()?z.e.gDL():null
+x.c=t
 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())
-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(s!=null)$.X3=s
+if(!y||b.gO1()!=null||b.gIa()!=null){s=b.gLj()
+if(w){u=z.e.gLj()
+u.toString
+s.toString
+u=s==null?u!=null:s!==u}else u=!1
+if(u){v=z.e.gcG()
+y=z.e.gLj()
+x=J.w8(v)
+u=v.gI4()
+y.toString
+P.CK(y,null,y,x,u)
+return}r=$.X3
+if(r==null?s!=null:r!==s)$.X3=s
+else r=null
+if(y){if(b.gO1()!=null)x.b=new P.rq(x,b,t,s).$0()}else new P.RW(z,x,b,s).$0()
+if(b.gIa()!=null)new P.RT(z,x,w,b,s).$0()
+if(r!=null)$.X3=r
 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).$isvs)if(r.Gv>=4){b.swG(!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()
+y=(t==null?y!=null:t!==y)&&!!J.x(y).$isb8}else y=!1
+if(y){q=x.c
+if(!!J.x(q).$isvs)if(q.Gv>=4){b.snc(!0)
+z.e=q
+y=q
+continue}else P.A9(q,b)
+else P.k3(q,b)
+return}}if(x.b===!0){p=b.L3()
+b.Am(x.c)}else{p=b.L3()
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=q}},"$2","XX",4,0,null,33,[],167,[]]}},
+b=p}}}},
 da:{
-"^":"Tp:115;a,b",
+"^":"Xs:42;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 pV:{
-"^":"Tp:116;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,30,[],"call"],
+"^":"Xs:10;a",
+$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,18,"call"],
 $isEH:true},
 U7:{
-"^":"Tp:369;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
+"^":"Xs:77;b",
+$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,20,21,22,"call"],
 $isEH:true},
-rH:{
-"^":"Tp:115;a,b",
+eX:{
+"^":"Xs:42;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
-cX:{
-"^":"Tp:115;c,d",
+pZ:{
+"^":"Xs:42;c,d",
 $0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
-ZL:{
-"^":"Tp:115;a,b,c",
+In:{
+"^":"Xs:42;a,b,c",
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:307;b,d,e,f",
-$0:[function(){var z,y,x,w
-try{this.b.c=this.f.FI(this.d.gO1(),this.e)
-return!0}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
+"^":"Xs:78;b,d,e,f",
+$0:function(){var z,y,x,w,v
+try{x=this.f
+w=this.d.gO1()
+x.toString
+this.b.c=P.V7(x,null,x,w,this.e)
+return!0}catch(v){x=H.Ru(v)
+z=x
+y=new H.oP(v,null)
 this.b.c=new P.Ca(z,y)
-return!1}},"$0",null,0,0,null,"call"],
+return!1}},
 $isEH:true},
 RW:{
-"^":"Tp:126;c,b,UI,bK",
-$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+"^":"Xs:15;c,b,UI,bK",
+$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
 r=this.UI
 y=r.gyK()
 x=!0
-if(y!=null)try{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
+if(y!=null)try{q=this.bK
+p=J.w8(z)
+q.toString
+x=P.V7(q,null,q,y,p)}catch(o){r=H.Ru(o)
 w=r
-v=new H.XO(q,null)
+v=new H.oP(o,null)
 r=J.w8(z)
-p=w
-o=(r==null?p==null:r===p)?z:new P.Ca(w,v)
+q=w
+n=(r==null?q==null:r===q)?z:new P.Ca(w,v)
 r=this.b
-r.c=o
+r.c=n
 r.b=!1
 return}u=r.go7()
 if(x===!0&&u!=null){try{r=u
-p=H.N7()
-p=H.KT(p,[p,p]).BD(r)
-n=this.bK
+q=H.G3()
+q=H.KT(q,[q,q]).BD(r)
+p=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)
+if(q){r=J.w8(z)
+q=z.gI4()
+p.toString
+m.c=P.BD(p,null,p,u,r,q)}else{r=J.w8(z)
+p.toString
+m.c=P.V7(p,null,p,u,r)}}catch(o){r=H.Ru(o)
 t=r
-s=new H.XO(q,null)
+s=new H.oP(o,null)
 r=J.w8(z)
-p=t
-o=(r==null?p==null:r===p)?z:new P.Ca(t,s)
+q=t
+n=(r==null?q==null:r===q)?z:new P.Ca(t,s)
 r=this.b
-r.c=o
+r.c=n
 r.b=!1
 return}this.b.b=!0}else{r=this.b
 r.c=z
-r.b=!1}},"$0",null,0,0,null,"call"],
+r.b=!1}},
 $isEH:true},
 RT:{
-"^":"Tp:126;c,b,Gq,Rm,w3",
-$0:[function(){var z,y,x,w,v,u
+"^":"Xs:15;c,b,IU,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)
-y=v
-x=new H.XO(w,null)
-if(this.Gq){v=J.w8(this.c.e.gcG())
-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()
-else u.c=new P.Ca(y,x)
-u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
-v.swG(!0)
+try{w=this.w3
+v=this.Rm.gIa()
+w.toString
+z.a=P.T8(w,null,w,v)}catch(u){w=H.Ru(u)
+y=w
+x=new H.oP(u,null)
+if(this.IU){w=J.w8(this.c.e.gcG())
+v=y
+v=w==null?v==null:w===v
+w=v}else w=!1
+v=this.b
+if(w)v.c=this.c.e.gcG()
+else v.c=new P.Ca(y,x)
+v.b=!1}if(!!J.x(z.a).$isb8){w=this.Rm
+w.snc(!0)
 this.b.d=!0
-z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"$0",null,0,0,null,"call"],
+z.a.Rx(new P.jZ(this.c,w),new P.FZ(z,w))}},
 $isEH:true},
 jZ:{
-"^":"Tp:116;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,370,[],"call"],
+"^":"Xs:10;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,79,"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:369;a,mG",
+"^":"Xs:77;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isvs){y=P.Dt(null)
 z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,20,21,22,"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
-qh:{
+cb:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")},371,[]],
-Ft:[function(a,b){return H.VM(new P.aW(b,this),[H.ip(this,"qh",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.qh,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"qh")},371,[]],
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.cb,args:[{func:"Pw",args:[a]}]}},this.$receiver,"cb")},80],
+Ft:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"cb",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.cb,args:[{func:"Xy",ret:P.cX,args:[a]}]}},this.$receiver,"cb")},80],
 tg:function(a,b){var z,y
 z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.YJ(y),y.gaq())
+z.a=this.KR(new P.tG(z,this,b,y),!0,new P.kb(y),y.gaq())
 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.ib(y),y.gaq())
 return y},
 Vr:function(a,b){var z,y
 z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gaq())
+z.a=this.KR(new P.Ee(z,this,b,y),!0,new P.Ia(y),y.gaq())
 return y},
 gB:function(a){var z,y
 z={}
-y=P.Dt(J.bU)
+y=P.Dt(P.KN)
 z.a=0
-this.KR(new P.B5(z),!0,new P.PI(z,y),y.gaq())
+this.KR(new P.uO(z),!0,new P.hh(z,y),y.gaq())
 return y},
 gl0:function(a){var z,y
 z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.j4(z,y),!0,new P.i9(y),y.gaq())
-return y},
-br:function(a){var z,y
-z=H.VM([],[H.ip(this,"qh",0)])
-y=P.Dt([J.Q,H.ip(this,"qh",0)])
-this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gaq())
-return y},
-qZ:function(a,b){var z=H.VM(new P.Zz(b,this),[null])
-z.K6(this,b,null)
-return z},
-eR:function(a,b){var z=H.VM(new P.dq(b,this),[null])
-z.U6(this,b,null)
-return z},
-gtH:function(a){var z,y
-z={}
-y=P.Dt(H.ip(this,"qh",0))
-z.a=null
-z.a=this.KR(new P.lU(z,this,y),!0,new P.OC(y),y.gaq())
+z.a=this.KR(new P.qg(z,y),!0,new P.yB(y),y.gaq())
 return y},
 grZ:function(a){var z,y
 z={}
-y=P.Dt(H.ip(this,"qh",0))
+y=P.Dt(H.ip(this,"cb",0))
 z.a=null
 z.b=!1
 this.KR(new P.UH(z,this),!0,new P.Z5(z,y),y.gaq())
 return y},
-Zv:function(a,b){var z,y
-z={}
-z.a=b
-if(typeof b!=="number"||Math.floor(b)!==b||J.u6(b,0))throw H.b(P.u(z.a))
-y=P.Dt(H.ip(this,"qh",0))
-z.b=null
-z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gaq())
-return y},
-$isqh:true},
-Sd:{
-"^":"Tp;a,b,c,d",
+$iscb:true},
+tG:{
+"^":"Xs;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.jv(this.c,a),new P.bi(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
+P.FE(new P.BE(this.c,a),new P.Oh(z,y),P.TB(z.a,y))},"$1",null,2,0,null,81,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
-jv:{
-"^":"Tp:115;e,f",
-$0:[function(){return J.de(this.f,this.e)},"$0",null,0,0,null,"call"],
+$signature:function(){return H.IG(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+BE:{
+"^":"Xs:42;e,f",
+$0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
-bi:{
-"^":"Tp:310;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,372,[],"call"],
+Oh:{
+"^":"Xs:82;a,UI",
+$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-YJ:{
-"^":"Tp:115;bK",
+kb:{
+"^":"Xs:42;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
-"^":"Tp;a,b,c,d",
-$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,142,[],"call"],
+"^":"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,81,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
+$signature:function(){return H.IG(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
 Rl:{
-"^":"Tp:115;e,f",
-$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
+"^":"Xs:42;e,f",
+$0:function(){return this.e.$1(this.f)},
 $isEH:true},
-Jb:{
-"^":"Tp:116;",
-$1:[function(a){},"$1",null,2,0,null,117,[],"call"],
+at:{
+"^":"Xs:10;",
+$1:function(a){},
 $isEH:true},
-M4:{
-"^":"Tp:115;UI",
+ib:{
+"^":"Xs:42;UI",
 $0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Jp:{
-"^":"Tp;a,b,c,d",
+Ee:{
+"^":"Xs;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
+P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,81,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
-h7:{
-"^":"Tp:115;e,f",
-$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
+$signature:function(){return H.IG(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
+WN:{
+"^":"Xs:42;e,f",
+$0:function(){return this.e.$1(this.f)},
 $isEH:true},
-pr:{
-"^":"Tp:310;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,372,[],"call"],
+XPB:{
+"^":"Xs:82;a,UI",
+$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-eN:{
-"^":"Tp:115;bK",
+Ia:{
+"^":"Xs:42;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
-B5:{
-"^":"Tp:116;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,117,[],"call"],
+uO:{
+"^":"Xs:10;a",
+$1:[function(a){++this.a.a},"$1",null,2,0,null,11,"call"],
 $isEH:true},
-PI:{
-"^":"Tp:115;a,b",
+hh:{
+"^":"Xs:42;a,b",
 $0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
-j4:{
-"^":"Tp:116;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,117,[],"call"],
+qg:{
+"^":"Xs:10;a,b",
+$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,11,"call"],
 $isEH:true},
-i9:{
-"^":"Tp:115;c",
+yB:{
+"^":"Xs:42;c",
 $0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
-VV:{
-"^":"Tp;a,b",
-$1:[function(a){this.b.push(a)},"$1",null,2,0,null,248,[],"call"],
-$isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.a,"qh")}},
-Dy:{
-"^":"Tp:115;c,d",
-$0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
-lU:{
-"^":"Tp;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,30,[],"call"],
-$isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
-OC:{
-"^":"Tp:115;d",
-$0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
-$isEH:true},
 UH:{
-"^":"Tp;a,b",
+"^":"Xs;a,b",
 $1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"$1",null,2,0,null,30,[],"call"],
+z.a=a},"$1",null,2,0,null,18,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
+$signature:function(){return H.IG(function(a){return{func:"Pw",args:[a]}},this.b,"cb")}},
 Z5:{
-"^":"Tp:115;a,c",
+"^":"Xs:42;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"],
 $isEH:true},
-j5:{
-"^":"Tp;a,b,c",
-$1:[function(a){var z=this.a
-if(J.de(z.a,0)){P.Bb(z.b,this.c,a)
-return}z.a=J.xH(z.a,1)},"$1",null,2,0,null,30,[],"call"],
-$isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
-ii:{
-"^":"Tp:115;a,d",
-$0:[function(){this.d.Lp(new P.bJ("value "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
-$isEH:true},
 MO:{
 "^":"a;",
 $isMO:true},
 O9:{
-"^":"aN;",
+"^":"ez;",
 w4:function(a){var z,y,x,w
 z=this.Y8
 if((z.Gv&4)!==0)H.vh(P.w("Subscribing to closed stream"))
 y=$.X3
 x=a?1:0
-w=H.VM(new P.JI(null,null,null,z,null,null,null,y,x,null,null),[H.Kp(z,0)])
+w=H.VM(new P.f6(null,null,null,z,null,null,null,y,x,null,null),[H.Kp(z,0)])
 w.SJ=w
 w.iE=w
 x=z.SJ
@@ -4935,68 +5009,69 @@
 if(!J.x(b).$isO9)return!1
 return b.Y8===this.Y8},
 $isO9:true},
-yU:{
+oh:{
 "^":"KA;Y8<",
 tA:function(){return this.gY8().j0(this)},
-uO:[function(){this.gY8()},"$0","gp4",0,0,126],
-LP:[function(){this.gY8()},"$0","gZ9",0,0,126]},
-nP:{
+uO:[function(){this.gY8()},"$0","gp4",0,0,15],
+LP:[function(){this.gY8()},"$0","gZ9",0,0,15]},
+oK:{
 "^":"a;"},
 KA:{
 "^":"a;pN,o7<,Bd,Lj<,Gv,lz,Ri",
-fe:function(a){this.pN=this.Lj.cR(a)},
-fm:function(a,b){if(b==null)b=P.AY()
+yl:function(a){this.Lj.toString
+this.pN=a},
+fm:function(a,b){if(b==null)b=P.vD()
 this.o7=P.VH(b,this.Lj)},
 y5:function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},
-TJ:function(a,b){var z,y,x
+this.Lj.toString
+this.Bd=a},
+Fv:[function(a,b){var z,y
 z=this.Gv
 if((z&8)!==0)return
-y=(z+128|4)>>>0
-this.Gv=y
-if(z<128&&this.Ri!=null){x=this.Ri
-if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},
-yy:function(a){return this.TJ(a,null)},
-QE:function(a){var z=this.Gv
+this.Gv=(z+128|4)>>>0
+if(b!=null)b.wM(this.gDQ(this))
+if(z<128&&this.Ri!=null){y=this.Ri
+if(y.Gv===1)y.Gv=3}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,83,20,84],
+QE:[function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
 this.Gv=z
 if(z<128)if((z&64)!==0&&this.Ri.N6!=null)this.Ri.t2(this)
 else{z=(z&4294967291)>>>0
 this.Gv=z
-if((z&32)===0)this.J7(this.gZ9())}}},
+if((z&32)===0)this.J7(this.gZ9())}}},"$0","gDQ",0,0,15],
 ed:function(){var z=(this.Gv&4294967279)>>>0
 this.Gv=z
 if((z&8)!==0)return this.lz
-this.Ek()
+this.tk()
 return this.lz},
-gRW:function(){return this.Gv>=128},
-Ek:function(){var z,y
+gUF:function(){return this.Gv>=128},
+tk:function(){var z,y
 z=(this.Gv|8)>>>0
 this.Gv=z
 if((z&64)!==0){y=this.Ri
 if(y.Gv===1)y.Gv=3}if((z&32)===0)this.Ri=null
 this.lz=this.tA()},
-Rg:function(a,b){var z=this.Gv
+Rg:function(a){var z=this.Gv
 if((z&8)!==0)return
-if(z<32)this.Iv(b)
-else this.w6(H.VM(new P.LV(b,null),[null]))},
+if(z<32)this.Iv(a)
+else this.VI(H.VM(new P.fZ(a,null),[null]))},
 V8:function(a,b){var z=this.Gv
 if((z&8)!==0)return
-if(z<32)this.pb(a,b)
-else this.w6(new P.DS(a,b,null))},
-Qj:function(){var z=this.Gv
+if(z<32)this.NA(a,b)
+else this.VI(new P.WG(a,b,null))},
+YB:function(){var z=this.Gv
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.Gv=z
-if(z<32)this.SY()
-else this.w6(C.Wj)},
-uO:[function(){},"$0","gp4",0,0,126],
-LP:[function(){},"$0","gZ9",0,0,126],
+if(z<32)this.Pl()
+else this.VI(C.Wj)},
+uO:[function(){},"$0","gp4",0,0,15],
+LP:[function(){},"$0","gZ9",0,0,15],
 tA:function(){},
-w6:function(a){var z,y
+VI:function(a){var z,y
 z=this.Ri
-if(z==null){z=new P.Qk(null,null,0)
+if(z==null){z=new P.qm(null,null,0)
 this.Ri=z}z.h(0,a)
 y=this.Gv
 if((y&64)===0){y=(y|64)>>>0
@@ -5007,16 +5082,16 @@
 this.Lj.m1(this.pN,a)
 this.Gv=(this.Gv&4294967263)>>>0
 this.Kl((z&4)!==0)},
-pb:function(a,b){var z,y
+NA:function(a,b){var z,y
 z=this.Gv
-y=new P.Vo(this,a,b)
+y=new P.x1(this,a,b)
 if((z&1)!==0){this.Gv=(z|16)>>>0
-this.Ek()
+this.tk()
 y.$0()}else{y.$0()
 this.Kl((z&4)!==0)}},
-SY:function(){this.Ek()
+Pl:function(){this.tk()
 this.Gv=(this.Gv|16)>>>0
-new P.qB(this).$0()},
+new P.qQ(this).$0()},
 J7:function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
 a.$0()
@@ -5039,37 +5114,41 @@
 z=(this.Gv&4294967263)>>>0
 this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},
 $isMO:true,
-static:{"^":"ry,bG,Q9,wd,yJ,Dr,HX,GC,bsZ"}},
-Vo:{
-"^":"Tp:126;a,b,c",
-$0:[function(){var z,y,x,w,v
+static:{"^":"Xx,bG,nS,Ir,yJ,Dr,JAK,GC,Pj"}},
+x1:{
+"^":"Xs:15;a,b,c",
+$0:function(){var z,y,x,w,v,u
 z=this.a
 y=z.Gv
 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)
+x=$.X3
+y.toString
+x.toString
+if(x==null?y!=null:x!==y)P.CK(x,null,x,this.b,this.c)
 else{x=z.o7
-w=H.N7()
+w=H.G3()
 w=H.KT(w,[w,w]).BD(x)
-v=this.b
-if(w)y.z8(x,v,this.c)
-else y.m1(x,v)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+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},
 $isEH:true},
-qB:{
-"^":"Tp:126;a",
-$0:[function(){var z,y
+qQ:{
+"^":"Xs:15;a",
+$0:function(){var z,y
 z=this.a
 y=z.Gv
 if((y&16)===0)return
 z.Gv=(y|42)>>>0
 z.Lj.bH(z.Bd)
-z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+z.Gv=(z.Gv&4294967263)>>>0},
 $isEH:true},
-aN:{
-"^":"qh;",
+ez:{
+"^":"cb;",
 KR:function(a,b,c,d){var z=this.w4(!0===b)
-z.fe(a)
+z.yl(a)
 z.fm(0,d)
 z.y5(c)
 return z},
@@ -5083,15 +5162,15 @@
 return y}},
 fIm:{
 "^":"a;aw@"},
-LV:{
+fZ:{
 "^":"fIm;P>,aw",
 dP:function(a){a.Iv(this.P)}},
-DS:{
+WG:{
 "^":"fIm;kc>,I4<,aw",
-dP:function(a){a.pb(this.kc,this.I4)}},
+dP:function(a){a.NA(this.kc,this.I4)}},
 JF:{
 "^":"a;",
-dP:function(a){a.SY()},
+dP:function(a){a.Pl()},
 gaw:function(){return},
 saw:function(a){throw H.b(P.w("No events after a done."))}},
 ht:{
@@ -5102,7 +5181,7 @@
 return}P.rb(new P.CR(this,a))
 this.Gv=1}},
 CR:{
-"^":"Tp:115;a,b",
+"^":"Xs:42;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -5110,7 +5189,7 @@
 if(y===3)return
 z.TO(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Qk:{
+qm:{
 "^":"ht;zR,N6,Gv",
 gl0:function(a){return this.N6==null},
 h:function(a,b){var z=this.N6
@@ -5126,54 +5205,54 @@
 V1:function(a){if(this.Gv===1)this.Gv=3
 this.N6=null
 this.zR=null}},
-v1y:{
-"^":"Tp:115;a,b,c",
-$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
+dR:{
+"^":"Xs:42;a,b,c",
+$0:function(){return this.a.K5(this.b,this.c)},
 $isEH:true},
 uR:{
-"^":"Tp:373;a,b",
-$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"$2",null,4,0,null,171,[],172,[],"call"],
+"^":"Xs:85;a,b",
+$2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
 Q0:{
-"^":"Tp:115;a,b",
-$0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
+"^":"Xs:42;a,b",
+$0:function(){return this.a.rX(this.b)},
 $isEH:true},
-YR:{
-"^":"qh;",
+og:{
+"^":"cb;",
 KR:function(a,b,c,d){var z,y,x,w,v
 b=!0===b
-z=H.ip(this,"YR",0)
-y=H.ip(this,"YR",1)
+z=H.ip(this,"og",0)
+y=H.ip(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.fe(a)
+v.yl(a)
 v.fm(0,d)
 v.y5(c)
 return v},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)},
-Ml:function(a,b){b.Rg(0,a)},
-$asqh:function(a,b){return[b]}},
+ut:function(a,b){b.Rg(a)},
+$ascb:function(a,b){return[b]}},
 fB:{
 "^":"KA;UY,Ee,pN,o7,Bd,Lj,Gv,lz,Ri",
-Rg:function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.Rg.call(this,this,b)},
+Rg:function(a){if((this.Gv&2)!==0)return
+P.KA.prototype.Rg.call(this,a)},
 V8:function(a,b){if((this.Gv&2)!==0)return
 P.KA.prototype.V8.call(this,a,b)},
 uO:[function(){var z=this.Ee
 if(z==null)return
-z.yy(0)},"$0","gp4",0,0,126],
+z.yy(0)},"$0","gp4",0,0,15],
 LP:[function(){var z=this.Ee
 if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,126],
+z.QE(0)},"$0","gZ9",0,0,15],
 tA:function(){var z=this.Ee
 if(z!=null){this.Ee=null
 z.ed()}return},
-vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},248,[]],
-xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,374,171,[],172,[]],
-nn:[function(){this.Qj()},"$0","gH1",0,0,126],
+vx:[function(a){this.UY.ut(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"wa",void:true,args:[a]}},this.$receiver,"fB")},74],
+xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,86,21,22],
+fE:[function(){this.YB()},"$0","gH1",0,0,15],
 S8:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
@@ -5181,287 +5260,125 @@
 $asKA:function(a,b){return[b]},
 $asMO:function(a,b){return[b]}},
 nO:{
-"^":"YR;qs,Sb",
-Dr:function(a){return this.qs.$1(a)},
-Ml:function(a,b){var z,y,x,w,v
+"^":"og;qs,Sb",
+wW:function(a){return this.qs.$1(a)},
+ut: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.wW(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 b.V8(y,x)
-return}if(z===!0)J.QM(b,a)},
-$asYR:function(a){return[a,a]},
-$asqh:null},
-t3:{
-"^":"YR;TN,Sb",
+return}if(z===!0)b.Rg(a)},
+$asog:function(a){return[a,a]},
+$ascb:null},
+c9:{
+"^":"og;TN,Sb",
 kn:function(a){return this.TN.$1(a)},
-Ml:function(a,b){var z,y,x,w,v
+ut:function(a,b){var z,y,x,w,v
 z=null
 try{z=this.kn(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 b.V8(y,x)
-return}J.QM(b,z)}},
-aW:{
-"^":"YR;pK,Sb",
+return}b.Rg(z)}},
+Bg:{
+"^":"og;pK,Sb",
 GW:function(a){return this.pK.$1(a)},
-Ml:function(a,b){var z,y,x,w,v
-try{for(w=J.GP(this.GW(a));w.G();){z=w.gl()
-J.QM(b,z)}}catch(v){w=H.Ru(v)
+ut:function(a,b){var z,y,x,w,v
+try{for(w=J.mY(this.GW(a));w.G();){z=w.gl()
+b.Rg(z)}}catch(v){w=H.Ru(v)
 y=w
-x=new H.XO(v,null)
+x=new H.oP(v,null)
 b.V8(y,x)}}},
-Zz:{
-"^":"YR;Em,Sb",
-Ml:function(a,b){var z
-if(J.z8(this.Em,0)){b.Rg(0,a)
-z=J.xH(this.Em,1)
-this.Em=z
-if(J.de(z,0))b.Qj()}},
-K6:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))},
-$asYR:function(a){return[a,a]},
-$asqh:null},
-dq:{
-"^":"YR;Em,Sb",
-Ml:function(a,b){if(J.z8(this.Em,0)){this.Em=J.xH(this.Em,1)
-return}b.Rg(0,a)},
-U6:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.u(b))},
-$asYR:function(a){return[a,a]},
-$asqh:null},
-tU:{
-"^":"a;"},
-aY:{
-"^":"a;"},
-zG:{
-"^":"a;E2<,cP<,Jl<,pU<,Fh<,Xp<,fb<,rb<,Zq<,rF,JS>,iq<",
-hk:function(a,b){return this.E2.$2(a,b)},
-Gr:function(a){return this.cP.$1(a)},
-FI:function(a,b){return this.Jl.$2(a,b)},
-mg:function(a,b,c){return this.pU.$3(a,b,c)},
-Al:function(a){return this.Fh.$1(a)},
-cR:function(a){return this.Xp.$1(a)},
-O8:function(a){return this.fb.$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)},
-Ch:function(a,b){return this.JS.$1(b)},
-iT:function(a){return this.iq.$1$specification(a)}},
-e4y:{
-"^":"a;"},
-dl:{
-"^":"a;"},
-Id:{
-"^":"a;oh",
-gLj:function(){return this.oh},
-c1:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gE2()==null;)z=z.geT(z)
-return y.gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
-Vn:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gcP()==null;)z=z.geT(z)
-return y.gcP().$4(z,new P.Id(z.geT(z)),a,b)},
-qG:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gJl()==null;)z=z.geT(z)
-return y.gJl().$5(z,new P.Id(z.geT(z)),a,b,c)},
-nA:function(a,b,c,d){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gpU()==null;)z=z.geT(z)
-return y.gpU().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
-TE:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gFh(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-V6:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gXp(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-mz:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gfb(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-RK:function(a,b){var z,y,x
-z=this.oh
-for(;y=z.gWY(),y.grb()==null;)z=z.geT(z)
-x=z.geT(z)
-y.grb().$4(z,new P.Id(x),a,b)},
-dJ:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gZq()==null;)z=z.geT(z)
-return y.gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
-RB:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gJS(y)==null;)z=z.geT(z)
-y.gJS(y).$4(z,new P.Id(z.geT(z)),b,c)},
-ld:function(a,b,c){var z,y,x
-z=this.oh
-for(;y=z.gWY(),y.giq()==null;)z=z.geT(z)
-x=z.geT(z)
-return y.giq().$5(z,new P.Id(x),a,b,c)}},
-WH:{
+ld:{
 "^":"a;",
-fC:function(a){return this.gC5()===a.gC5()},
 bH: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.K5(this,z)},
 ce:function(a){return this.xi(a,!0)},
-oj:function(a,b){var z=this.cR(a)
+Nf:function(a,b){var z=this.wY(a)
 if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},
-PT:function(a,b){var z=this.O8(a)
-if(b)return new P.dv(this,z)
-else return new P.ph(this,z)}},
+else return new P.Hs(this,z)}},
 TF:{
-"^":"Tp:115;a,b",
+"^":"Xs:42;a,b",
 $0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 K5:{
-"^":"Tp:115;c,d",
+"^":"Xs:42;c,d",
 $0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
-"^":"Tp:116;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,184,[],"call"],
+"^":"Xs:10;a,b",
+$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,87,"call"],
 $isEH:true},
 Hs:{
-"^":"Tp:116;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,184,[],"call"],
+"^":"Xs:10;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,87,"call"],
 $isEH:true},
-dv:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
-$isEH:true},
-ph:{
-"^":"Tp:300;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
-$isEH:true},
-uo:{
-"^":"WH;eT>,WY<,R1",
-gC5:function(){return this.eT.gC5()},
-t:function(a,b){var z,y
-z=this.R1
-y=z.t(0,b)
-if(y!=null||z.x4(b))return y
-return this.eT.t(0,b)},
-hk:function(a,b){return new P.Id(this).c1(this,a,b)},
-c6:function(a,b){return new P.Id(this).ld(this,a,b)},
-iT:function(a){return this.c6(a,null)},
-Gr:function(a){return new P.Id(this).Vn(this,a)},
-FI:function(a,b){return new P.Id(this).qG(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)},
-cR: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)}},
-pK:{
-"^":"Tp:115;a,b",
-$0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
+FO:{
+"^":"Xs:42;a,b",
+$0:function(){P.IA(new P.eM(this.a,this.b))},
 $isEH:true},
 eM:{
-"^":"Tp:115;c,d",
+"^":"Xs:42;c,d",
 $0:[function(){var z,y
 z=this.c
-P.JS("Uncaught Error: "+H.d(z))
+P.FL("Uncaught Error: "+H.d(z))
 y=this.d
-if(y==null&&!!J.x(z).$isGe)y=z.gI4()
-if(y!=null)P.JS("Stack Trace: \n"+H.d(y)+"\n")
+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:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
-$isEH:true},
-AHi:{
-"^":"a;",
-gE2:function(){return P.Gx()},
-hk:function(a,b){return this.gE2().$2(a,b)},
-gcP:function(){return P.AI()},
-Gr:function(a){return this.gcP().$1(a)},
-gJl:function(){return P.MM()},
-FI:function(a,b){return this.gJl().$2(a,b)},
-gpU:function(){return P.l4()},
-mg:function(a,b,c){return this.gpU().$3(a,b,c)},
-gFh:function(){return P.EU()},
-Al:function(a){return this.gFh().$1(a)},
-gXp:function(){return P.zi()},
-cR:function(a){return this.gXp().$1(a)},
-gfb:function(){return P.uu()},
-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.KF()},
-uN:function(a,b){return this.gZq().$2(a,b)},
-gJS:function(a){return P.YM()},
-Ch:function(a,b){return this.gJS(this).$1(b)},
-giq:function(){return P.hn()},
-iT:function(a){return this.giq().$1$specification(a)}},
-R8:{
-"^":"WH;",
+R81:{
+"^":"ld;",
 geT:function(a){return},
-gWY:function(){return C.v8},
-gC5:function(){return this},
-fC:function(a){return a.gC5()===this},
 t:function(a,b){return},
-hk:function(a,b){return P.L2(this,null,this,a,b)},
-c6:function(a,b){return P.UA(this,null,this,a,b)},
-iT:function(a){return this.c6(a,null)},
+hk:function(a,b){return P.CK(this,null,this,a,b)},
 Gr:function(a){return P.T8(this,null,this,a)},
 FI:function(a,b){return P.V7(this,null,this,a,b)},
-mg:function(a,b,c){return P.Qx(this,null,this,a,b,c)},
+mg:function(a,b,c){return P.BD(this,null,this,a,b,c)},
 Al: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,{
+wY:function(a){return a}}}],["dart.collection","dart:collection",,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])},
-jB:[function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z},"$0","A5",0,0,null],
-TQ:[function(a,b){return J.de(a,b)},"$2","Jo",4,0,198,118,[],199,[]],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,200,118,[]],
-Py:function(a,b,c,d,e){var z
-if(a==null){z=new P.k6(0,null,null,null,null)
+Ou:[function(a,b){return J.xC(a,b)},"$2","bd",4,0,23,24,25],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,26,24],
+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.MP(a,b,c,d,e)},
-UD:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
+RN:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
+op:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
 yv:function(a){return H.VM(new P.YO(0,null,null,null,null),[a])},
-FO:[function(a){var z,y
-if($.xb().tg(0,a))return"(...)"
+m4:function(a,b,c){var z,y
+if($.xb().tg(0,a))return b+"..."+c
 $.xb().h(0,a)
 z=[]
-try{P.Vr(a,z)}finally{$.xb().Rz(0,a)}y=P.p9("(")
+try{P.eG(a,z)}finally{$.xb().Rz(0,a)}y=P.p9(b)
 y.We(z,", ")
-y.KF(")")
-return y.vM},"$1","Zw",2,0,null,127,[]],
-Vr:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
+y.KF(c)
+return y.vM},
+eG:function(a,b){var z,y,x,w,v,u,t,s,r,q
 z=a.gA(a)
 y=0
 x=0
@@ -5482,37 +5399,32 @@
 for(;z.G();t=s,s=r){r=z.gl();++x
 if(x>100){while(!0){if(!(y>75&&x>3))break
 if(0>=b.length)return H.e(b,0)
-q=J.WB(J.q8(b.pop()),2)
-if(typeof q!=="number")return H.s(q)
-y-=q;--x}b.push("...")
+y-=b.pop().length+2;--x}b.push("...")
 return}}u=H.d(t)
 v=H.d(s)
 y+=v.length+u.length+4}}if(x>b.length+2){y+=5
-p="..."}else p=null
+q="..."}else q=null
 while(!0){if(!(y>80&&b.length>3))break
 if(0>=b.length)return H.e(b,0)
-q=J.WB(J.q8(b.pop()),2)
-if(typeof q!=="number")return H.s(q)
-y-=q
-if(p==null){y+=5
-p="..."}}if(p!=null)b.push(p)
+y-=b.pop().length+2
+if(q==null){y+=5
+q="..."}}if(q!=null)b.push(q)
 b.push(u)
-b.push(v)},"$2","zE",4,0,null,127,[],201,[]],
+b.push(v)},
 L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
-Ls:function(a,b,c,d){return H.VM(new P.b6(0,null,null,null,null,null,0),[d])},
-vW:[function(a){var z,y,x,w,v
+Ls:function(a,b,c,d){return H.VM(new P.D0(0,null,null,null,null,null,0),[d])},
+vW:function(a){var z,y,x,w
 z={}
-for(x=0;w=$.tw(),x<w.length;++x){w=w[x]
-v=a
-if(w==null?v==null:w===v)return"{...}"}y=P.p9("")
+for(x=0;w=$.tw(),x<w.length;++x)if(w[x]===a)return"{...}"
+y=P.p9("")
 try{$.tw().push(a)
 y.KF("{")
 z.a=!0
-J.kH(a,new P.LG(z,y))
+J.kH(a,new P.W0(z,y))
 y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},"$1","DH",2,0,null,202,[]],
-k6:{
+z.pop()}return y.gvM()},
+bA:{
 "^":"a;X5,vv,OX,OB,wV",
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
@@ -5526,10 +5438,7 @@
 Zt:function(a){var z=this.OB
 if(z==null)return!1
 return this.aH(z[this.nm(a)],a)>=0},
-di:function(a){var z=this.Ig()
-z.toString
-return H.Ck(z,new P.ce(this,a))},
-FV:function(a,b){J.kH(b,new P.DJ(this))},
+FV:function(a,b){H.bQ(b,new P.DJ(this))},
 t:function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)y=null
@@ -5546,13 +5455,13 @@
 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(z==null){z=P.a0()
+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
-if(y==null){y=P.a0()
+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
-if(z==null){z=P.a0()
+if(z==null){z=P.SQ()
 this.OB=z}y=this.nm(a)
 x=z[y]
 if(x==null){P.cW(z,y,[a,b]);++this.X5
@@ -5611,30 +5520,26 @@
 aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
+for(y=0;y<z;y+=2)if(J.xC(a[y],b))return y
 return-1},
 $isZ0:true,
-static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"$2","ME",4,0,null,197,[],49,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"$3","rn",6,0,null,197,[],49,[],30,[]],a0:[function(){var z=Object.create(null)
+static:{vL:function(a,b){var z=a[b]
+return z===a?null:z},cW:function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},SQ:function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
-return z},"$0","l1",0,0,null]}},
+return z}}},
 oi:{
-"^":"Tp:116;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,375,[],"call"],
-$isEH:true},
-ce:{
-"^":"Tp:116;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,375,[],"call"],
+"^":"Xs:10;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,88,"call"],
 $isEH:true},
 DJ:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Xs;a",
+$2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
-$signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
+$signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"bA")}},
 PL:{
-"^":"k6;X5,vv,OX,OB,wV",
+"^":"bA;X5,vv,OX,OB,wV",
 nm:function(a){return H.CU(a)&0x3ffffff},
 aH:function(a,b){var z,y,x
 if(a==null)return-1
@@ -5642,30 +5547,30 @@
 for(y=0;y<z;y+=2){x=a[y]
 if(x==null?b==null:x===b)return y}return-1}},
 Fq:{
-"^":"k6;y9,Q6,ac,X5,vv,OX,OB,wV",
-WV:function(a,b){return this.y9.$2(a,b)},
+"^":"bA;m6,Q6,hg,X5,vv,OX,OB,wV",
+C2:function(a,b){return this.m6.$2(a,b)},
 H5:function(a){return this.Q6.$1(a)},
-Ef:function(a){return this.ac.$1(a)},
+Ef:function(a){return this.hg.$1(a)},
 t:function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.Dl.call(this,b)},
-u:function(a,b,c){P.k6.prototype.ms.call(this,b,c)},
+return P.bA.prototype.Dl.call(this,b)},
+u:function(a,b,c){P.bA.prototype.ms.call(this,b,c)},
 x4:function(a){if(this.Ef(a)!==!0)return!1
-return P.k6.prototype.Zt.call(this,a)},
+return P.bA.prototype.Zt.call(this,a)},
 Rz:function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.bB.call(this,b)},
+return P.bA.prototype.bB.call(this,b)},
 nm:function(a){return this.H5(a)&0x3ffffff},
 aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;y+=2)if(this.WV(a[y],b)===!0)return y
+for(y=0;y<z;y+=2)if(this.C2(a[y],b)===!0)return y
 return-1},
 bu:function(a){return P.vW(this)},
 static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"Tp:116;a",
-$1:[function(a){var z=H.XY(a,this.a)
-return z},"$1",null,2,0,null,122,[],"call"],
+"^":"Xs:10;a",
+$1:function(a){var z=H.IU(a,this.a)
+return z},
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -5710,8 +5615,7 @@
 Zt:function(a){var z=this.OB
 if(z==null)return!1
 return this.aH(z[this.nm(a)],a)>=0},
-di:function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},
-FV:function(a,b){J.kH(b,new P.S9(this))},
+FV:function(a,b){J.kH(b,new P.pk(this))},
 t:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)return
@@ -5729,13 +5633,13 @@
 return y[x].gS4()},
 u:function(a,b,c){var z,y
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){z=P.Qs()
+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
-if(y==null){y=P.Qs()
+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
-if(z==null){z=P.Qs()
+if(z==null){z=P.Jc()
 this.OB=z}y=this.nm(a)
 x=z[y]
 if(x==null)z[y]=[this.pE(a,b)]
@@ -5783,7 +5687,7 @@
 delete a[b]
 return z.gS4()},
 pE:function(a,b){var z,y
-z=new P.db(a,b,null,null)
+z=new P.aj(a,b,null,null)
 if(this.H9==null){this.lX=z
 this.H9=z}else{y=this.lX
 z.zQ=y
@@ -5803,29 +5707,25 @@
 aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;++y)if(J.de(a[y].gkh(),b))return y
+for(y=0;y<z;++y)if(J.xC(a[y].gkh(),b))return y
 return-1},
 bu:function(a){return P.vW(this)},
 $isFo:true,
 $isZ0:true,
-static:{Qs:[function(){var z=Object.create(null)
+static:{Jc:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z},"$0","Bs",0,0,null]}},
+return z}}},
 a1:{
-"^":"Tp:116;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,375,[],"call"],
+"^":"Xs:10;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,88,"call"],
 $isEH:true},
-ou:{
-"^":"Tp:116;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,375,[],"call"],
-$isEH:true},
-S9:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+pk:{
+"^":"Xs;a",
+$2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
-db:{
+aj:{
 "^":"a;kh<,S4@,DG@,zQ@"},
 i5:{
 "^":"mW;Fb",
@@ -5856,8 +5756,8 @@
 return!1}else{this.fD=z.gkh()
 this.zq=this.zq.gDG()
 return!0}}}},
-Rr:{
-"^":"lN;",
+jg:{
+"^":"u3T;X5,vv,OX,OB,DM",
 gA:function(a){var z=new P.oz(this,this.Zl(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
@@ -5871,12 +5771,12 @@
 bk:function(a){var z=this.OB
 if(z==null)return!1
 return this.aH(z[this.nm(a)],a)>=0},
-hV:function(a){var z
+iQ:function(a){var z
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
-return this.AD(a)},
-AD:function(a){var z,y,x
+return this.dn(a)},
+dn:function(a){var z,y,x
 z=this.OB
 if(z==null)return
 y=z[this.nm(a)]
@@ -5894,20 +5794,21 @@
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
 this.OX=y
-x=y}return this.cA(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
+x=y}return this.cA(x,b)}else return this.NZ(b)},
+NZ:function(a){var z,y,x
 z=this.OB
 if(z==null){z=P.jB()
-this.OB=z}y=this.nm(b)
+this.OB=z}y=this.nm(a)
 x=z[y]
-if(x==null)z[y]=[b]
-else{if(this.aH(x,b)>=0)return!1
-x.push(b)}++this.X5
+if(x==null)z[y]=[a]
+else{if(this.aH(x,a)>=0)return!1
+x.push(a)}++this.X5
 this.DM=null
 return!0},
 FV:function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},
 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
@@ -5953,14 +5854,17 @@
 aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;++y)if(J.de(a[y],b))return y
+for(y=0;y<z;++y)if(J.xC(a[y],b))return y
 return-1},
-$isz5:true,
 $isyN:true,
-$isQV:true,
-$asQV:null},
+$iscX:true,
+$ascX:null,
+static:{jB:function(){var z=Object.create(null)
+z["<non-identifier-key>"]=z
+delete z["<non-identifier-key>"]
+return z}}},
 YO:{
-"^":"Rr;X5,vv,OX,OB,DM",
+"^":"jg;X5,vv,OX,OB,DM",
 nm:function(a){return H.CU(a)&0x3ffffff},
 aH:function(a,b){var z,y,x
 if(a==null)return-1
@@ -5979,8 +5883,8 @@
 return!1}else{this.fD=z[y]
 this.zi=y+1
 return!0}}},
-b6:{
-"^":"lN;X5,vv,OX,OB,H9,lX,zN",
+D0:{
+"^":"u3T;X5,vv,OX,OB,H9,lX,zN",
 gA:function(a){var z=H.VM(new P.zQ(this,this.zN,null,null),[null])
 z.zq=z.O2.H9
 return z},
@@ -5996,12 +5900,12 @@
 bk:function(a){var z=this.OB
 if(z==null)return!1
 return this.aH(z[this.nm(a)],a)>=0},
-hV:function(a){var z
+iQ:function(a){var z
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
-else return this.AD(a)},
-AD:function(a){var z,y,x
+else return this.dn(a)},
+dn:function(a){var z,y,x
 z=this.OB
 if(z==null)return
 y=z[this.nm(a)]
@@ -6028,17 +5932,15 @@
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
 this.OX=y
-x=y}return this.cA(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
+x=y}return this.cA(x,b)}else return this.NZ(b)},
+NZ:function(a){var z,y,x
 z=this.OB
 if(z==null){z=P.T2()
-this.OB=z}y=this.nm(b)
+this.OB=z}y=this.nm(a)
 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},
-FV:function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},
+if(x==null)z[y]=[this.xf(a)]
+else{if(this.aH(x,a)>=0)return!1
+x.push(this.xf(a))}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)},
@@ -6068,7 +5970,7 @@
 delete a[b]
 return!0},
 xf:function(a){var z,y
-z=new P.ef(a,null,null)
+z=new P.tj(a,null,null)
 if(this.H9==null){this.lX=z
 this.H9=z}else{y=this.lX
 z.zQ=y
@@ -6088,17 +5990,16 @@
 aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;++y)if(J.de(a[y].gGc(),b))return y
+for(y=0;y<z;++y)if(J.xC(a[y].gGc(),b))return y
 return-1},
-$isz5:true,
 $isyN:true,
-$isQV:true,
-$asQV:null,
-static:{T2:[function(){var z=Object.create(null)
+$iscX:true,
+$ascX:null,
+static:{T2:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z},"$0","um",0,0,null]}},
-ef:{
+return z}}},
+tj:{
 "^":"a;Gc<,DG@,zQ@"},
 zQ:{
 "^":"a;O2,zN,zq,fD",
@@ -6111,32 +6012,21 @@
 this.zq=this.zq.gDG()
 return!0}}}},
 Yp:{
-"^":"w2Y;G4",
-gB:function(a){return J.q8(this.G4)},
-t:function(a,b){return J.i4(this.G4,b)}},
-lN:{
-"^":"mW;",
-tt:function(a,b){var z,y,x,w,v
-if(b){z=H.VM([],[H.Kp(this,0)])
-C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
-y.fixed$length=init
-z=H.VM(y,[H.Kp(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
-v=x+1
-if(x>=z.length)return H.e(z,x)
-z[x]=w}return z},
-br:function(a){return this.tt(a,!0)},
-bu:function(a){return H.mx(this,"{","}")},
-$isz5:true,
-$isyN:true,
-$isQV:true,
-$asQV:null},
+"^":"XC;G4",
+gB:function(a){return this.G4.length},
+t:function(a,b){var z=this.G4
+if(b>>>0!==b||b>=z.length)return H.e(z,b)
+return z[b]}},
+u3T:{
+"^":"Yw;",
+bu:function(a){return P.m4(this,"{","}")}},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")},128,[]],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"Uy",ret:P.cX,args:[{func:"YM",args:[a]}]}},this.$receiver,"mW")},48],
 ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-Ft:[function(a,b){return H.VM(new H.kV(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},128,[]],
+Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.cX,args:[{func:"tr",ret:P.cX,args:[a]}]}},this.$receiver,"mW")},48],
 tg:function(a,b){var z
-for(z=this.gA(this);z.G();)if(J.de(z.gl(),b))return!0
+for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
 aN:function(a,b){var z
 for(z=this.gA(this);z.G();)b.$1(z.gl())},
@@ -6161,190 +6051,129 @@
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
-qZ:function(a,b){return H.Dw(this,b,H.ip(this,"mW",0))},
-eR:function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},
 grZ:function(a){var z,y
 z=this.gA(this)
-if(!z.G())throw H.b(P.w("No elements"))
+if(!z.G())throw H.b(H.DU())
 do y=z.gl()
 while(z.G())
 return y},
-qA:function(a,b,c){var z,y
-for(z=this.gA(this);z.G();){y=z.gl()
-if(b.$1(y)===!0)return y}throw H.b(P.w("No matching element"))},
-XG:function(a,b){return this.qA(a,b,null)},
 Zv:function(a,b){var z,y,x,w
 if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
 for(z=this.gA(this),y=b;z.G();){x=z.gl()
 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.FO(this)},
-$isQV:true,
-$asQV:null},
-ar:{
+bu:function(a){return P.m4(this,"(",")")},
+$iscX:true,
+$ascX:null},
+rm:{
 "^":"a+lD;",
-$isList:true,
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null},
+$iscX:true,
+$ascX:null},
 lD:{
 "^":"a;",
 gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
 Zv:function(a,b){return this.t(a,b)},
 aN:function(a,b){var z,y
 z=this.gB(a)
-if(typeof z!=="number")return H.s(z)
-y=0
-for(;y<z;++y){b.$1(this.t(a,y))
+for(y=0;y<z;++y){b.$1(this.t(a,y))
 if(z!==this.gB(a))throw H.b(P.a4(a))}},
-gl0:function(a){return J.de(this.gB(a),0)},
+gl0:function(a){return this.gB(a)===0},
 gor:function(a){return!this.gl0(a)},
-grZ:function(a){if(J.de(this.gB(a),0))throw H.b(P.w("No elements"))
-return this.t(a,J.xH(this.gB(a),1))},
-tg:function(a,b){var z,y,x,w
+grZ:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
+return this.t(a,this.gB(a)-1)},
+tg:function(a,b){var z,y
 z=this.gB(a)
-y=J.x(z)
-x=0
-while(!0){w=this.gB(a)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-if(J.de(this.t(a,x),b))return!0
-if(!y.n(z,this.gB(a)))throw H.b(P.a4(a));++x}return!1},
+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},
 Vr:function(a,b){var z,y
 z=this.gB(a)
-if(typeof z!=="number")return H.s(z)
-y=0
-for(;y<z;++y){if(b.$1(this.t(a,y))===!0)return!0
+for(y=0;y<z;++y){if(b.$1(this.t(a,y))===!0)return!0
 if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
 zV:function(a,b){var z
-if(J.de(this.gB(a),0))return""
+if(this.gB(a)===0)return""
 z=P.p9("")
 z.We(a,b)
 return z.vM},
 ev:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")},128,[]],
-Ft:[function(a,b){return H.VM(new H.kV(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},128,[]],
-eR:function(a,b){return H.q9(a,b,null,null)},
+ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"uY",ret:P.cX,args:[{func:"K6",args:[a]}]}},this.$receiver,"lD")},48],
+Ft:[function(a,b){return H.VM(new H.zs(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.cX,args:[{func:"VL",ret:P.cX,args:[a]}]}},this.$receiver,"lD")},48],
+eR:function(a,b){return H.j5(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
-C.Nm.sB(z,this.gB(a))}else{y=this.gB(a)
-if(typeof y!=="number")return H.s(y)
-y=Array(y)
+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)])}x=0
-while(!0){y=this.gB(a)
-if(typeof y!=="number")return H.s(y)
-if(!(x<y))break
-y=this.t(a,x)
+z=H.VM(y,[H.ip(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;++x}return z},
+z[x]=y}return z},
 br:function(a){return this.tt(a,!0)},
 h:function(a,b){var z=this.gB(a)
-this.sB(a,J.WB(z,1))
+this.sB(a,z+1)
 this.u(a,z,b)},
 FV:function(a,b){var z,y,x
-for(z=J.GP(b);z.G();){y=z.gl()
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();){y=z.lo
 x=this.gB(a)
-this.sB(a,J.WB(x,1))
+this.sB(a,x+1)
 this.u(a,x,y)}},
-Rz:function(a,b){var z,y
-z=0
-while(!0){y=this.gB(a)
-if(typeof y!=="number")return H.s(y)
-if(!(z<y))break
-if(J.de(this.t(a,z),b)){this.YW(a,z,J.xH(this.gB(a),1),a,z+1)
-this.sB(a,J.xH(this.gB(a),1))
-return!0}++z}return!1},
 V1:function(a){this.sB(a,0)},
-GT:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,J.xH(this.gB(a),1),b)},
-np:function(a){return this.GT(a,null)},
+XP:function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,this.gB(a)-1,b)},
+Jd:function(a){return this.XP(a,null)},
 pZ: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)))},
-D6:function(a,b,c){var z,y,x,w
-c=this.gB(a)
-this.pZ(a,b,c)
-z=J.xH(c,b)
-y=H.VM([],[H.ip(a,"lD",0)])
-C.Nm.sB(y,z)
-if(typeof z!=="number")return H.s(z)
-x=0
-for(;x<z;++x){w=this.t(a,b+x)
-if(x>=y.length)return H.e(y,x)
-y[x]=w}return y},
-Jk:function(a,b){return this.D6(a,b,null)},
 Mu:function(a,b,c){this.pZ(a,b,c)
-return H.q9(a,b,c,null)},
+return H.j5(a,b,c,null)},
 UZ:function(a,b,c){var z
 this.pZ(a,b,c)
 z=c-b
-this.YW(a,b,J.xH(this.gB(a),z),a,c)
-this.sB(a,J.xH(this.gB(a),z))},
-YW:function(a,b,c,d,e){var z,y,x,w,v,u
-z=J.Wx(b)
-if(z.C(b,0)||z.D(b,this.gB(a)))H.vh(P.TE(b,0,this.gB(a)))
-z=J.Wx(c)
-if(z.C(c,b)||z.D(c,this.gB(a)))H.vh(P.TE(c,b,this.gB(a)))
-y=z.W(c,b)
-if(J.de(y,0))return
+this.YW(a,b,this.gB(a)-z,a,c)
+this.sB(a,this.gB(a)-z)},
+YW:function(a,b,c,d,e){var z,y,x,w,v
+if(b<0||b>this.gB(a))H.vh(P.TE(b,0,this.gB(a)))
+if(c<b||c>this.gB(a))H.vh(P.TE(c,b,this.gB(a)))
+z=c-b
+if(z===0)return
 if(e<0)throw H.b(P.u(e))
-z=J.x(d)
-if(!!z.$isList){x=e
-w=d}else{w=z.eR(d,e).tt(0,!1)
-x=0}if(typeof y!=="number")return H.s(y)
-z=J.U6(w)
-v=z.gB(w)
-if(typeof v!=="number")return H.s(v)
-if(x+y>v)throw H.b(P.w("Not enough elements"))
-if(typeof b!=="number")return H.s(b)
-if(x<b)for(u=y-1;u>=0;--u)this.u(a,b+u,z.t(w,x+u))
-else for(u=0;u<y;++u)this.u(a,b+u,z.t(w,x+u))},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-XU:function(a,b,c){var z,y
-z=this.gB(a)
-if(typeof z!=="number")return H.s(z)
-if(c>=z)return-1
-if(c<0)c=0
-y=c
-while(!0){z=this.gB(a)
-if(typeof z!=="number")return H.s(z)
-if(!(y<z))break
-if(J.de(this.t(a,y),b))return y;++y}return-1},
+y=J.x(d)
+if(!!y.$isWO){x=e
+w=d}else{w=y.eR(d,e).tt(0,!1)
+x=0}y=J.U6(w)
+if(x+z>y.gB(w))throw H.b(P.w("Not enough elements"))
+if(x<b)for(v=z-1;v>=0;--v)this.u(a,b+v,y.t(w,x+v))
+else for(v=0;v<z;++v)this.u(a,b+v,y.t(w,x+v))},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+XU:function(a,b,c){var z
+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},
 u8:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){var z,y
-c=J.xH(this.gB(a),1)
-for(z=c;y=J.Wx(z),y.F(z,0);z=y.W(z,1))if(J.de(this.t(a,z),b))return z
+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
 return-1},
 cn:function(a,b){return this.Pk(a,b,null)},
-xe:function(a,b,c){var z=this.gB(a)
-if(typeof z!=="number")return H.s(z)
-z=b>z
-if(z)throw H.b(P.TE(b,0,this.gB(a)))
+aP:function(a,b,c){if(b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
 if(b===this.gB(a)){this.h(a,c)
-return}this.sB(a,J.WB(this.gB(a),1))
+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
-if(b>=0){z=this.gB(a)
-if(typeof z!=="number")return H.s(z)
-z=b>z}else z=!0
-if(z)throw H.b(P.TE(b,0,this.gB(a)))
+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,J.WB(this.gB(a),y))
-if(typeof y!=="number")return H.s(y)
+this.sB(a,this.gB(a)+y)
 this.YW(a,b+y,this.gB(a),a,b)
 this.Mh(a,b,c)},
 Mh:function(a,b,c){var z,y
 z=J.x(c)
-if(!!z.$isList){z=z.gB(c)
-if(typeof z!=="number")return H.s(z)
-this.zB(a,b,b+z,c)}else for(z=z.gA(c);z.G();b=y){y=b+1
+if(!!z.$isWO)this.vg(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){var z
 if($.xb().tg(0,a))return"[...]"
@@ -6353,24 +6182,24 @@
 z.KF("[")
 z.We(a,", ")
 z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},
-$isList:true,
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null},
-LG:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.a
+$iscX:true,
+$ascX:null},
+W0:{
+"^":"Xs:51;a,b",
+$2:function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,376,[],122,[],"call"],
+z.KF(b)},
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
-gA:function(a){var z=new P.o0(this,this.eZ,this.qT,this.av,null)
+gA:function(a){var z=new P.KG(this,this.eZ,this.qT,this.av,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 aN:function(a,b){var z,y,x
@@ -6380,71 +6209,54 @@
 b.$1(x[y])
 if(z!==this.qT)H.vh(P.a4(this))}},
 gl0:function(a){return this.av===this.eZ},
-gB:function(a){return J.mQ(J.xH(this.eZ,this.av),this.v5.length-1)},
-grZ:function(a){var z,y
+gB:function(a){return(this.eZ-this.av&this.v5.length-1)>>>0},
+grZ:function(a){var z,y,x
 z=this.av
 y=this.eZ
 if(z===y)throw H.b(P.w("No elements"))
 z=this.v5
-y=J.mQ(J.xH(y,1),this.v5.length-1)
-if(y>=z.length)return H.e(z,y)
-return z[y]},
-Zv:function(a,b){var z,y,x
-z=J.Wx(b)
-if(z.C(b,0)||z.D(b,this.gB(this)))throw H.b(P.TE(b,0,this.gB(this)))
-z=this.v5
-y=this.av
-if(typeof b!=="number")return H.s(b)
 x=z.length
-y=(y+b&x-1)>>>0
+y=(y-1&x-1)>>>0
 if(y<0||y>=x)return H.e(z,y)
 return z[y]},
 tt:function(a,b){var z,y
 if(b){z=H.VM([],[H.Kp(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
-z=H.VM(y,[H.Kp(this,0)])}this.wR(z)
+z=H.VM(y,[H.Kp(this,0)])}this.GP(z)
 return z},
 br:function(a){return this.tt(a,!0)},
-h:function(a,b){this.NZ(0,b)},
+h:function(a,b){this.NZ(b)},
 FV:function(a,b){var z,y,x,w,v,u,t,s,r
-z=J.x(b)
-if(!!z.$isList){y=z.gB(b)
-x=this.gB(this)
-if(typeof y!=="number")return H.s(y)
-z=x+y
+z=b.length
+y=this.gB(this)
+x=y+z
 w=this.v5
 v=w.length
-if(z>=v){u=P.ua(z)
+if(x>=v){u=P.Pd(x)
 if(typeof u!=="number")return H.s(u)
 w=Array(u)
 w.fixed$length=init
 t=H.VM(w,[H.Kp(this,0)])
-this.eZ=this.wR(t)
+this.eZ=this.GP(t)
 this.v5=t
 this.av=0
-H.qG(t,x,z,b,0)
-this.eZ=J.WB(this.eZ,y)}else{z=this.eZ
-if(typeof z!=="number")return H.s(z)
-s=v-z
-if(y<s){H.qG(w,z,z+y,b,0)
-this.eZ=J.WB(this.eZ,y)}else{r=y-s
-H.qG(w,z,z+s,b,0)
-z=this.v5
-H.qG(z,0,r,b,s)
-this.eZ=r}}++this.qT}else for(z=z.gA(b);z.G();)this.NZ(0,z.gl())},
-Rz:function(a,b){var z,y
-for(z=this.av;z!==this.eZ;z=(z+1&this.v5.length-1)>>>0){y=this.v5
-if(z<0||z>=y.length)return H.e(y,z)
-if(J.de(y[z],b)){this.bB(z);++this.qT
-return!0}}return!1},
+H.qG(t,y,x,b,0)
+this.eZ+=z}else{x=this.eZ
+s=v-x
+if(z<s){H.qG(w,x,x+z,b,0)
+this.eZ+=z}else{r=z-s
+H.qG(w,x,x+s,b,0)
+x=this.v5
+H.qG(x,0,r,b,s)
+this.eZ=r}}++this.qT},
 V1:function(a){var z,y,x,w,v
 z=this.av
 y=this.eZ
 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.eZ=0
 this.av=0;++this.qT}},
-bu:function(a){return H.mx(this,"{","}")},
+bu:function(a){return P.m4(this,"{","}")},
 AR:function(){var z,y,x,w
 z=this.av
 if(z===this.eZ)throw H.b(P.w("No elements"));++this.qT
@@ -6455,33 +6267,16 @@
 y[z]=null
 this.av=(z+1&x-1)>>>0
 return w},
-NZ:function(a,b){var z,y
+NZ:function(a){var z,y,x
 z=this.v5
 y=this.eZ
-if(y>>>0!==y||y>=z.length)return H.e(z,y)
-z[y]=b
-y=(y+1&this.v5.length-1)>>>0
-this.eZ=y
-if(this.av===y)this.VW();++this.qT},
-bB:function(a){var z,y,x,w,v,u,t,s
-z=this.v5.length-1
-if((a-this.av&z)>>>0<J.mQ(J.xH(this.eZ,a),z)){for(y=this.av,x=this.v5,w=x.length,v=a;v!==y;v=u){u=(v-1&z)>>>0
-if(u<0||u>=w)return H.e(x,u)
-t=x[u]
-if(v<0||v>=w)return H.e(x,v)
-x[v]=t}if(y>=w)return H.e(x,y)
-x[y]=null
-this.av=(y+1&z)>>>0
-return(a+1&z)>>>0}else{y=J.mQ(J.xH(this.eZ,1),z)
-this.eZ=y
-for(x=this.v5,w=x.length,v=a;v!==y;v=s){s=(v+1&z)>>>0
-if(s<0||s>=w)return H.e(x,s)
-t=x[s]
-if(v<0||v>=w)return H.e(x,v)
-x[v]=t}if(y>=w)return H.e(x,y)
-x[y]=null
-return a}},
-VW:function(){var z,y,x,w
+x=z.length
+if(y<0||y>=x)return H.e(z,y)
+z[y]=a
+x=(y+1&x-1)>>>0
+this.eZ=x
+if(this.av===x)this.M9();++this.qT},
+M9:function(){var z,y,x,w
 z=Array(this.v5.length*2)
 z.fixed$length=init
 y=H.VM(z,[H.Kp(this,0)])
@@ -6495,36 +6290,30 @@
 this.av=0
 this.eZ=this.v5.length
 this.v5=y},
-wR:function(a){var z,y,x,w
+GP:function(a){var z,y,x,w,v
 z=this.av
 y=this.eZ
-if(typeof y!=="number")return H.s(y)
-if(z<=y){x=y-z
-z=this.v5
-y=this.av
-H.qG(a,0,x,z,y)
-return x}else{y=this.v5
-w=y.length-z
-H.qG(a,0,w,y,z)
+x=this.v5
+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.eZ
-if(typeof z!=="number")return H.s(z)
 y=this.v5
-H.qG(a,w,w+z,y,0)
-return J.WB(this.eZ,w)}},
+H.qG(a,v,v+z,y,0)
+return this.eZ+v}},
 Eo:function(a,b){var z=Array(8)
 z.fixed$length=init
 this.v5=H.VM(z,[b])},
 $isyN:true,
-$isQV:true,
-$asQV:null,
-static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
-z.Eo(a,b)
-return z},ua:[function(a){var z
+$iscX:true,
+$ascX:null,
+static:{"^":"TN",Pd: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}},"$1","bD",2,0,null,203,[]]}},
-o0:{
+if(z===0)return a}}}},
+KG:{
 "^":"a;Lz,pP,qT,Dc,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
@@ -6538,13 +6327,64 @@
 this.fD=z[y]
 this.Dc=(y+1&x-1)>>>0
 return!0}},
+lf:{
+"^":"a;",
+gl0:function(a){return this.gB(this)===0},
+gor:function(a){return this.gB(this)!==0},
+V1:function(a){this.Ex(this.br(0))},
+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.Kp(a,0)]);z.G();)this.Rz(0,z.lo)},
+tt:function(a,b){var z,y,x,w,v
+if(b){z=H.VM([],[H.ip(this,"lf",0)])
+C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
+y.fixed$length=init
+z=H.VM(y,[H.ip(this,"lf",0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
+v=x+1
+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.ip(this,"lf",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQO",ret:P.cX,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lf")},48],
+bu:function(a){return P.m4(this,"{","}")},
+ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"lf",0)])},
+Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.ip(this,"lf",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.cX,args:[{func:"D6",ret:P.cX,args:[a]}]}},this.$receiver,"lf")},48],
+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
+x=H.d(z.gl())
+y.vM+=x}}return y.vM},
+Vr:function(a,b){var z
+for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
+return!1},
+grZ:function(a){var z,y
+z=this.gA(this)
+if(!z.G())throw H.b(H.DU())
+do y=z.gl()
+while(z.G())
+return y},
+$isyN:true,
+$iscX:true,
+$ascX:null},
+Yw:{
+"^":"a+lf;",
+$isyN:true,
+$iscX:true,
+$ascX:null},
 qv:{
 "^":"a;G3>,Bb>,T8>",
 $isqv:true},
 jp:{
 "^":"qv;P*,G3,Bb,T8",
 $asqv:function(a,b){return[a]}},
-GZ:{
+Xt:{
 "^":"a;",
 vh:function(a){var z,y,x,w,v,u,t,s
 z=this.aY
@@ -6580,21 +6420,7 @@
 y.T8=null
 y.Bb=null;++this.bb
 return v},
-Xu: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.de(this.vh(a),0))return
-z=this.aY;--this.P6
-y=z.Bb
-if(y==null)this.aY=z.T8
-else{x=z.T8
-y=this.Xu(y)
-this.aY=y
-y.T8=x}++this.qT
-return z},
-fS:function(a,b){var z,y;++this.P6;++this.qT
+K8:function(a,b){var z,y;++this.J0;++this.qT
 if(this.aY==null){this.aY=a
 return}z=J.u6(b,0)
 y=this.aY
@@ -6603,26 +6429,21 @@
 y.T8=null}else{a.T8=y
 a.Bb=y.Bb
 y.Bb=null}this.aY=a}},
-Nb:{
-"^":"GZ;Cw,ac,aY,iW,P6,qT,bb",
+Ba:{
+"^":"Xt;Cw,hg,aY,iW,J0,qT,bb",
 wS:function(a,b){return this.Cw.$2(a,b)},
-Ef:function(a){return this.ac.$1(a)},
+Ef:function(a){return this.hg.$1(a)},
 yV:function(a,b){return this.wS(a,b)},
 t:function(a,b){if(b==null)throw H.b(P.u(b))
 if(this.Ef(b)!==!0)return
-if(this.aY!=null)if(J.de(this.vh(b),0))return this.aY.P
-return},
-Rz:function(a,b){var z
-if(this.Ef(b)!==!0)return
-z=this.bB(b)
-if(z!=null)return z.P
+if(this.aY!=null)if(J.xC(this.vh(b),0))return this.aY.P
 return},
 u:function(a,b,c){var z
 if(b==null)throw H.b(P.u(b))
 z=this.vh(b)
-if(J.de(z,0)){this.aY.P=c
-return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},
-FV:function(a,b){J.kH(b,new P.bF(this))},
+if(J.xC(z,0)){this.aY.P=c
+return}this.K8(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},
 aN:function(a,b){var z,y,x
@@ -6632,81 +6453,70 @@
 for(;y.G();){x=y.gl()
 z=J.RE(x)
 b.$2(z.gG3(x),z.gP(x))}},
-gB:function(a){return this.P6},
+gB:function(a){return this.J0},
 V1:function(a){this.aY=null
-this.P6=0;++this.qT},
-x4:function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},
-di:function(a){return new P.BW(this,a,this.bb).$1(this.aY)},
-gvc:function(){return H.VM(new P.OG(this),[H.Kp(this,0)])},
-gUQ:function(a){var z=new P.uM(this)
+this.J0=0;++this.qT},
+gvc:function(){return H.VM(new P.nF(this),[H.Kp(this,0)])},
+gUQ:function(a){var z=new P.ro(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 bu:function(a){return P.vW(this)},
-$isNb:true,
-$asGZ:function(a,b){return[a]},
+$isBa:true,
+$asXt:function(a,b){return[a]},
 $asZ0:null,
 $isZ0:true,
 static:{GV:function(a,b,c,d){var z,y
 z=P.n4()
 y=new P.An(c)
-return H.VM(new P.Nb(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
+return H.VM(new P.Ba(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Tp:116;a",
-$1:[function(a){var z=H.XY(a,this.a)
-return z},"$1",null,2,0,null,122,[],"call"],
+"^":"Xs:10;a",
+$1:function(a){var z=H.IU(a,this.a)
+return z},
 $isEH:true},
-bF:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+QG:{
+"^":"Xs;a",
+$2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
-$signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Nb")}},
-BW:{
-"^":"Tp:377;a,b,c",
-$1:[function(a){var z,y,x,w
-for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
-if(z!==y.bb)throw H.b(P.a4(y))
-w=a.T8
-if(w!=null&&this.$1(w)===!0)return!0
-a=a.Bb}return!1},"$1",null,2,0,null,273,[],"call"],
-$isEH:true},
+$signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
 S6B:{
 "^":"a;",
 gl:function(){var z=this.ya
 if(z==null)return
 return this.Wb(z)},
-zw:function(a){var z
+Az:function(a){var z
 for(z=this.Jt;a!=null;){z.push(a)
-a=J.NI(a)}},
+a=a.Bb}},
 G:function(){var z,y,x
-z=this.Dn
+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
 C.Nm.sB(y,0)
-if(x==null)this.zw(z.aY)
-else{z.vh(J.WI(x))
-this.zw(z.aY.T8)}}if(0>=y.length)return H.e(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)
 z=y.pop()
 this.ya=z
-this.zw(J.xP(z))
+this.Az(z.T8)
 return!0},
-Qf:function(a,b){this.zw(a.aY)}},
-OG:{
-"^":"mW;Dn",
-gB:function(a){return this.Dn.P6},
-gl0:function(a){return this.Dn.P6===0},
+Qf:function(a,b){this.Az(a.aY)}},
+nF:{
+"^":"mW;lT",
+gB:function(a){return this.lT.J0},
+gl0:function(a){return this.lT.J0===0},
 gA:function(a){var z,y
-z=this.Dn
+z=this.lT
 y=new P.DN(z,H.VM([],[P.qv]),z.qT,z.bb,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 y.Qf(z,H.Kp(this,0))
 return y},
 $isyN:true},
-uM:{
+ro:{
 "^":"mW;Fb",
-gB:function(a){return this.Fb.P6},
-gl0:function(a){return this.Fb.P6===0},
+gB:function(a){return this.Fb.J0},
+gl0:function(a){return this.Fb.J0===0},
 gA:function(a){var z,y
 z=this.Fb
 y=new P.ZM(z,H.VM([],[P.qv]),z.qT,z.bb,null)
@@ -6714,37 +6524,37 @@
 y.Qf(z,H.Kp(this,1))
 return y},
 $asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]},
+$ascX:function(a,b){return[b]},
 $isyN:true},
 DN:{
-"^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:function(a){return J.WI(a)}},
+"^":"S6B;lT,Jt,qT,bb,ya",
+Wb:function(a){return a.G3}},
 ZM:{
-"^":"S6B;Dn,Jt,qT,bb,ya",
-Wb:function(a){return J.Vm(a)},
+"^":"S6B;lT,Jt,qT,bb,ya",
+Wb:function(a){return a.P},
 $asS6B:function(a,b){return[b]}},
 HW:{
-"^":"S6B;Dn,Jt,qT,bb,ya",
+"^":"S6B;lT,Jt,qT,bb,ya",
 Wb:function(a){return a},
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
-VQ:[function(a,b){var z=b==null?new P.JC():b
-return z.$2(null,new P.f1(z).$1(a))},"$2","os",4,0,null,204,[],205,[]],
-BS:[function(a,b){var z,y,x,w
+Uw:function(a,b){var z=b==null?new P.JC():b
+return z.$2(null,new P.f1(z).$1(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)},"$2","H4",4,0,null,33,[],205,[]],
-tp:[function(a){return a.Lt()},"$1","BC",2,0,206,6,[]],
+throw H.b(P.cD(String(y)))}return P.Uw(z,b)},
+tp:[function(a){return a.Bu()},"$1","Mn",2,0,27,28],
 JC:{
-"^":"Tp:300;",
-$2:[function(a,b){return b},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Xs:51;",
+$2:function(a,b){return b},
 $isEH:true},
 f1:{
-"^":"Tp:116;a",
-$1:[function(a){var z,y,x,w,v,u,t
+"^":"Xs:10;a",
+$1:function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){z=a
 for(y=this.a,x=0;x<z.length;++x)z[x]=y.$2(x,this.$1(z[x]))
@@ -6753,48 +6563,48 @@
 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},"$1",null,2,0,null,21,[],"call"],
+return v},
 $isEH:true},
-Uk:{
+Wf:{
 "^":"a;"},
 zF:{
 "^":"a;"},
-Zi:{
-"^":"Uk;",
-$asUk:function(){return[J.O,[J.Q,J.bU]]}},
+Ziv:{
+"^":"Wf;",
+$asWf:function(){return[P.qU,[P.WO,P.KN]]}},
 Ud:{
-"^":"Ge;Ct,FN",
+"^":"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."},
-static:{NM:function(a,b){return new P.Ud(a,b)}}},
+static:{Gy:function(a,b){return new P.Ud(a,b)}}},
 K8:{
 "^":"Ud;Ct,FN",
 bu:function(a){return"Cyclic error in JSON stringify"},
 static:{TP:function(a){return new P.K8(a,null)}}},
-by:{
-"^":"Uk;N5<,iY",
-pW:function(a,b){return P.BS(a,this.gHe().N5)},
+D4:{
+"^":"Wf;qa<,fO",
+pW:function(a,b){return P.jc(a,this.gHe().qa)},
 kV:function(a){return this.pW(a,null)},
-Co:function(a,b){var z=this.gZE()
-return P.Ks(a,z.Xi,z.UM)},
-KP:function(a){return this.Co(a,null)},
-gZE:function(){return C.cb},
+Q0:function(a,b){var z=this.gZE()
+return P.Vg(a,z.Xn,z.UM)},
+KP:function(a){return this.Q0(a,null)},
+gZE:function(){return C.Sr},
 gHe:function(){return C.A3},
-$asUk:function(){return[P.a,J.O]}},
+$asWf:function(){return[P.a,P.qU]}},
 ze:{
-"^":"zF;UM,Xi",
-$aszF:function(){return[P.a,J.O]}},
+"^":"zF;UM,Xn",
+$aszF:function(){return[P.a,P.qU]}},
 Cf:{
-"^":"zF;N5<",
-$aszF:function(){return[J.O,P.a]}},
+"^":"zF;qa<",
+$aszF:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;iY,Vy,bV",
-Wt:function(a){return this.iY.$1(a)},
-aK:function(a){var z,y,x,w,v,u,t
+"^":"a;fO,cP,ol",
+iY:function(a){return this.fO.$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.Vy
+x=this.cP
 w=0
 v=0
 for(;v<y;++v){u=z.j(a,v)
@@ -6839,59 +6649,55 @@
 else if(w<y){z=z.Nj(a,w,y)
 x.vM+=z}},
 WD:function(a){var z,y,x,w
-for(z=this.bV,y=z.length,x=0;x<y;++x){w=z[x]
+for(z=this.ol,y=z.length,x=0;x<y;++x){w=z[x]
 if(a==null?w==null:a===w)throw H.b(P.TP(a))}z.push(a)},
-rl:function(a){var z,y,x,w
+C7:function(a){var z,y,x,w
 if(!this.IS(a)){this.WD(a)
-try{z=this.Wt(a)
-if(!this.IS(z)){x=P.NM(a,null)
-throw H.b(x)}x=this.bV
+try{z=this.iY(a)
+if(!this.IS(z)){x=P.Gy(a,null)
+throw H.b(x)}x=this.ol
 if(0>=x.length)return H.e(x,0)
 x.pop()}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.NM(a,y))}}},
+throw H.b(P.Gy(a,y))}}},
 IS:function(a){var z,y,x,w,v,u
 if(typeof a==="number"){if(!C.CD.gx8(a))return!1
-this.Vy.KF(C.CD.bu(a))
-return!0}else if(a===!0){this.Vy.KF("true")
-return!0}else if(a===!1){this.Vy.KF("false")
-return!0}else if(a==null){this.Vy.KF("null")
-return!0}else if(typeof a==="string"){z=this.Vy
+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
 z.KF("\"")
-this.aK(a)
+this.Ip(a)
 z.KF("\"")
 return!0}else{z=J.x(a)
-if(!!z.$isList){this.WD(a)
-y=this.Vy
+if(!!z.$isWO){this.WD(a)
+y=this.cP
 y.KF("[")
-if(J.z8(z.gB(a),0)){this.rl(z.t(a,0))
-x=1
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-y.vM+=","
-this.rl(z.t(a,x));++x}}y.KF("]")
-this.Ei(a)
+if(z.gB(a)>0){this.C7(z.t(a,0))
+for(x=1;x<z.gB(a);++x){y.vM+=","
+this.C7(z.t(a,x))}}y.KF("]")
+this.pg(a)
 return!0}else if(!!z.$isZ0){this.WD(a)
-y=this.Vy
+y=this.cP
 y.KF("{")
-for(w=J.GP(a.gvc()),v="\"";w.G();v=",\""){u=w.gl()
+for(w=J.mY(a.gvc()),v="\"";w.G();v=",\""){u=w.gl()
 y.vM+=v
-this.aK(u)
+this.Ip(u)
 y.vM+="\":"
-this.rl(z.t(a,u))}y.KF("}")
-this.Ei(a)
+this.C7(z.t(a,u))}y.KF("}")
+this.pg(a)
 return!0}else return!1}},
-Ei:function(a){var z=this.bV
+pg:function(a){var z=this.ol
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"P3,hyY,FC,zf,fc,fg,Do,bz,eJ,Ho,ql,XI,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Ks:[function(a,b,c){var z
-b=P.BC()
+static:{"^":"P3,hyY,IE,Jyf,NoV,fg,Wk,WF,E7,Ho,vk,NXu,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
+b=P.Mn()
 z=P.p9("")
-P.uI(z,b,c).rl(a)
-return z.vM},"$3","nB",6,0,null,6,[],207,[],208,[]]}},
-z0:{
-"^":"Zi;lH",
+P.uI(z,b,c).C7(a)
+return z.vM}}},
+Fd:{
+"^":"Ziv;IE",
 goc:function(a){return"utf-8"},
 gZE:function(){return new P.om()}},
 om:{
@@ -6900,84 +6706,84 @@
 z=J.U6(a)
 y=J.vX(z.gB(a),3)
 if(typeof y!=="number")return H.s(y)
-y=H.VM(Array(y),[J.bU])
-x=new P.Rw(0,0,y)
-if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
-return C.Nm.D6(y,0,x.ZP)},
-$aszF:function(){return[J.O,[J.Q,J.bU]]}},
-Rw:{
-"^":"a;WF,ZP,EN",
-Lb:function(a,b){var z,y,x,w,v
-z=this.EN
-y=this.ZP
+y=H.VM(Array(y),[P.KN])
+x=new P.Yu(0,0,y)
+if(x.rw(a,0,z.gB(a))!==z.gB(a))x.GT(z.j(a,J.Hn(z.gB(a),1)),0)
+return C.Nm.aM(y,0,x.L8)},
+$aszF:function(){return[P.qU,[P.WO,P.KN]]}},
+Yu:{
+"^":"a;So,L8,IT",
+GT:function(a,b){var z,y,x,w,v
+z=this.IT
+y=this.L8
 if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
 w=y+1
-this.ZP=w
+this.L8=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=(240|x>>>18)>>>0
 y=w+1
-this.ZP=y
+this.L8=y
 if(w>=v)return H.e(z,w)
 z[w]=128|x>>>12&63
 w=y+1
-this.ZP=w
+this.L8=w
 if(y>=v)return H.e(z,y)
 z[y]=128|x>>>6&63
-this.ZP=w+1
+this.L8=w+1
 if(w>=v)return H.e(z,w)
 z[w]=128|x&63
 return!0}else{w=y+1
-this.ZP=w
+this.L8=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=224|a>>>12
 y=w+1
-this.ZP=y
+this.L8=y
 if(w>=v)return H.e(z,w)
 z[w]=128|a>>>6&63
-this.ZP=y+1
+this.L8=y+1
 if(y>=v)return H.e(z,y)
 z[y]=128|a&63
 return!1}},
-fJ:function(a,b,c){var z,y,x,w,v,u,t,s
-if(b!==c&&(J.lE(a,J.xH(c,1))&64512)===55296)c=J.xH(c,1)
+rw:function(a,b,c){var z,y,x,w,v,u,t,s
+if(b!==c&&(J.FW(a,J.Hn(c,1))&64512)===55296)c=J.Hn(c,1)
 if(typeof c!=="number")return H.s(c)
-z=this.EN
+z=this.IT
 y=z.length
 x=J.rY(a)
 w=b
 for(;w<c;++w){v=x.j(a,w)
-if(v<=127){u=this.ZP
+if(v<=127){u=this.L8
 if(u>=y)break
-this.ZP=u+1
-z[u]=v}else if((v&64512)===55296){if(this.ZP+3>=y)break
+this.L8=u+1
+z[u]=v}else if((v&64512)===55296){if(this.L8+3>=y)break
 t=w+1
-if(this.Lb(v,x.j(a,t)))w=t}else if(v<=2047){u=this.ZP
+if(this.GT(v,x.j(a,t)))w=t}else if(v<=2047){u=this.L8
 s=u+1
 if(s>=y)break
-this.ZP=s
+this.L8=s
 if(u>=y)return H.e(z,u)
 z[u]=192|v>>>6
-this.ZP=s+1
-z[s]=128|v&63}else{u=this.ZP
+this.L8=s+1
+z[s]=128|v&63}else{u=this.L8
 if(u+2>=y)break
 s=u+1
-this.ZP=s
+this.L8=s
 if(u>=y)return H.e(z,u)
 z[u]=224|v>>>12
 u=s+1
-this.ZP=u
+this.L8=u
 if(s>=y)return H.e(z,s)
 z[s]=128|v>>>6&63
-this.ZP=u+1
+this.L8=u+1
 if(u>=y)return H.e(z,u)
 z[u]=128|v&63}}return w},
-static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
+static:{"^":"Jf"}}}],["dart.core","dart:core",,P,{
 "^":"",
-Te:[function(a){return},"$1","Ex",2,0,null,51,[]],
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,209,118,[],199,[]],
-hl:[function(a){var z,y,x,w,v
+Te:function(a){return},
+Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,29,24,25],
+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="\""
@@ -6994,71 +6800,74 @@
 else{w=H.Lw(v)
 w=z.vM+=w}}y=w+"\""
 z.vM=y
-return y}return"Instance of '"+H.lh(a)+"'"},"$1","Zx",2,0,null,6,[]],
+return y}return"Instance of '"+H.lh(a)+"'"},
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,212,118,[],199,[]],
-NS:[function(a){return H.CU(a)},"$1","cE",2,0,213,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,214,85,85,33,[],34,[],175,[]],
-O8:function(a,b,c){var z,y,x
-z=J.Qi(a,c)
-if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
-return z},
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,30],
+QP:[function(a){return H.CU(a)},"$1","V4",2,0,31],
 F:function(a,b,c){var z,y
 z=H.VM([],[c])
-for(y=J.GP(a);y.G();)z.push(y.gl())
+for(y=J.mY(a);y.G();)z.push(y.gl())
 if(b)return z
 z.fixed$length=init
 return z},
-JS:[function(a){var z,y
-z=H.d(a)
-y=$.oK
-if(y==null)H.qw(z)
-else y.$1(z)},"$1","Pl",2,0,null,6,[]],
-HB:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"$2",null,4,0,null,146,[],30,[],"call"],
+FL:function(a){var z=H.d(a)
+H.qw(z)},
+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)
+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
+if(t){u=H.Lw(v)
+y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
+y.vM+=u}else{u=H.Lw(37)
+y.vM+=u
+z.$2(v,y)}}return y.vM},
+qa:{
+"^":"Xs:51;a",
+$2:function(a,b){this.a.u(0,a.gfN(),b)},
 $isEH:true},
 CL:{
-"^":"Tp:359;a",
-$2:[function(a,b){var z=this.a
+"^":"Xs:89;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(a.gfN())
 z.a.KF(": ")
-z.a.KF(P.hl(b));++z.b},"$2",null,4,0,null,49,[],30,[],"call"],
+z.a.KF(P.hl(b));++z.b},
 $isEH:true},
-p4:{
-"^":"a;OF",
-bu:function(a){return"Deprecated feature. Will be removed "+this.OF}},
 a2:{
 "^":"a;",
-bu:function(a){return this?"true":"false"},
-$isbool:true},
-Tx:{
+$isa2:true},
+"+bool":0,
+Rz:{
 "^":"a;"},
 iP:{
-"^":"a;y3<,aL",
+"^":"a;y3<,SF",
 n:function(a,b){if(b==null)return!1
 if(!J.x(b).$isiP)return!1
-return this.y3===b.y3&&this.aL===b.aL},
+return this.y3===b.y3&&this.SF===b.SF},
 iM:function(a,b){return C.CD.iM(this.y3,b.gy3())},
 giO:function(a){return this.y3},
 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)
-x=P.h0(z?H.o2(this).getUTCMonth()+1:H.o2(this).getMonth()+1)
-w=P.h0(z?H.o2(this).getUTCDate()+0:H.o2(this).getDate()+0)
-v=P.h0(z?H.o2(this).getUTCHours()+0:H.o2(this).getHours()+0)
-u=P.h0(z?H.o2(this).getUTCMinutes()+0:H.o2(this).getMinutes()+0)
-t=P.h0(z?H.o2(this).getUTCSeconds()+0:H.o2(this).getSeconds()+0)
-s=P.Vx(z?H.o2(this).getUTCMilliseconds()+0:H.o2(this).getMilliseconds()+0)
+z=this.SF
+y=P.Gq(z?H.U8(this).getUTCFullYear()+0:H.U8(this).getFullYear()+0)
+x=P.h0(z?H.U8(this).getUTCMonth()+1:H.U8(this).getMonth()+1)
+w=P.h0(z?H.U8(this).getUTCDate()+0:H.U8(this).getDate()+0)
+v=P.h0(z?H.U8(this).getUTCHours()+0:H.U8(this).getHours()+0)
+u=P.h0(z?H.U8(this).getUTCMinutes()+0:H.U8(this).getMinutes()+0)
+t=P.h0(z?H.U8(this).getUTCSeconds()+0:H.U8(this).getSeconds()+0)
+s=P.Vx(z?H.U8(this).getUTCMilliseconds()+0:H.U8(this).getMilliseconds()+0)
 if(z)return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s+"Z"
 else return y+"-"+x+"-"+w+" "+v+":"+u+":"+t+"."+s},
-h:function(a,b){return P.Wu(this.y3+b.gVs(),this.aL)},
-EK:function(){H.o2(this)},
+h:function(a,b){return P.Wu(this.y3+b.gVs(),this.SF)},
+EK:function(){H.U8(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gio,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=new H.VR(H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
+static:{"^":"aV,Vp,Eu,Kw,h2,mo,EQe,Qg,H9,Gio,Fz,LC,E03,KeL,Ne,NrX,Dk,o4I,hZ,ek0,TO,fQ",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.ol("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
 if(1>=x.length)return H.e(x,1)
@@ -7081,47 +6890,51 @@
 if(8>=o)return H.e(x,8)
 if(x[8]!=null){if(9>=o)return H.e(x,9)
 o=x[9]
-if(o!=null){n=J.de(o,"-")?-1:1
+if(o!=null){n=J.xC(o,"-")?-1:1
 if(10>=x.length)return H.e(x,10)
 m=H.BU(x[10],null,null)
 if(11>=x.length)return H.e(x,11)
 l=y.$1(x[11])
 if(typeof m!=="number")return H.s(m)
-l=J.WB(l,60*m)
+l=J.ew(l,60*m)
 if(typeof l!=="number")return H.s(l)
-s=J.xH(s,n*l)}k=!0}else k=!1
-j=H.zW(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"$1","le",2,0,null,210,[]],Wu:function(a,b){var z=new P.iP(a,b)
+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)
 z.RM(a,b)
-return z},Gq:[function(a){var z,y
+return z},Gq:function(a){var z,y
 z=Math.abs(a)
 y=a<0?"-":""
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},"$1","Cp",2,0,null,211,[]],Vx:[function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},Vx:function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
-return"00"+a},"$1","Dv",2,0,null,211,[]],h0:[function(a){if(a>=10)return""+a
-return"0"+a},"$1","wI",2,0,null,211,[]]}},
+return"00"+a},h0:function(a){if(a>=10)return""+a
+return"0"+a}}},
 MF:{
-"^":"Tp:379;",
-$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"$1",null,2,0,null,378,[],"call"],
+"^":"Xs:90;",
+$1:function(a){if(a==null)return 0
+return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"Tp:380;",
-$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"$1",null,2,0,null,378,[],"call"],
+"^":"Xs:91;",
+$1:function(a){if(a==null)return 0
+return H.RR(a,null)},
 $isEH:true},
+CP:{
+"^":"FK;",
+$isCP:true},
+"+double":0,
 a6:{
 "^":"a;Fq<",
-g:function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},
-W:function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},
+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)},
 U:function(a,b){if(typeof b!=="number")return H.s(b)
-return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},
-Z:function(a,b){if(J.de(b,0))throw H.b(P.ts())
+return P.ii(0,0,C.CD.yu(C.CD.UD(this.Fq*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.k5(0,0,C.CD.Z(this.Fq,b),0,0,0)},
+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()},
@@ -7133,97 +6946,95 @@
 giO:function(a){return this.Fq&0x1FFFFFFF},
 iM:function(a,b){return C.CD.iM(this.Fq,b.gFq())},
 bu:function(a){var z,y,x,w,v
-z=new P.DW()
+z=new P.wr()
 y=this.Fq
-if(y<0)return"-"+P.k5(0,0,-y,0,0,0).bu(0)
+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))
 v=new P.P7().$1(C.CD.JV(y,1000000))
 return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
 $isa6:true,
-static:{"^":"Bk,S4d,pk,LoB,zj5,b2H,jS,ll,DoM,f4,za,IJZ,iI,Wr,fm,rGr",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"YN,v7,dko,LoB,RD,b2H,q9,ll,DoM,CvD,MV,IJZ,iI,Wr,Nw,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:{
-"^":"Tp:121;",
-$1:[function(a){if(a>=100000)return H.d(a)
+"^":"Xs:12;",
+$1:function(a){if(a>=100000)return H.d(a)
 if(a>=10000)return"0"+H.d(a)
 if(a>=1000)return"00"+H.d(a)
 if(a>=100)return"000"+H.d(a)
 if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
+return"00000"+H.d(a)},
 $isEH:true},
-DW:{
-"^":"Tp:121;",
-$1:[function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
+wr:{
+"^":"Xs:12;",
+$1:function(a){if(a>=10)return H.d(a)
+return"0"+H.d(a)},
 $isEH:true},
-Ge:{
+XS:{
 "^":"a;",
-gI4:function(){return new H.XO(this.$thrownJsError,null)},
-$isGe:true},
+gI4:function(){return new H.oP(this.$thrownJsError,null)},
+$isXS:true},
 LK:{
-"^":"Ge;",
+"^":"XS;",
 bu:function(a){return"Throw of null."}},
 AT:{
-"^":"Ge;G1>",
+"^":"XS;G1>",
 bu:function(a){var z=this.G1
 if(z!=null)return"Illegal argument(s): "+H.d(z)
 return"Illegal argument(s)"},
 static:{u:function(a){return new P.AT(a)}}},
-bJ:{
+Sn:{
 "^":"AT;G1",
 bu:function(a){return"RangeError: "+H.d(this.G1)},
-static:{C3:function(a){return new P.bJ(a)},N:function(a){return new P.bJ("value "+H.d(a))},TE:function(a,b,c){return new P.bJ("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
-yd:{
-"^":"Ge;",
-static:{hS:function(){return new P.yd()}}},
+static:{C3: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()}}},
 mp:{
-"^":"Ge;uF,UP,mP,SA,mZ",
+"^":"XS;uF,UP,mP,SA,vG",
 bu:function(a){var z,y,x,w,v,u
 z={}
 z.a=P.p9("")
 z.b=0
-y=this.mP
-if(y!=null)for(x=0;w=y.length,x<w;x=++z.b){if(x>0){v=z.a
+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
 if(x<0)return H.e(y,x)
 u=P.hl(y[x])
-v.vM+=typeof u==="string"?u:H.d(u)}y=this.SA
-if(y!=null)y.aN(0,new P.CL(z))
-return"NoSuchMethodError : method not found: '"+H.d(this.UP)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.vM+"]"},
+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+"]"},
 $ismp:true,
 static:{lr:function(a,b,c,d,e){return new P.mp(a,b,c,d,e)}}},
 ub:{
-"^":"Ge;G1>",
+"^":"XS;G1>",
 bu:function(a){return"Unsupported operation: "+this.G1},
 static:{f:function(a){return new P.ub(a)}}},
 ds:{
-"^":"Ge;G1>",
+"^":"XS;G1>",
 bu:function(a){var z=this.G1
 return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},
-$isGe:true,
+$isXS:true,
 static:{SY:function(a){return new P.ds(a)}}},
 lj:{
-"^":"Ge;G1>",
+"^":"XS;G1>",
 bu:function(a){return"Bad state: "+this.G1},
 static:{w:function(a){return new P.lj(a)}}},
 UV:{
-"^":"Ge;YA",
+"^":"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))+"."},
 static:{a4:function(a){return new P.UV(a)}}},
-TO:{
+vG:{
 "^":"a;",
 bu:function(a){return"Out of Memory"},
 gI4:function(){return},
-$isGe:true},
+$isXS:true},
 VS:{
 "^":"a;",
 bu:function(a){return"Stack Overflow"},
 gI4:function(){return},
-$isGe:true},
+$isXS:true},
 t7:{
-"^":"Ge;Wo",
+"^":"XS;Wo",
 bu:function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},
 static:{Gz:function(a){return new P.t7(a)}}},
 HG:{
@@ -7231,10 +7042,10 @@
 bu:function(a){var z=this.G1
 if(z==null)return"Exception"
 return"Exception: "+H.d(z)}},
-aE:{
+oe:{
 "^":"a;G1>",
 bu:function(a){return"FormatException: "+H.d(this.G1)},
-static:{cD:function(a){return new P.aE(a)}}},
+static:{cD:function(a){return new P.oe(a)}}},
 eV:{
 "^":"a;",
 bu:function(a){return"IntegerDivisionByZeroException"},
@@ -7242,39 +7053,56 @@
 kM:{
 "^":"a;oc>",
 bu:function(a){return"Expando:"+H.d(this.oc)},
-t:function(a,b){var z=H.VK(b,"expando$values")
-return z==null?null:H.VK(z,this.Qz())},
-u:function(a,b,c){var z=H.VK(b,"expando$values")
+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")
 if(z==null){z=new P.a()
-H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},
-Qz:function(){var z,y
-z=H.VK(this,"expando$key")
+H.Ch(b,"expando$values",z)}H.Ch(z,this.J4(),c)},
+J4:function(){var z,y
+z=H.of(this,"expando$key")
 if(z==null){y=$.Ss
 $.Ss=y+1
 z="expando$key$"+y
-H.aw(this,"expando$key",z)}return z},
-static:{"^":"Xa,rly,Ss"}},
+H.Ch(this,"expando$key",z)}return z},
+static:{"^":"bZT,rly,Ss"}},
 EH:{
 "^":"a;",
 $isEH:true},
-QV:{
+KN:{
+"^":"FK;",
+$isKN:true},
+"+int":0,
+cX:{
 "^":"a;",
-$isQV:true,
-$asQV:null},
+$iscX:true,
+$ascX:null},
 AC:{
 "^":"a;"},
+WO:{
+"^":"a;",
+$isWO:true,
+$asWO:null,
+$isyN:true,
+$iscX:true,
+$ascX:null},
+"+List":0,
 Z0:{
 "^":"a;",
 $isZ0:true},
-L9:{
+c8:{
 "^":"a;",
 bu:function(a){return"null"}},
+"+Null":0,
+FK:{
+"^":"a;",
+$isFK:true},
+"+num":0,
 a:{
 "^":";",
 n:function(a,b){return this===b},
 giO:function(a){return H.eQ(this)},
 bu:function(a){return H.a5(this)},
-T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
+T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gZ2(),null))},
 gbx:function(a){return new H.cu(H.dJ(this),null)},
 $isa:true},
 Od:{
@@ -7282,24 +7110,25 @@
 $isOd:true},
 MN:{
 "^":"a;"},
+qU:{
+"^":"a;",
+$isqU:true},
+"+String":0,
 WU:{
-"^":"a;Qk,SU,Oq,Wn",
+"^":"a;Cb,R7,C3,Wn",
 gl:function(){return this.Wn},
 G:function(){var z,y,x,w,v,u
-z=this.Oq
-this.SU=z
-y=this.Qk
-x=J.U6(y)
-if(z===x.gB(y)){this.Wn=null
-return!1}w=x.j(y,this.SU)
-v=this.SU+1
-if((w&64512)===55296){z=x.gB(y)
-if(typeof z!=="number")return H.s(z)
-z=v<z}else z=!1
-if(z){u=x.j(y,v)
-if((u&64512)===56320){this.Oq=v+1
+z=this.C3
+this.R7=z
+y=this.Cb
+x=y.length
+if(z===x){this.Wn=null
+return!1}w=C.xB.j(y,z)
+v=this.R7+1
+if((w&64512)===55296&&v<x){u=C.xB.j(y,v)
+if((u&64512)===56320){this.C3=v+1
 this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
-return!0}}this.Oq=v
+return!0}}this.C3=v
 this.Wn=w
 return!0}},
 Rn:{
@@ -7309,7 +7138,7 @@
 gor:function(a){return this.vM.length!==0},
 KF:function(a){this.vM+=typeof a==="string"?a:H.d(a)},
 We:function(a,b){var z,y
-z=J.GP(a)
+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())
@@ -7324,501 +7153,94 @@
 static:{p9:function(a){var z=new P.Rn("")
 z.PD(a)
 return z}}},
-wv:{
+IN:{
 "^":"a;",
-$iswv:true},
+$isIN:true},
 uq:{
 "^":"a;",
 $isuq:true},
-iD:{
-"^":"a;NN,HC,r0,Fi,ku,tP,Ka,YG,yW",
-gWu:function(){if(this.gJf(this)==="")return""
-var z=P.p9("")
-this.tb(z)
-return z.vM},
-gJf:function(a){var z
-if(C.xB.nC(this.NN,"[")){z=this.NN
-return C.xB.Nj(z,1,z.length-1)}return this.NN},
-gtp:function(a){var z
-if(J.de(this.HC,0)){z=this.Fi
-if(z==="http")return 80
-if(z==="https")return 443}return this.HC},
-Ja:function(a,b){return this.tP.$1(b)},
-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.Kd()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
-return y},
-Ky:function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
-uo:function(a){if(a.length>0&&J.lE(a,0)===58)return!0
-return J.UU(a,"/.")!==-1},
-SK:function(a){var z,y,x,w,v
-if(!this.uo(a))return a
-z=[]
-for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=!1;y.G();){w=y.lo
-if(J.de(w,"..")){v=z.length
-if(v!==0)if(v===1){if(0>=v)return H.e(z,0)
-v=!J.de(z[0],"")}else v=!0
-else v=!1
-if(v){if(0>=z.length)return H.e(z,0)
-z.pop()}x=!0}else if("."===w)x=!0
-else{z.push(w)
-x=!1}}if(x)z.push("")
-return C.Nm.zV(z,"/")},
-tb:function(a){var z=this.ku
-if(""!==z){a.KF(z)
-a.KF("@")}a.KF(this.NN)
-if(!J.de(this.HC,0)){a.KF(":")
-a.KF(J.AG(this.HC))}},
-bu:function(a){var z,y
-z=P.p9("")
-y=this.Fi
-if(""!==y){z.KF(y)
-z.KF(":")}if(this.gJf(this)!==""||y==="file"){z.KF("//")
-this.tb(z)}z.KF(this.r0)
-y=this.tP
-if(""!==y){z.KF("?")
-z.KF(y)}y=this.Ka
-if(""!==y){z.KF("#")
-z.KF(y)}return z.vM},
-n:function(a,b){var z,y
-if(b==null)return!1
-z=J.x(b)
-if(!z.$isiD)return!1
-if(this.Fi===b.Fi)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
-y=b.r0
-z=(z==null?y==null:z===y)&&this.tP===b.tP&&this.Ka===b.Ka}else z=!1
-else z=!1
-else z=!1
-else z=!1
-return z},
-giO:function(a){var z=new P.XZ()
-return z.$2(this.Fi,z.$2(this.ku,z.$2(this.gJf(this),z.$2(this.gtp(this),z.$2(this.r0,z.$2(this.tP,z.$2(this.Ka,1)))))))},
-n3:function(a,b,c,d,e,f,g,h,i){if(h==="http"&&J.de(e,80))this.HC=0
-else if(h==="https"&&J.de(e,443))this.HC=0
-else this.HC=e
-this.r0=this.x6(c,d)},
-$isiD:true,
-static:{"^":"n2,q7,tv,v5,vI,SF,fd,IL,hO,zk,yt,fC,O5,lf,qf,ML,j3,r5,Yk,qs,lL,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,SQU,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
-x=new P.hP()
-w=new P.Uo(a1)
-v=J.U6(a1)
-u=v.gB(a1)
-if(J.de(u,0))return P.R6("","",null,null,0,null,null,null,"")
-if(v.j(a1,0)!==47){if(typeof u!=="number")return H.s(u)
-t=0
-for(;s=0,t<u;t=r){r=t+1
-q=v.j(a1,t)
-if(q<128){p=q>>>4
-if(p>=8)return H.e(C.mK,p)
-p=J.mQ(C.mK[p],C.jn.W4(1,q&15))!==0}else p=!1
-if(!p){if(q===58){s=r
-t=s}else{t=r-1
-s=0}break}}}else{t=0
-s=0}if(s===t){p=s+1
-if(typeof u!=="number")return H.s(u)
-p=p<u&&v.j(a1,s)===47&&v.j(a1,p)===47}else p=!1
-if(p){o=s+2
-for(n=-1;p=J.Wx(o),m=-1,p.C(o,u);){l=p.g(o,1)
-q=v.j(a1,o)
-if(x.$1(q)!==!0)if(q===91)o=w.$1(l)
-else{if(J.de(n,-1)&&q===58);else{p=q===64||q===58
-o=l-1
-if(p){m=v.XU(a1,"@",o)
-if(m===-1){o=t
-break}o=m+1
-for(n=-1;p=J.Wx(o),p.C(o,u);){l=p.g(o,1)
-q=v.j(a1,o)
-if(x.$1(q)!==!0)if(q===91)o=w.$1(l)
-else{if(q===58){if(!J.de(n,-1))throw H.b(P.cD("Double port in host"))}else{o=l-1
-break}o=l
-n=o}else o=l}break}else{m=-1
-break}}o=l
-n=o}else o=l}}else{o=s
-m=-1
-n=-1}for(k=o;x=J.Wx(k),x.C(k,u);k=j){j=x.g(k,1)
-q=v.j(a1,k)
-if(q===63||q===35){k=j-1
-break}}x=J.Wx(k)
-if(x.C(k,u)&&v.j(a1,k)===63)for(i=k;w=J.Wx(i),w.C(i,u);i=h){h=w.g(i,1)
-if(v.j(a1,i)===35){i=h-1
-break}}else i=k
-g=s>0?v.Nj(a1,0,s-1):null
-z=0
-if(s!==o){f=s+2
-if(m>0){e=v.Nj(a1,f,m)
-f=m+1}else e=""
-w=J.Wx(n)
-if(w.D(n,0)){y=v.Nj(a1,n,o)
-try{z=H.BU(y,null,null)}catch(d){H.Ru(d)
-throw H.b(P.cD("Invalid port: '"+H.d(y)+"'"))}c=v.Nj(a1,f,w.W(n,1))}else c=v.Nj(a1,f,o)}else{c=""
-e=""}b=v.Nj(a1,o,k)
-a=x.C(k,i)?v.Nj(a1,x.g(k,1),i):""
-x=J.Wx(i)
-a0=x.C(i,u)?v.Nj(a1,x.g(i,1),u):""
-return P.R6(a0,c,b,null,z,a,null,g,e)},"$1","rp",2,0,null,215,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
-z=new P.iD(P.L7(b),null,null,z,i,P.LE(f,g),P.UJ(a),null,null)
-z.n3(a,b,c,d,e,f,g,h,i)
-return z},L7:[function(a){var z,y
-if(a.length===0)return a
-if(C.xB.j(a,0)===91){z=a.length-1
-if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
-P.eg(C.xB.Nj(a,1,z))
-return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
-if(a.charCodeAt(y)===58){P.eg(a)
-return"["+a+"]"}}return a},"$1","jC",2,0,null,216,[]],iy:[function(a){var z,y,x,w,v,u
-z=new P.hb()
-if(a==null)return""
-y=a.length
-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.mK,u)
-u=J.mQ(C.mK[u],C.jn.W4(1,v&15))!==0}else u=!1
-if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},"$1","Um",2,0,null,217,[]],LE:[function(a,b){var z,y,x
-z={}
-y=a==null
-if(y&&!0)return""
-y=!y
-if(y);if(y)return P.Xc(a)
-x=P.p9("")
-z.a=!0
-C.jN.aN(b,new P.yZ(z,x))
-return x.vM},"$2","wF",4,0,null,218,[],219,[]],UJ:[function(a){return P.Xc(a)},"$1","p7",2,0,null,220,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z={}
-y=J.U6(a).u8(a,"%")
-z.a=y
-if(y<0)return a
-x=new P.Gs()
-w=new P.Tw()
-v=new P.wm(a,x,new P.pm())
-u=new P.FB(a)
-z.b=null
-t=a.length
-z.c=0
-s=new P.Lk(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.Lw(o)
-n.vM+=r}else{n.toString
-n.vM+="%"
-r=v.$1(z.a+1)
-n.toString
-r=H.Lw(r)
-n.vM+=r
-r=z.b
-n=v.$1(z.a+2)
-r.toString
-n=H.Lw(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)},"$1","Sy",2,0,null,221,[]],q5:[function(a){var z,y
-z=new P.Mx()
-y=a.split(".")
-if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"$1","cf",2,0,null,216,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
-z=new P.kZ()
-y=new P.JT(a,z)
-if(J.q8(a)<2)z.$1("address is too short")
-x=[]
-w=0
-u=!1
-t=0
-while(!0){s=J.q8(a)
-if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
-s=a
-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
-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")
-J.wT(x,-1)
-u=!0}else J.wT(x,y.$2(w,t))
-w=t+1}++t}if(J.q8(x)===0)z.$1("too few parts")
-q=J.de(w,J.q8(a))
-p=J.de(J.MQ(x),-1)
-if(q&&!p)z.$1("expected a part after last `:`")
-if(!q)try{J.wT(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
-try{v=P.q5(J.ZZ(a,w))
-s=J.Eh(J.UQ(v,0),8)
-r=J.UQ(v,1)
-if(typeof r!=="number")return H.s(r)
-J.wT(x,(s|r)>>>0)
-r=J.Eh(J.UQ(v,2),8)
-s=J.UQ(v,3)
-if(typeof s!=="number")return H.s(s)
-J.wT(x,(r|s)>>>0)}catch(o){H.Ru(o)
-z.$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
-s=new H.kV(x,new P.d9(x))
-s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"$1","q3",2,0,null,216,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t
-z=new P.rI()
-y=P.p9("")
-x=c.gZE().WJ(b)
-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=J.mQ(a[t],C.jn.W4(1,u.i(v,15)))!==0}else t=!1
-if(t){u=H.Lw(v)
-y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
-y.vM+=u}else{u=H.Lw(37)
-y.vM+=u
-z.$2(v,y)}}return y.vM},"$4$encoding$spaceToPlus","jd",4,5,null,222,223,224,[],225,[],226,[],227,[]]}},
-hP:{
-"^":"Tp:382;",
-$1:[function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.aa,z)
-z=J.mQ(C.aa[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,381,[],"call"],
-$isEH:true},
-Uo:{
-"^":"Tp:383;a",
-$1:[function(a){a=J.aK(this.a,"]",a)
-if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},"$1",null,2,0,null,15,[],"call"],
-$isEH:true},
-hb:{
-"^":"Tp:382;",
-$1:[function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.HE,z)
-z=J.mQ(C.HE[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,381,[],"call"],
-$isEH:true},
-Kd:{
-"^":"Tp:116;",
-$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"$1",null,2,0,null,94,[],"call"],
-$isEH:true},
-yZ:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.a
-if(!z.a)this.b.KF("&")
-z.a=!1
-z=this.b
-z.KF(P.jW(C.kg,a,C.xM,!0))
-b.gl0(b)
-z.KF("=")
-z.KF(P.jW(C.kg,b,C.xM,!0))},"$2",null,4,0,null,49,[],30,[],"call"],
-$isEH:true},
-Gs:{
-"^":"Tp:382;",
-$1:[function(a){var z
-if(!(48<=a&&a<=57))z=65<=a&&a<=70
-else z=!0
-return z},"$1",null,2,0,null,384,[],"call"],
-$isEH:true},
-pm:{
-"^":"Tp:382;",
-$1:[function(a){return 97<=a&&a<=102},"$1",null,2,0,null,384,[],"call"],
-$isEH:true},
-Tw:{
-"^":"Tp:382;",
-$1:[function(a){var z
-if(a<128){z=C.jn.GG(a,4)
-if(z>=8)return H.e(C.kg,z)
-z=J.mQ(C.kg[z],C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,381,[],"call"],
-$isEH:true},
-wm:{
-"^":"Tp:383;b,c,d",
-$1:[function(a){var z,y
-z=this.b
-y=C.xB.j(z,a)
-if(this.d.$1(y)===!0)return y-32
-else if(this.c.$1(y)!==!0)throw H.b(P.u("Invalid URI component: "+z))
-else return y},"$1",null,2,0,null,15,[],"call"],
-$isEH:true},
-FB:{
-"^":"Tp:383;e",
-$1:[function(a){var z,y,x,w
-for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
-if(48<=w&&w<=57)y=y*16+w-48
-else{w|=32
-if(97<=w&&w<=102)y=y*16+w-97+10
-else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return y},"$1",null,2,0,null,15,[],"call"],
-$isEH:true},
-Lk:{
-"^":"Tp:126;a,f",
-$0:[function(){var z,y,x,w,v
-z=this.a
-y=z.b
-x=z.c
-w=this.f
-v=z.a
-if(y==null)z.b=P.p9(C.xB.Nj(w,x,v))
-else y.KF(C.xB.Nj(w,x,v))},"$0",null,0,0,null,"call"],
-$isEH:true},
-XZ:{
-"^":"Tp:386;",
-$2:[function(a,b){var z=J.v1(a)
-if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"$2",null,4,0,null,385,[],254,[],"call"],
-$isEH:true},
-Mx:{
-"^":"Tp:193;",
-$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"$1",null,2,0,null,22,[],"call"],
-$isEH:true},
-C9:{
-"^":"Tp:116;a",
-$1:[function(a){var z,y
-z=H.BU(a,null,null)
-y=J.Wx(z)
-if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,387,[],"call"],
-$isEH:true},
-kZ:{
-"^":"Tp:193;",
-$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"$1",null,2,0,null,22,[],"call"],
-$isEH:true},
-JT:{
-"^":"Tp:388;a,b",
-$2:[function(a,b){var z,y
-if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
-z=H.BU(C.xB.Nj(this.a,a,b),16,null)
-y=J.Wx(z)
-if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
-return z},"$2",null,4,0,null,134,[],135,[],"call"],
-$isEH:true},
-d9:{
-"^":"Tp:116;c",
-$1:[function(a){var z=J.x(a)
-if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},"$1",null,2,0,null,30,[],"call"],
-$isEH:true},
 rI:{
-"^":"Tp:300;",
-$2:[function(a,b){var z=J.Wx(a)
+"^":"Xs:51;",
+$2:function(a,b){var z=J.Wx(a)
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"$2",null,4,0,null,389,[],390,[],"call"],
+b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
-UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
-else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"$1","pq",2,0,228,21,[]],
-r3:[function(a,b){return document.createElement(a)},"$2","Oe",4,0,null,102,[],229,[]],
-It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"$3$onProgress$withCredentials","xF",2,5,null,85,85,230,[],231,[],232,[]],
-lt:[function(a,b,c,d,e,f,g,h){var z,y,x
-z=W.zU
+r3:function(a,b){return document.createElement(a)},
+It: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.W3.eo(x,"GET",a,!0)
-z=C.fK.aM(x)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new W.iO(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
-z=C.MD.aM(x)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
+z=H.VM(new W.RO(x,C.LF.Ph,!1),[null])
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
+z=H.VM(new W.RO(x,C.MD.Ph,!1),[null])
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
-return y.MM},"$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,85,85,85,85,85,85,85,230,[],233,[],231,[],234,[],235,[],236,[],237,[],232,[]],
+return y.MM},
 ED:function(a){var z,y
 z=document.createElement("input",null)
-if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
-C0:[function(a,b){a=536870911&a+b
+if(a!=null)try{J.iM(z,a)}catch(y){H.Ru(y)}return z},
+VC:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","jx",4,0,null,238,[],30,[]],
-Pv:[function(a){if(a==null)return
-return W.P1(a)},"$1","Ie",2,0,null,239,[]],
-qc:[function(a){var z
+return a^a>>>6},
+Pv:function(a){if(a==null)return
+return W.P1(a)},
+qc:function(a){var z
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
-if(!!J.x(z).$isD0)return z
-return}else return a},"$1","Wq",2,0,null,21,[]],
-qr:[function(a){return a},"$1","Ku",2,0,null,21,[]],
-Pd:[function(a){if(!!J.x(a).$isYN)return a
-return P.o7(a,!0)},"$1","ra",2,0,null,99,[]],
-YT:[function(a,b){return new W.vZ(a,b)},"$2","AD",4,0,null,240,[],7,[]],
-GO:[function(a){return J.TD(a)},"$1","V5",2,0,116,48,[]],
-Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,116,48,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","A6",8,0,241,48,[],12,[],242,[],243,[]],
-wi:[function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
-z=J.Xr(d)
-if(z==null)throw H.b(P.u(d))
-y=z.prototype
-x=J.Nq(d,"created")
-if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-J.ks(W.r3("article",null))
-w=z.$nativeSuperclassTag
-if(w==null)throw H.b(P.u(d))
-v=e==null
-if(v){if(!J.de(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.YT(x,y),1))}
-t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.V5(),1))}
-t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.cn(),1))}
-t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.A6(),4))}
-s=Object.create(u.prototype,t)
-r=H.Va(y)
-Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
-q={prototype:s}
-if(!v)q.extends=e
-b.registerElement(c,q)},"$5","uz",10,0,null,97,[],244,[],102,[],11,[],245,[]],
-aF:[function(a){if(J.de($.X3,C.NU))return a
+if(!!J.x(z).$isPZ)return z
+return}else return a},
+ju:function(a){return a},
+Z9:function(a){if(!!J.x(a).$isQF)return a
+return P.o7(a,!0)},
+v8:function(a,b){return new W.vZ(a,b)},
+w6:[function(a){return J.N1(a)},"$1","B4",2,0,10,32],
+Hx:[function(a){return J.vr(a)},"$1","Z6",2,0,10,32],
+Qp:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","A6",8,0,33,32,34,35,36],
+aF:function(a){var z=$.X3
+if(z===C.NU)return a
 if(a==null)return
-return $.X3.oj(a,!0)},"$1","Rj",2,0,null,164,[]],
-K2:[function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},"$1","o6",2,0,null,164,[]],
-qE:{
-"^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|LP|hV|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|Nr|lw|D13|Ir|WZq|rm|Bc|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|IWF|V13|Yj|V14|Oz|V15|YA|V16|qkb|V17|vj|LU|V18|KL|V19|F1|V20|aQ|V21|Qa|V22|Ww|V23|tz|V24|flR|V25|oM|V26|iL|V27|F1i|XP|V28|NQ|V29|SM|x4|knI|V30|fI|V31|zMr|V32|nk|V33|ob|LPc|Uj|V34|xT|V35|uwf|I5|V36|en"},
+return z.Nf(a,!0)},
+Bo:{
+"^":"h4;",
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|qo|ir|LP|hV|uL|Vf|G6|pv|xI|eW|Vfx|aC|VY|Dsd|Be|tuj|i6|Nr|JI|Vct|ZP|D13|nJ|LPc|Eg|i7|WZq|Gk|Zz|DK|pva|BS|cda|Vb|waa|Ly|pR|V5|hx|V8|L4|V10|mO|DE|V11|U1|V12|kK|oa|V13|St|V14|IW|V15|Qh|V16|Oz|V17|Mc|V18|qk|V19|vj|LU|V20|CX|V21|md|V22|Bm|V23|Ya|V24|Ww|V25|G1|V26|fl|V27|UK|V28|wM|V29|F1|V30|qZ|V31|Uy|T53|kn|V32|fI|V33|zM|V34|Rk|V35|Ti|Xfs|CY|V36|nm|V37|uw|I5|V38|el"},
 zw:{
 "^":"Gv;",
-$isList:true,
-$asWO:function(){return[W.nX]},
+$isWO:true,
+$asWO:function(){return[W.M5]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.nX]},
+$iscX:true,
+$ascX:function(){return[W.M5]},
 "%":"EntryArray"},
 Ps:{
-"^":"qE;N:target=,t5:type%,cC:hash%,mH:href=",
+"^":"Bo;N:target=,t5:type%,mH:href=",
 bu:function(a){return a.toString()},
 "%":"HTMLAnchorElement"},
-Sb:{
-"^":"qE;N:target=,cC:hash%,mH:href=",
+fY:{
+"^":"Bo;N:target=,mH:href=",
 bu:function(a){return a.toString()},
 "%":"HTMLAreaElement"},
-Xk:{
-"^":"qE;mH:href=,N:target=",
+rZg:{
+"^":"Bo;mH:href=,N:target=",
 "%":"HTMLBaseElement"},
 b9:{
 "^":"ea;O3:url=",
 "%":"BeforeLoadEvent"},
-Az:{
+O4:{
 "^":"Gv;t5:type=",
-$isAz:true,
+$isO4:true,
 "%":";Blob"},
 Fy:{
-"^":"qE;",
-$isD0:true,
+"^":"Bo;",
+$isPZ:true,
 "%":"HTMLBodyElement"},
-QW:{
-"^":"qE;MB:form=,oc:name%,t5:type%,P:value%",
+IFv:{
+"^":"Bo;MB:form=,oc:name%,t5:type%,P:value%",
 "%":"HTMLButtonElement"},
 Ny:{
-"^":"qE;fg:height%,R:width%",
+"^":"Bo;fg:height},R:width}",
 gVE:function(a){return a.getContext("2d")},
 "%":"HTMLCanvasElement"},
 Oi:{
@@ -7832,51 +7254,50 @@
 if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
 return}throw H.b(P.u("Incorrect number or type of arguments"))},
 "%":"CanvasRenderingContext2D"},
-Zv:{
+Zl:{
 "^":"KV;Rn:data=,B:length=",
 "%":"Comment;CharacterData"},
-Yr:{
+K3:{
 "^":"ea;tT:code=",
 "%":"CloseEvent"},
-di:{
-"^":"Mf;Rn:data=",
+y4:{
+"^":"w6O;Rn:data=",
 "%":"CompositionEvent"},
-He:{
+eC:{
 "^":"ea;",
 gey:function(a){var z=a._dartDetail
 if(z!=null)return z
 return P.o7(a.detail,!0)},
-$isHe:true,
+$iseC:true,
 "%":"CustomEvent"},
-YN:{
+Q3:{
+"^":"Bo;",
+TR:function(a,b){return a.open.$1(b)},
+"%":"HTMLDetailsElement"},
+rV:{
+"^":"Bo;",
+TR:function(a,b){return a.open.$1(b)},
+"%":"HTMLDialogElement"},
+QF:{
 "^":"KV;",
 JP:function(a){return a.createDocumentFragment()},
 Kb:function(a,b){return a.getElementById(b)},
 ek:function(a,b,c){return a.importNode(b,c)},
-gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.pi.aM(a)},
-gLm:function(a){return C.i3.aM(a)},
-gVY:function(a){return C.DK.aM(a)},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-Ja:function(a,b){return a.querySelector(b)},
-pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-$isYN:true,
+Wk:function(a,b){return a.querySelector(b)},
+gi9:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
+gVl:function(a){return H.VM(new W.RO(a,C.pi.Ph,!1),[null])},
+gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
+Md:function(a,b){return W.Ot(a.querySelectorAll(b),null)},
+$isQF:true,
 "%":"Document|HTMLDocument|XMLDocument"},
 Aj:{
 "^":"KV;",
-gwd:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.e7(a)),[null])
+gks:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.wi(a)),[null])
 return a._docChildren},
-swd:function(a,b){var z,y,x
-z=P.F(b,!0,null)
-y=this.gwd(a)
-x=J.w1(y)
-x.V1(y)
-x.FV(y,z)},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-Ja:function(a,b){return a.querySelector(b)},
-pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+Md:function(a,b){return W.Ot(a.querySelectorAll(b),null)},
+Wk:function(a,b){return a.querySelector(b)},
 "%":";DocumentFragment"},
-rv:{
+rz:{
 "^":"Gv;G1:message=,oc:name=",
 "%":";DOMError"},
 Nh:{
@@ -7888,28 +7309,20 @@
 bu:function(a){return a.toString()},
 $isNh:true,
 "%":"DOMException"},
-cv:{
-"^":"KV;xr:className%,jO:id=",
-gQg:function(a){return new W.i7(a)},
-gwd:function(a){return new W.VG(a,a.children)},
-swd:function(a,b){var z,y
-z=P.F(b,!0,null)
-y=this.gwd(a)
-y.V1(0)
-y.FV(0,z)},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-Ja:function(a,b){return a.querySelector(b)},
-pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+h4:{
+"^":"KV;xr:className%,jO:id=,ns:tagName=",
+gQg:function(a){return new W.E9(a)},
+gks:function(a){return new W.VG(a,a.children)},
+Md:function(a,b){return W.Ot(a.querySelectorAll(b),null)},
 gDD:function(a){return new W.I4(a)},
-sDD:function(a,b){var z=this.gDD(a)
-z.V1(0)
-z.FV(z,b)},
-gwl:function(a){return P.T7(a.clientLeft,a.clientTop,a.clientWidth,a.clientHeight,null)},
-gD7:function(a){return P.T7(a.offsetLeft,a.offsetTop,a.offsetWidth,a.offsetHeight,null)},
-i4:function(a){},
-xo:function(a){},
-aC:function(a,b,c,d){},
+gD7:function(a){return P.Ci(a.offsetLeft,a.offsetTop,a.offsetWidth,a.offsetHeight,null)},
+Es:function(a){this.q0(a)},
+dQ:function(a){this.Nz(a)},
+q0:function(a){},
+Nz: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},
 WO:function(a,b){if(!!a.matches)return a.matches(b)
 else if(!!a.webkitMatchesSelector)return a.webkitMatchesSelector(b)
@@ -7917,58 +7330,59 @@
 else if(!!a.msMatchesSelector)return a.msMatchesSelector(b)
 else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
 else throw H.b(P.f("Not supported on this platform"))},
-bA:function(a,b){var z=a
-do{if(J.Kf(z,b))return!0
+jn:function(a,b){var z=a
+do{if(J.RF(z,b))return!0
 z=z.parentElement}while(z!=null)
 return!1},
 er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
 gIW:function(a){return a.shadowRoot||a.webkitShadowRoot},
 gI:function(a){return new W.DM(a,a)},
-PN:function(a,b){return a.getAttribute(b)},
+GE:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
-gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.pi.f0(a)},
-gLm:function(a){return C.i3.f0(a)},
-gVY:function(a){return C.DK.f0(a)},
-gE8:function(a){return C.W2.f0(a)},
+Wk:function(a,b){return a.querySelector(b)},
+gi9:function(a){return H.VM(new W.Cq(a,C.U3.Ph,!1),[null])},
+gVl:function(a){return H.VM(new W.Cq(a,C.pi.Ph,!1),[null])},
+gLm:function(a){return H.VM(new W.Cq(a,C.i3.Ph,!1),[null])},
+gVY:function(a){return H.VM(new W.Cq(a,C.uh.Ph,!1),[null])},
+gf0:function(a){return H.VM(new W.Cq(a,C.Kq.Ph,!1),[null])},
 ZL:function(a){},
-$iscv:true,
-$isD0:true,
+$ish4:true,
+$isPZ:true,
 "%":";Element"},
-Fs:{
-"^":"qE;fg:height%,oc:name%,LA:src=,t5:type%,R:width%",
+lC:{
+"^":"Bo;fg:height},oc:name%,t5:type%,R:width}",
 "%":"HTMLEmbedElement"},
 Ty:{
 "^":"ea;kc:error=,G1:message=",
 "%":"ErrorEvent"},
 ea:{
-"^":"Gv;Bu:_selector},Xt:bubbles=,t5:type=",
+"^":"Gv;It:_selector},Xt:bubbles=,Ii:path=,t5:type=",
 gN:function(a){return W.qc(a.target)},
-aA:function(a){return a.preventDefault()},
+e6:function(a){return a.preventDefault()},
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},
-D0:{
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"},
+PZ:{
 "^":"Gv;",
 gI:function(a){return new W.Jn(a)},
 On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
-Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
-$isD0:true,
+Si:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
+$isPZ:true,
 "%":";EventTarget"},
-as:{
-"^":"qE;MB:form=,oc:name%,t5:type=",
+EN:{
+"^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLFieldSetElement"},
 hH:{
-"^":"Az;oc:name=",
+"^":"O4;oc:name=",
 $ishH:true,
 "%":"File"},
 QU:{
-"^":"rv;tT:code=",
+"^":"rz;tT:code=",
 "%":"FileError"},
-Tq:{
-"^":"qE;B:length=,bP:method=,oc:name%,N:target=",
+YuD:{
+"^":"Bo;B:length=,Sf:method=,oc:name%,N:target=",
 "%":"HTMLFormElement"},
-xn:{
-"^":"Gb;",
+xnd:{
+"^":"ecX;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
@@ -7980,73 +7394,73 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
+$iscX:true,
+$ascX:function(){return[W.KV]},
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
-zU:{
-"^":"wa;iC:responseText=,ys:status=",
-gvJ:function(a){return W.Pd(a.response)},
-R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
+fJ:{
+"^":"rk;il:responseText=,pf:status=",
+gbA:function(a){return W.Z9(a.response)},
+Yh:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
 eo:function(a,b,c,d){return a.open(b,c,d)},
-zY:function(a,b){return a.send(b)},
-$iszU:true,
+wR:function(a,b){return a.send(b)},
+$isfJ:true,
 "%":"XMLHttpRequest"},
-wa:{
-"^":"D0;",
+rk:{
+"^":"PZ;",
 "%":";XMLHttpRequestEventTarget"},
-tX:{
-"^":"qE;fg:height%,oc:name%,LA:src=,R:width%",
+GJ:{
+"^":"Bo;fg:height},oc:name%,R:width}",
 "%":"HTMLIFrameElement"},
 Sg:{
 "^":"Gv;Rn:data=,fg:height=,R:width=",
 $isSg:true,
 "%":"ImageData"},
 pA:{
-"^":"qE;fg:height%,LA:src=,R:width%",
-oo:function(a,b){return a.complete.$1(b)},
+"^":"Bo;fg:height},R:width}",
+j3:function(a,b){return a.complete.$1(b)},
 "%":"HTMLImageElement"},
-Mi:{
-"^":"qE;Tq:checked%,MB:form=,fg:height%,oc:name%,LA:src=,t5:type%,P:value%,R:width%",
+JK:{
+"^":"Bo;d4:checked%,MB:form=,fg:height},jx:list=,oc:name%,t5:type%,P:value%,R:width}",
 RR:function(a,b){return a.accept.$1(b)},
-$isMi:true,
-$iscv:true,
-$isD0:true,
+$isJK:true,
+$ish4:true,
+$isPZ:true,
 $isKV:true,
 "%":"HTMLInputElement"},
-In:{
-"^":"qE;MB:form=,oc:name%,t5:type=",
+ttH:{
+"^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
 wP:{
-"^":"qE;P:value%",
+"^":"Bo;P:value%",
 "%":"HTMLLIElement"},
 eP:{
-"^":"qE;MB:form=",
+"^":"Bo;MB:form=",
 "%":"HTMLLabelElement"},
-AL:{
-"^":"qE;MB:form=",
+mF:{
+"^":"Bo;MB:form=",
 "%":"HTMLLegendElement"},
-Qj:{
-"^":"qE;mH:href=,t5:type%",
-$isQj:true,
+Ogt:{
+"^":"Bo;mH:href=,t5:type%",
 "%":"HTMLLinkElement"},
-ZD:{
-"^":"Gv;cC:hash%,mH:href=",
+cS:{
+"^":"Gv;mH:href=",
 VD:function(a){return a.reload()},
 bu:function(a){return a.toString()},
 "%":"Location"},
-YI:{
-"^":"qE;oc:name%",
+p8:{
+"^":"Bo;oc:name%",
 "%":"HTMLMapElement"},
-El:{
-"^":"qE;kc:error=,LA:src=",
+eL:{
+"^":"Bo;kc:error=",
 xW:function(a){return a.load()},
+yy:[function(a){return a.pause()},"$0","gX0",0,0,15],
 "%":"HTMLAudioElement;HTMLMediaElement",
-static:{"^":"pZ<"}},
-zm:{
+static:{"^":"TH<"}},
+mCi:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
 Y7:{
@@ -8059,88 +7473,62 @@
 "^":"ea;G1:message=",
 "%":"MediaKeyMessageEvent"},
 Rv:{
-"^":"D0;jO:id=,ph:label=",
+"^":"PZ;jO:id=,ph:label=",
 "%":"MediaStream"},
-cx:{
+AW:{
 "^":"ea;",
 gRn:function(a){return P.o7(a.data,!0)},
-$iscx:true,
+$isAW:true,
 "%":"MessageEvent"},
 EeC:{
-"^":"qE;rz:content=,oc:name%",
+"^":"Bo;jb:content=,oc:name%",
 "%":"HTMLMetaElement"},
-E9:{
-"^":"qE;P:value%",
+tJ:{
+"^":"Bo;P:value%",
 "%":"HTMLMeterElement"},
 Hw:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
-bn:{
-"^":"tH;",
-fZ:function(a,b,c){return a.send(b,c)},
-zY:function(a,b){return a.send(b)},
-"%":"MIDIOutput"},
-tH:{
-"^":"D0;jO:id=,oc:name=,t5:type=,Ye:version=",
-"%":"MIDIInput;MIDIPort"},
-Wp:{
-"^":"Mf;",
-nH:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
+Oq:{
+"^":"w6O;",
+nH:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.ju(p))
 return},
-gwl:function(a){return H.VM(new P.hL(a.clientX,a.clientY),[null])},
 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)).$iscv)throw H.b(P.f("offsetX is only supported on elements"))
+if(!!a.offsetX)return H.VM(new P.EX(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.Yq(J.AK(z)))
-return H.VM(new P.hL(J.XH(y.x),J.XH(y.y)),[null])}},
-$isWp:true,
+y=H.VM(new P.EX(a.clientX,a.clientY),[null]).W(0,J.Yq(J.AK(z)))
+return H.VM(new P.EX(J.Kn(y.x),J.Kn(y.y)),[null])}},
+$isOq:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-H9:{
-"^":"Gv;",
-jh:function(a,b,c,d,e,f,g,h,i){var z,y
-z={}
-y=new W.Yg(z)
-y.$2("childList",h)
-y.$2("attributes",e)
-y.$2("characterData",f)
-y.$2("subtree",i)
-y.$2("attributeOldValue",d)
-y.$2("characterDataOldValue",g)
-a.observe(b,z)},
-yN:function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},
-"%":"MutationObserver|WebKitMutationObserver"},
-o4:{
-"^":"Gv;jL:oldValue=,N:target=,t5:type=",
-"%":"MutationRecord"},
 ih:{
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
 KV:{
-"^":"D0;p8:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,KV:parentNode=,a4:textContent%",
-gyT:function(a){return new W.e7(a)},
-wg:function(a){var z=a.parentNode
+"^":"PZ;PZ:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,By:parentNode=,a4:textContent%",
+gUN:function(a){return new W.wi(a)},
+zB: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},
 aD:function(a,b,c){var z,y,x
 z=J.x(b)
-if(!!z.$ise7){z=b.NL
+if(!!z.$iswi){z=b.NL
 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
 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},
-jx:function(a,b){return a.appendChild(b)},
+mx:function(a,b){return a.appendChild(b)},
 tg:function(a,b){return a.contains(b)},
-mK:function(a,b,c){return a.insertBefore(b,c)},
+FO:function(a,b,c){return a.insertBefore(b,c)},
 dR:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
 "%":"DocumentType|Notation;Node"},
-yk:{
-"^":"ma;",
+BH:{
+"^":"w1p;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
@@ -8152,55 +7540,54 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
+$iscX:true,
+$ascX:function(){return[W.KV]},
 $isXj:true,
 "%":"NodeList|RadioNodeList"},
-KY:{
-"^":"qE;t5:type%",
+VSm:{
+"^":"Bo;t5:type%",
 "%":"HTMLOListElement"},
-z3:{
-"^":"qE;Rn:data=,MB:form=,fg:height%,oc:name%,t5:type%,R:width%",
+qb:{
+"^":"Bo;Rn:data=,MB:form=,fg:height},oc:name%,t5:type%,R:width}",
 "%":"HTMLObjectElement"},
 l9:{
-"^":"qE;ph:label%",
+"^":"Bo;ph:label%",
 "%":"HTMLOptGroupElement"},
-Ql:{
-"^":"qE;MB:form=,vH:index=,ph:label%,P:value%",
-$isQl:true,
+UC:{
+"^":"Bo;MB:form=,vH:index=,ph:label%,P:value%",
+$isUC:true,
 "%":"HTMLOptionElement"},
 Xp:{
-"^":"qE;MB:form=,oc:name%,t5:type=,P:value%",
+"^":"Bo;MB:form=,oc:name%,t5:type=,P:value%",
 "%":"HTMLOutputElement"},
 me:{
-"^":"qE;oc:name%,P:value%",
+"^":"Bo;oc:name%,P:value%",
 "%":"HTMLParamElement"},
-jg:{
+j6:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"PositionError"},
-nC:{
-"^":"Zv;N:target=",
+Qls:{
+"^":"Zl;N:target=",
 "%":"ProcessingInstruction"},
 KR:{
-"^":"qE;P:value%",
+"^":"Bo;P:value%",
 "%":"HTMLProgressElement"},
-ew:{
+kQ:{
 "^":"ea;ox:loaded=",
-$isew:true,
+$iskQ:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
-LY:{
-"^":"ew;O3:url=",
+bXi:{
+"^":"kQ;O3:url=",
 "%":"ResourceProgressEvent"},
-j2:{
-"^":"qE;LA:src=,t5:type%",
-$isj2:true,
+Tw:{
+"^":"Bo;t5:type%",
 "%":"HTMLScriptElement"},
-lp:{
-"^":"qE;MB:form=,B:length%,oc:name%,ig:selectedIndex%,t5:type=,P:value%",
-$islp:true,
+bs:{
+"^":"Bo;MB:form=,B:length%,oc:name%,Mj:selectedIndex%,t5:type=,P:value%",
+$isbs:true,
 "%":"HTMLSelectElement"},
 I0:{
 "^":"Aj;",
@@ -8208,101 +7595,89 @@
 $isI0:true,
 "%":"ShadowRoot"},
 QR:{
-"^":"qE;LA:src=,t5:type%",
+"^":"Bo;t5:type%",
 "%":"HTMLSourceElement"},
-uaa:{
-"^":"ea;PK:results=",
+GA:{
+"^":"ea;Cf:results=",
 "%":"SpeechInputEvent"},
 yg:{
 "^":"Gv;",
 "%":"SpeechInputResult"},
-Hd:{
+Cz:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
-Ul:{
-"^":"ea;PK:results=",
+vt:{
+"^":"ea;Cf:results=",
 "%":"SpeechRecognitionEvent"},
-uj:{
-"^":"Gv;B:length=",
+my:{
+"^":"Gv;V5:isFinal=,B:length=",
 "%":"SpeechRecognitionResult"},
-G5:{
+er:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
 kI:{
-"^":"ea;G3:key=,zZ:newValue=,jL:oldValue=,O3:url=",
+"^":"ea;G3:key=,O3:url=",
 "%":"StorageEvent"},
-Lx:{
-"^":"qE;t5:type%",
+fqq:{
+"^":"Bo;t5:type%",
 "%":"HTMLStyleElement"},
-qk:{
-"^":"qE;",
-$isqk:true,
+v6:{
+"^":"Bo;",
+$isv6:true,
 "%":"HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"},
-Tb:{
-"^":"qE;",
-gzU:function(a){return H.VM(new W.uB(a.rows),[W.qp])},
+R1:{
+"^":"Bo;",
+gWT:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
 "%":"HTMLTableElement"},
-qp:{
-"^":"qE;RH:rowIndex=",
-$isqp:true,
+tV:{
+"^":"Bo;RH:rowIndex=",
+$istV:true,
 "%":"HTMLTableRowElement"},
-BT:{
-"^":"qE;",
-gzU:function(a){return H.VM(new W.uB(a.rows),[W.qp])},
+Ix:{
+"^":"Bo;",
+gWT:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
 "%":"HTMLTableSectionElement"},
 yY:{
-"^":"qE;rz:content=",
+"^":"Bo;jb:content=",
 $isyY:true,
 "%":"HTMLTemplateElement"},
-kJ:{
-"^":"Zv;",
-$iskJ:true,
+Un:{
+"^":"Zl;",
+$isUn:true,
 "%":"CDATASection|Text"},
 AE:{
-"^":"qE;MB:form=,oc:name%,zU:rows%,t5:type=,P:value%",
+"^":"Bo;MB:form=,oc:name%,WT:rows=,t5:type=,P:value%",
 $isAE:true,
 "%":"HTMLTextAreaElement"},
-R0:{
-"^":"Mf;Rn:data=",
+xVu:{
+"^":"w6O;Rn:data=",
 "%":"TextEvent"},
-RH:{
-"^":"qE;fY:kind%,ph:label%,LA:src=",
+li:{
+"^":"Bo;fY:kind%,ph:label%",
 "%":"HTMLTrackElement"},
-OJ:{
-"^":"ea;",
-$isOJ:true,
-"%":"TransitionEvent|WebKitTransitionEvent"},
-Mf:{
+w6O:{
 "^":"ea;",
 "%":"FocusEvent|KeyboardEvent|SVGZoomEvent|TouchEvent;UIEvent"},
-Rg:{
-"^":"El;fg:height%,R:width%",
+SW:{
+"^":"eL;fg:height},R:width}",
 "%":"HTMLVideoElement"},
 u9:{
-"^":"D0;oc:name%,ys:status%",
-oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
-hr: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)},
+"^":"PZ;oc:name%,pf:status%",
 geT:function(a){return W.Pv(a.parent)},
-cO:function(a){return a.close()},
-xc:function(a,b,c,d){a.postMessage(P.bL(b),c)
+xO:function(a){return a.close()},
+kr:function(a,b,c,d){a.postMessage(P.bL(b),c)
 return},
-X6:function(a,b,c){return this.xc(a,b,c,null)},
+D9:function(a,b,c){return this.kr(a,b,c,null)},
 bu:function(a){return a.toString()},
-gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.pi.aM(a)},
-gLm:function(a){return C.i3.aM(a)},
-gVY:function(a){return C.DK.aM(a)},
+gi9:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
+gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
 $isu9:true,
-$isD0:true,
+$isPZ:true,
 "%":"DOMWindow|Window"},
-Pk:{
+UMS:{
 "^":"KV;oc:name=,P:value%",
 "%":"Attr"},
-FR:{
+o5:{
 "^":"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)},
 n:function(a,b){var z,y,x
@@ -8324,59 +7699,19 @@
 y=J.v1(a.top)
 x=J.v1(a.width)
 w=J.v1(a.height)
-w=W.C0(W.C0(W.C0(W.C0(0,z),y),x),w)
+w=W.VC(W.VC(W.VC(W.VC(0,z),y),x),w)
 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])},
+gSR:function(a){return H.VM(new P.EX(a.left,a.top),[null])},
 $istn:true,
 $astn:function(){return[null]},
 "%":"ClientRect|DOMRect"},
-SC:{
-"^":"qE;",
-$isD0:true,
+yX:{
+"^":"Bo;",
+$isPZ:true,
 "%":"HTMLFrameSetElement"},
-Cy:{
-"^":"ecX;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isList:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
-$isXj:true,
-"%":"MozNamedAttrMap|NamedNodeMap"},
-c5:{
-"^":"w1p;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isList:true,
-$asWO:function(){return[W.yg]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.yg]},
-$isXj:true,
-"%":"SpeechInputResultList"},
-LO:{
+QV:{
 "^":"kEI;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -8389,22 +7724,62 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
-$asWO:function(){return[W.uj]},
+$isWO:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.uj]},
+$iscX:true,
+$ascX:function(){return[W.KV]},
+$isXj:true,
+"%":"MozNamedAttrMap|NamedNodeMap"},
+Tr:{
+"^":"x5e;",
+gB:function(a){return a.length},
+t:function(a,b){var z=a.length
+if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+return a[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
+sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+grZ:function(a){var z=a.length
+if(z>0)return a[z-1]
+throw H.b(P.w("No elements"))},
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
+$isWO:true,
+$asWO:function(){return[W.yg]},
+$isyN:true,
+$iscX:true,
+$ascX:function(){return[W.yg]},
+$isXj:true,
+"%":"SpeechInputResultList"},
+LO:{
+"^":"HRa;",
+gB:function(a){return a.length},
+t:function(a,b){var z=a.length
+if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+return a[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
+sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+grZ:function(a){var z=a.length
+if(z>0)return a[z-1]
+throw H.b(P.w("No elements"))},
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
+$isWO:true,
+$asWO:function(){return[W.my]},
+$isyN:true,
+$iscX:true,
+$ascX:function(){return[W.my]},
 $isXj:true,
 "%":"SpeechRecognitionResultList"},
 VG:{
-"^":"ar;MW,vG",
-tg:function(a,b){return J.kE(this.vG,b)},
+"^":"rm;MW,VO",
+tg:function(a,b){return J.x5(this.VO,b)},
 gl0:function(a){return this.MW.firstElementChild==null},
-gB:function(a){return this.vG.length},
-t:function(a,b){var z=this.vG
+gB:function(a){return this.VO.length},
+t:function(a,b){var z=this.VO
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-u:function(a,b,c){var z=this.vG
+u:function(a,b,c){var z=this.VO
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 this.MW.replaceChild(c,z[b])},
 sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
@@ -8413,15 +7788,14 @@
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
 FV:function(a,b){var z,y
-for(z=J.GP(!!J.x(b).$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},
-GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
-np:function(a){return this.GT(a,null)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},
+XP:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
+Jd:function(a){return this.XP(a,null)},
 YW:function(a,b,c,d,e){throw H.b(P.SY(null))},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-Rz:function(a,b){return!1},
-xe:function(a,b,c){var z,y,x
-if(b>this.vG.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.vG
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+aP:function(a,b,c){var z,y,x
+if(b>this.VO.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.VO
 y=z.length
 x=this.MW
 if(b===y)x.appendChild(c)
@@ -8432,47 +7806,38 @@
 grZ:function(a){var z=this.MW.lastElementChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
-$asar:function(){return[W.cv]},
-$asWO:function(){return[W.cv]},
-$asQV:function(){return[W.cv]}},
-wz:{
-"^":"ar;Sn,Sc",
+$asrm:function(){return[W.h4]},
+$asWO:function(){return[W.h4]},
+$ascX:function(){return[W.h4]}},
+TS:{
+"^":"rm;Sn,Sc",
 gB:function(a){return this.Sn.length},
 t:function(a,b){var z=this.Sn
 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"))},
-np:function(a){return this.GT(a,null)},
+XP:function(a,b){throw H.b(P.f("Cannot sort list"))},
+Jd:function(a){return this.XP(a,null)},
 grZ:function(a){return C.t5.grZ(this.Sn)},
 gDD:function(a){return W.or(this.Sc)},
-sDD:function(a,b){H.bQ(this.Sc,new W.BH(b))},
-gi9:function(a){return C.mt.Uh(this)},
-gVl:function(a){return C.pi.Uh(this)},
-gLm:function(a){return C.i3.Uh(this)},
-gVY:function(a){return C.DK.Uh(this)},
-nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.B1())
+gi9:function(a){return H.VM(new W.Uc(this,!1,C.U3.Ph),[null])},
+gLm:function(a){return H.VM(new W.Uc(this,!1,C.i3.Ph),[null])},
+nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.HU())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
-$isList:true,
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null,
-static:{vD:function(a,b){var z=H.VM(new W.wz(a,null),[b])
+$iscX:true,
+$ascX:null,
+static:{Ot:function(a,b){var z=H.VM(new W.TS(a,null),[b])
 z.nJ(a,b)
 return z}}},
-B1:{
-"^":"Tp:116;",
-$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,21,[],"call"],
+HU:{
+"^":"Xs:10;",
+$1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
-BH:{
-"^":"Tp:116;a",
-$1:[function(a){var z=this.a
-J.H2(a,z)
-return z},"$1",null,2,0,null,21,[],"call"],
-$isEH:true},
-nX:{
+M5:{
 "^":"Gv;"},
 Jn:{
 "^":"a;WK<",
@@ -8480,35 +7845,35 @@
 DM:{
 "^":"Jn;WK:YO<,WK",
 t:function(a,b){var z,y
-z=$.Vp()
+z=$.PO()
 y=J.rY(b)
 if(z.gvc().Fb.x4(y.hc(b)))if(P.F7()===!0)return H.VM(new W.Cq(this.YO,z.t(0,y.hc(b)),!1),[null])
 return H.VM(new W.Cq(this.YO,b,!1),[null])},
-static:{"^":"fD"}},
+static:{"^":"Ha"}},
 RAp:{
 "^":"Gv+lD;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-Gb:{
+$iscX:true,
+$ascX:function(){return[W.KV]}},
+ecX:{
 "^":"RAp+Gm;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
+$iscX:true,
+$ascX:function(){return[W.KV]}},
 Kx:{
-"^":"Tp:116;",
-$1:[function(a){return J.EC(a)},"$1",null,2,0,null,391,[],"call"],
+"^":"Xs:10;",
+$1:[function(a){return J.lN(a)},"$1",null,2,0,null,92,"call"],
 $isEH:true},
 Cs:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.setRequestHeader(a,b)},"$2",null,4,0,null,392,[],30,[],"call"],
+"^":"Xs:51;a",
+$2:function(a,b){this.a.setRequestHeader(a,b)},
 $isEH:true},
-iO:{
-"^":"Tp:116;b,c",
+bU:{
+"^":"Xs:10;b,c",
 $1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -8517,25 +7882,17 @@
 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,21,[],"call"],
+y.OH(z)}else x.rC(a)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
-Yg:{
-"^":"Tp:300;a",
-$2:[function(a,b){if(b!=null)this.a[a]=b},"$2",null,4,0,null,49,[],30,[],"call"],
-$isEH:true},
-e7:{
-"^":"ar;NL",
+wi:{
+"^":"rm;NL",
 grZ:function(a){var z=this.NL.lastChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 h:function(a,b){this.NL.appendChild(b)},
-FV:function(a,b){var z,y,x,w
-z=J.x(b)
-if(!!z.$ise7){z=b.NL
-y=this.NL
-if(z!==y)for(x=z.childNodes.length,w=0;w<x;++w)y.appendChild(z.firstChild)
-return}for(z=z.gA(b),y=this.NL;z.G();)y.appendChild(z.gl())},
-xe:function(a,b,c){var z,y,x
+FV:function(a,b){var z,y
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},
+aP: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
 y=z.childNodes
@@ -8543,13 +7900,12 @@
 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
+UG:function(a,b,c){var z,y
 z=this.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
+J.Qk(z,c,y[b])},
 Mh:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
-Rz:function(a,b){return!1},
 V1:function(a){J.r4(this.NL)},
 u:function(a,b,c){var z,y
 z=this.NL
@@ -8557,80 +7913,78 @@
 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)},
-GT:function(a,b){throw H.b(P.f("Cannot sort Node list"))},
-np:function(a){return this.GT(a,null)},
+XP:function(a,b){throw H.b(P.f("Cannot sort Node list"))},
+Jd:function(a){return this.XP(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)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 gB:function(a){return this.NL.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
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-$ise7:true,
-$asar:function(){return[W.KV]},
+$iswi:true,
+$asrm:function(){return[W.KV]},
 $asWO:function(){return[W.KV]},
-$asQV:function(){return[W.KV]}},
+$ascX:function(){return[W.KV]}},
 nNL:{
 "^":"Gv+lD;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-ma:{
+$iscX:true,
+$ascX:function(){return[W.KV]}},
+w1p:{
 "^":"nNL+Gm;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
+$iscX:true,
+$ascX:function(){return[W.KV]}},
 yoo:{
 "^":"Gv+lD;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-ecX:{
+$iscX:true,
+$ascX:function(){return[W.KV]}},
+kEI:{
 "^":"yoo+Gm;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
+$iscX:true,
+$ascX:function(){return[W.KV]}},
 zLC:{
 "^":"Gv+lD;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.yg]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.yg]}},
-w1p:{
+$iscX:true,
+$ascX:function(){return[W.yg]}},
+x5e:{
 "^":"zLC+Gm;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.yg]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.yg]}},
+$iscX:true,
+$ascX:function(){return[W.yg]}},
 dxW:{
 "^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.uj]},
+$isWO:true,
+$asWO:function(){return[W.my]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.uj]}},
-kEI:{
+$iscX:true,
+$ascX:function(){return[W.my]}},
+HRa:{
 "^":"dxW+Gm;",
-$isList:true,
-$asWO:function(){return[W.uj]},
+$isWO:true,
+$asWO:function(){return[W.my]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.uj]}},
-tJ:{
+$iscX:true,
+$ascX:function(){return[W.my]}},
+a7B:{
 "^":"a;",
 FV:function(a,b){J.kH(b,new W.Zc(this))},
-di:function(a){var z
-for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},
 V1:function(a){var z
 for(z=this.gvc(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},
 aN:function(a,b){var z,y
@@ -8638,26 +7992,26 @@
 b.$2(y,this.t(0,y))}},
 gvc:function(){var z,y,x,w
 z=this.MW.attributes
-y=H.VM([],[J.O])
+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},
 gUQ:function(a){var z,y,x,w
 z=this.MW.attributes
-y=H.VM([],[J.O])
+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.Vm(z[w]))}}return y},
 gl0:function(a){return this.gB(this)===0},
 gor:function(a){return this.gB(this)!==0},
 $isZ0:true,
-$asZ0:function(){return[J.O,J.O]}},
+$asZ0:function(){return[P.qU,P.qU]}},
 Zc:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,376,[],122,[],"call"],
+"^":"Xs:51;a",
+$2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
-i7:{
-"^":"tJ;MW",
+E9:{
+"^":"a7B;MW",
 x4:function(a){return this.MW.hasAttribute(a)},
 t:function(a,b){return this.MW.getAttribute(b)},
 u:function(a,b,c){this.MW.setAttribute(b,c)},
@@ -8668,174 +8022,147 @@
 return y},
 gB:function(a){return this.gvc().length},
 FJ:function(a){return a.namespaceURI==null}},
-nF:{
-"^":"As;QX,Kd",
-lF:function(){var z=P.Ls(null,null,null,J.O)
+ye:{
+"^":"As3;QX,Kd",
+lF:function(){var z=P.Ls(null,null,null,P.qU)
 this.Kd.aN(0,new W.Si(z))
 return z},
 p5:function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
 for(y=this.QX,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},
 OS:function(a){this.Kd.aN(0,new W.vf(a))},
-O4:function(a,b){return this.xz(new W.Iw(a,b))},
-qU:function(a){return this.O4(a,null)},
-Rz:function(a,b){return this.xz(new W.Fc(b))},
-xz: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.QX,!0,null),new W.FK()),[null,null])},
-static:{or:function(a){var z=new W.nF(a,null)
+yJ:function(a){this.Kd=H.VM(new H.lJ(P.F(this.QX,!0,null),new W.Xw()),[null,null])},
+static:{or:function(a){var z=new W.ye(a,null)
 z.yJ(a)
 return z}}},
-FK:{
-"^":"Tp:116;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,21,[],"call"],
+Xw:{
+"^":"Xs:10;",
+$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 Si:{
-"^":"Tp:116;a",
-$1:[function(a){return this.a.FV(0,a.lF())},"$1",null,2,0,null,21,[],"call"],
+"^":"Xs:10;a",
+$1:function(a){return this.a.FV(0,a.lF())},
 $isEH:true},
 vf:{
-"^":"Tp:116;a",
-$1:[function(a){return a.OS(this.a)},"$1",null,2,0,null,21,[],"call"],
-$isEH:true},
-Iw:{
-"^":"Tp:116;a,b",
-$1:[function(a){return a.O4(this.a,this.b)},"$1",null,2,0,null,21,[],"call"],
-$isEH:true},
-Fc:{
-"^":"Tp:116;a",
-$1:[function(a){return J.V1(a,this.a)},"$1",null,2,0,null,21,[],"call"],
-$isEH:true},
-hD:{
-"^":"Tp:300;a",
-$2:[function(a,b){return this.a.$1(b)===!0||a===!0},"$2",null,4,0,null,393,[],142,[],"call"],
+"^":"Xs:10;a",
+$1:function(a){return a.OS(this.a)},
 $isEH:true},
 I4:{
-"^":"As;MW",
+"^":"As3;MW",
 lF:function(){var z,y,x
-z=P.Ls(null,null,null,J.O)
+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.Kp(y,0)]);y.G();){x=J.rr(y.lo)
 if(x.length!==0)z.h(0,x)}return z},
 p5:function(a){P.F(a,!0,null)
 J.Pw(this.MW,a.zV(0," "))}},
-UC:{
+pq:{
 "^":"a;Ph",
 zc:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
-aM:function(a){return this.zc(a,!1)},
-Qm:function(a,b){return H.VM(new W.Cq(a,this.Ph,b),[null])},
-f0:function(a){return this.Qm(a,!1)},
-jl:function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},
-Uh:function(a){return this.jl(a,!1)}},
+LX:function(a){return this.zc(a,!1)}},
 RO:{
-"^":"qh;uv,Ph,Sg",
-KR:function(a,b,c,d){var z=new W.Ov(0,this.uv,this.Ph,W.aF(a),this.Sg)
+"^":"cb;bi,Ph,Sg",
+KR:function(a,b,c,d){var z=new W.fd(0,this.bi,this.Ph,W.aF(a),this.Sg)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.Zz()
 return z},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)}},
 Cq:{
-"^":"RO;uv,Ph,Sg",
-WO:function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},
-$isqh:true},
+"^":"RO;bi,Ph,Sg",
+WO:function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"cb",0)])
+return H.VM(new P.c9(new W.rg(b),z),[H.ip(z,"cb",0),null])},
+$iscb:true},
 ie:{
-"^":"Tp:116;a",
-$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,325,[],"call"],
+"^":"Xs:10;a",
+$1:function(a){return J.S2(J.l2(a),this.a)},
 $isEH:true},
-Ea:{
-"^":"Tp:116;b",
-$1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,21,[],"call"],
+rg:{
+"^":"Xs:10;b",
+$1:[function(a){J.SS(a,this.b)
+return a},"$1",null,2,0,null,1,"call"],
 $isEH:true},
-pu:{
-"^":"qh;DI,Sg,Ph",
-WO:function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},
+Uc:{
+"^":"cb;KQ,Sg,Ph",
+WO:function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"cb",0)])
+return H.VM(new P.c9(new W.b0(b),z),[H.ip(z,"cb",0),null])},
 KR:function(a,b,c,d){var z,y,x,w,v
-z=H.VM(new W.qO(null,P.L5(null,null,null,[P.qh,null],[P.MO,null])),[null])
+z=H.VM(new W.qO(null,P.L5(null,null,null,[P.cb,null],[P.MO,null])),[null])
 z.KS(null)
-for(y=this.DI,y=y.gA(y),x=this.Ph,w=this.Sg;y.G();){v=new W.RO(y.lo,x,w)
+for(y=this.KQ,y=y.gA(y),x=this.Ph,w=this.Sg;y.G();){v=new W.RO(y.lo,x,w)
 v.$builtinTypeInfo=[null]
 z.h(0,v)}y=z.aV
 y.toString
 return H.VM(new P.Ik(y),[H.Kp(y,0)]).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)},
-$isqh:true},
+$iscb:true},
 i2:{
-"^":"Tp:116;a",
-$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,325,[],"call"],
+"^":"Xs:10;a",
+$1:function(a){return J.S2(J.l2(a),this.a)},
 $isEH:true},
 b0:{
-"^":"Tp:116;b",
-$1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,21,[],"call"],
+"^":"Xs:10;b",
+$1:[function(a){J.SS(a,this.b)
+return a},"$1",null,2,0,null,1,"call"],
 $isEH:true},
-Ov:{
-"^":"MO;VP,uv,Ph,u7,Sg",
-ed:function(){if(this.uv==null)return
-this.Ns()
-this.uv=null
-this.u7=null
+fd:{
+"^":"MO;VP,bi,Ph,G9,Sg",
+ed:function(){if(this.bi==null)return
+this.Jc()
+this.bi=null
+this.G9=null
 return},
-TJ:function(a,b){if(this.uv==null)return;++this.VP
-this.Ns()},
-yy:function(a){return this.TJ(a,null)},
-gRW:function(){return this.VP>0},
-QE:function(a){if(this.uv==null||this.VP<=0)return;--this.VP
-this.Zz()},
-Zz:function(){var z=this.u7
-if(z!=null&&this.VP<=0)J.cZ(this.uv,this.Ph,z,this.Sg)},
-Ns:function(){var z=this.u7
-if(z!=null)J.GJ(this.uv,this.Ph,z,this.Sg)}},
+Fv:[function(a,b){if(this.bi==null)return;++this.VP
+this.Jc()
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,83,20,84],
+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,15],
+Zz:function(){var z=this.G9
+if(z!=null&&this.VP<=0)J.cZ(this.bi,this.Ph,z,this.Sg)},
+Jc:function(){var z=this.G9
+if(z!=null)J.pW(this.bi,this.Ph,z,this.Sg)}},
 qO:{
-"^":"a;aV,eM",
+"^":"a;aV,uZ",
 h:function(a,b){var z,y
-z=this.eM
+z=this.uZ
 if(z.x4(b))return
 y=this.aV
 z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},
-Rz:function(a,b){var z=this.eM.Rz(0,b)
+Rz:function(a,b){var z=this.uZ.Rz(0,b)
 if(z!=null)z.ed()},
-cO:[function(a){var z,y
-for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
+xO:[function(a){var z,y
+for(z=this.uZ,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.aV.cO(0)},"$0","gJK",0,0,126],
+this.aV.xO(0)},"$0","gJK",0,0,15],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
 RX:{
-"^":"Tp:115;a,b",
+"^":"Xs:42;a,b",
 $0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
-bO:{
-"^":"a;xY",
-cN:function(a){return this.xY.$1(a)},
-zc:function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},
-aM:function(a){return this.zc(a,!1)}},
 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.vJ(a,this.gB(a),-1,null),[H.ip(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."))},
-np: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."))},
+XP:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
+Jd:function(a){return this.XP(a,null)},
+aP:function(a,b,c){throw H.b(P.f("Cannot add to 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."))},
 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)},
+vg: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."))},
-$isList:true,
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null},
+$iscX:true,
+$ascX:null},
 uB:{
-"^":"ar;xa",
-gA:function(a){return H.VM(new W.Qg(J.GP(this.xa)),[null])},
+"^":"rm;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.wT(this.xa,b)},
-Rz:function(a,b){return J.V1(this.xa,b)},
+h:function(a,b){J.bi(this.xa,b)},
 V1:function(a){J.U2(this.xa)},
 t:function(a,b){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -8843,22 +8170,22 @@
 u:function(a,b,c){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 z[b]=c},
-sB:function(a,b){J.KM(this.xa,b)},
-GT:function(a,b){J.LH(this.xa,b)},
-np:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.aK(this.xa,b,c)},
+sB:function(a,b){J.Vw(this.xa,b)},
+XP:function(a,b){J.br(this.xa,b)},
+Jd:function(a){return this.XP(a,null)},
+XU:function(a,b,c){return J.q6(this.xa,b,c)},
 u8:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){return J.ff(this.xa,b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-xe:function(a,b,c){return J.BM(this.xa,b,c)},
-YW:function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-UZ:function(a,b,c){J.Y8(this.xa,b,c)}},
-Qg:{
-"^":"a;je",
-G:function(){return this.je.G()},
-gl:function(){return this.je.QZ}},
-W9:{
+aP:function(a,b,c){return J.Mx(this.xa,b,c)},
+YW:function(a,b,c,d,e){J.VZ(this.xa,b,c,d,e)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+UZ:function(a,b,c){J.ul(this.xa,b,c)}},
+LV:{
+"^":"a;qD",
+G:function(){return this.qD.G()},
+gl:function(){return this.qD.QZ}},
+vJ:{
 "^":"a;nj,vN,Nq,QZ",
 G:function(){var z,y
 z=this.Nq+1
@@ -8870,211 +8197,208 @@
 return!1},
 gl:function(){return this.QZ}},
 vZ:{
-"^":"Tp:116;a,b",
+"^":"Xs:10;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,48,[],"call"],
+return this.a(a)},"$1",null,2,0,null,32,"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
 geT:function(a){return W.P1(this.Ui.parent)},
-cO:function(a){return this.Ui.close()},
-xc:function(a,b,c,d){this.Ui.postMessage(b,c)},
-X6:function(a,b,c){return this.xc(a,b,c,null)},
+xO:function(a){return this.Ui.close()},
+kr:function(a,b,c,d){this.Ui.postMessage(b,c)},
+D9:function(a,b,c){return this.kr(a,b,c,null)},
 gI:function(a){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."))},
-$isD0:true,
-static:{P1:[function(a){if(a===window)return a
-else return new W.dW(a)},"$1","lG",2,0,null,246,[]]}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+Si: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)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
 $ishF:true,
 "%":"IDBKeyRange"}}],["dart.dom.svg","dart:svg",,P,{
 "^":"",
-Dh:{
-"^":"zp;N:target=,mH:href=",
+Y0:{
+"^":"tpr;N:target=,mH:href=",
 "%":"SVGAElement"},
-R1:{
-"^":"Eo;mH:href=",
+ZJQ:{
+"^":"Pt;mH:href=",
 "%":"SVGAltGlyphElement"},
-eG:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+Bc:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEBlendElement"},
 lvr:{
-"^":"d5;t5:type=,UQ:values=,fg:height=,yG:result=,R:width=,x=,y=",
+"^":"d5;t5:type=,UQ:values=,yG:result=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
-pf:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+R8:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
-NV:{
-"^":"d5;kp:operator=,fg:height=,yG:result=,R:width=,x=,y=",
+nQ:{
+"^":"d5;xS:operator=,yG:result=,x=,y=",
 "%":"SVGFECompositeElement"},
-nm:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+B3:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
-HC:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+mCz:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEDiffuseLightingElement"},
-kK:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+wfu:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEDisplacementMapElement"},
-bb:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+ha:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEFloodElement"},
-Ob:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+mz:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
-TM:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=,mH:href=",
+Ob:{
+"^":"d5;yG:result=,x=,y=,mH:href=",
 "%":"SVGFEImageElement"},
-oB:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+bO:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEMergeElement"},
-EI:{
-"^":"d5;kp:operator=,fg:height=,yG:result=,R:width=,x=,y=",
+wC:{
+"^":"d5;xS:operator=,yG:result=,x=,y=",
 "%":"SVGFEMorphologyElement"},
-MI8:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+MI:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEOffsetElement"},
-ca:{
+Ub:{
 "^":"d5;x=,y=",
 "%":"SVGFEPointLightElement"},
-zu:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+xX:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
-eW:{
+FG:{
 "^":"d5;x=,y=",
 "%":"SVGFESpotLightElement"},
-kL:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+Rg:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFETileElement"},
 Fu:{
-"^":"d5;t5:type=,fg:height=,yG:result=,R:width=,x=,y=",
+"^":"d5;t5:type=,yG:result=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 QN:{
-"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
+"^":"d5;x=,y=,mH:href=",
 "%":"SVGFilterElement"},
-N9:{
-"^":"zp;fg:height=,R:width=,x=,y=",
+mg:{
+"^":"tpr;x=,y=",
 "%":"SVGForeignObjectElement"},
-Yz:{
-"^":"zp;",
+en:{
+"^":"tpr;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
-zp:{
+tpr:{
 "^":"d5;",
 "%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
-br:{
-"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
+SL:{
+"^":"tpr;x=,y=,mH:href=",
 "%":"SVGImageElement"},
-Yd:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+NBZ:{
+"^":"d5;x=,y=",
 "%":"SVGMaskElement"},
 Ac:{
-"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
+"^":"d5;x=,y=,mH:href=",
 "%":"SVGPatternElement"},
 MU:{
-"^":"Yz;fg:height=,R:width=,x=,y=",
+"^":"en;x=,y=",
 "%":"SVGRectElement"},
 nd:{
 "^":"d5;t5:type%,mH:href=",
 "%":"SVGScriptElement"},
-Lu:{
+EUL:{
 "^":"d5;t5:type%",
 "%":"SVGStyleElement"},
 d5:{
-"^":"cv;",
+"^":"h4;",
 gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
 return a._cssClassSet},
-gwd:function(a){return H.VM(new P.D7(a,new W.e7(a)),[W.cv])},
-swd:function(a,b){var z=H.VM(new P.D7(a,new W.e7(a)),[W.cv])
-J.r4(z.h2.NL)
-z.FV(0,b)},
-gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.pi.f0(a)},
-gLm:function(a){return C.i3.f0(a)},
-gVY:function(a){return C.DK.f0(a)},
-gE8:function(a){return C.W2.f0(a)},
-$isD0:true,
+gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
+gi9:function(a){return H.VM(new W.Cq(a,C.U3.Ph,!1),[null])},
+gVl:function(a){return H.VM(new W.Cq(a,C.pi.Ph,!1),[null])},
+gLm:function(a){return H.VM(new W.Cq(a,C.i3.Ph,!1),[null])},
+gVY:function(a){return H.VM(new W.Cq(a,C.uh.Ph,!1),[null])},
+gf0:function(a){return H.VM(new W.Cq(a,C.Kq.Ph,!1),[null])},
+$isPZ:true,
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
-static:{"^":"JQ<"}},
+static:{"^":"OY<"}},
 hy:{
-"^":"zp;fg:height=,R:width=,x=,y=",
+"^":"tpr;x=,y=",
 Kb:function(a,b){return a.getElementById(b)},
 $ishy:true,
 "%":"SVGSVGElement"},
 mHq:{
-"^":"zp;",
+"^":"tpr;",
 "%":";SVGTextContentElement"},
-Rk4:{
-"^":"mHq;bP:method=,mH:href=",
+iy:{
+"^":"mHq;Sf:method=,mH:href=",
 "%":"SVGTextPathElement"},
-Eo:{
+Pt:{
 "^":"mHq;x=,y=",
 "%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
-pyk:{
-"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
+ci:{
+"^":"tpr;x=,y=,mH:href=",
 "%":"SVGUseElement"},
-GN:{
+cuU:{
 "^":"d5;mH:href=",
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
 O7:{
-"^":"As;LO",
+"^":"As3;LO",
 lF:function(){var z,y,x,w
 z=this.LO.getAttribute("class")
-y=P.Ls(null,null,null,J.O)
+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.Kp(x,0)]);x.G();){w=J.rr(x.lo)
 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,{
 "^":"",
-uC:{
+Hj:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
 "^":"",
 hq:{
 "^":"a;",
 $ishq:true,
-static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
+static:{Jz:function(){return new H.iV((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
-xZ:[function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},"$2$captureThis","oo",2,3,null,223,128,[],247,[]],
+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)},
 R4:[function(a,b,c,d){var z
 if(b===!0){z=[c]
 C.Nm.FV(z,d)
-d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,164,[],247,[],180,[],90,[]],
-Dm:[function(a,b,c){var z
+d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,37,38,39,40],
+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},"$3","Iy",6,0,null,99,[],12,[],30,[]],
-Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},"$2","OP",4,0,null,99,[],12,[]],
+return!0}catch(z){H.Ru(z)}return!1},
+Om: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
 else{z=J.x(a)
-if(!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!z.$isu9)return a
-else if(!!z.$isiP)return H.o2(a)
+if(!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isu9)return a
+else if(!!z.$isiP)return H.U8(a)
 else if(!!z.$isE4)return a.eh
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,116,99,[]],
-hE:[function(a,b,c){var z=P.Om(a,b)
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,10,41],
+hE:function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.$1(a)
-P.Dm(a,b,z)}return z},"$3","dw",6,0,null,99,[],69,[],250,[]],
+P.Dm(a,b,z)}return z},
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
 else{if(a instanceof Object){z=J.x(a)
-z=!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!z.$isu9}else z=!1
+z=!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isu9}else z=!1
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.hs())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,206,99,[]],
-ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
-else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),new P.QS())},"$1","ln",2,0,null,99,[]],
-iQ:[function(a,b,c){var z=P.Om(a,b)
+else return P.pL(a)}},"$1","Xl",2,0,27,41],
+pL:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
+else if(a instanceof Array)return P.iQ(a,$.jl(),new P.Jd())
+else return P.iQ(a,$.jl(),new P.QS())},
+iQ:function(a,b,c){var z=P.Om(a,b)
 if(z==null||!(a instanceof Object)){z=c.$1(a)
-P.Dm(a,b,z)}return z},"$3","yF",6,0,null,99,[],69,[],250,[]],
+P.Dm(a,b,z)}return z},
 E4:{
 "^":"a;eh",
 t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
@@ -9084,43 +8408,51 @@
 giO:function(a){return 0},
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isE4&&this.eh===b.eh},
-Bm:function(a){return a in this.eh},
+Eg:function(a){return a in this.eh},
 bu:function(a){var z,y
 try{z=String(this.eh)
 return z}catch(y){H.Ru(y)
 return P.a.prototype.bu.call(this,this)}},
-V7:function(a,b){var z,y
+K9:function(a,b){var z,y
 z=this.eh
-y=b==null?null:P.F(J.kl(b,P.En()),!0,null)
+y=b==null?null:P.F(H.VM(new H.lJ(b,P.En()),[null,null]),!0,null)
 return P.dU(z[a].apply(z,y))},
-nQ:function(a){return this.V7(a,null)},
+nQ:function(a){return this.K9(a,null)},
 $isE4:true,
 static:{zV:function(a,b){var z,y,x
 z=P.wY(a)
-if(b==null)return P.ND(new z())
+if(b==null)return P.pL(new z())
 y=[null]
-C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
+C.Nm.FV(y,H.VM(new H.lJ(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).$1(a)},"$1","aV",2,0,null,248,[]]}},
-Gn:{
-"^":"Tp:116;a",
+return P.pL(new x())},Oe:function(a){if(a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
+return P.pL(P.wY(a))},jT:function(a){return P.pL(P.M0(a))},M0:function(a){return new P.Xb(P.RN(null,null)).$1(a)}}},
+Xb:{
+"^":"Xs:10;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
 y=J.x(a)
 if(!!y.$isZ0){x={}
 z.u(0,a,x)
-for(z=J.GP(a.gvc());z.G();){w=z.gl()
-x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
+for(z=J.mY(a.gvc());z.G();){w=z.gl()
+x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$iscX){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,99,[],"call"],
+return v}else return P.wY(a)},"$1",null,2,0,null,41,"call"],
 $isEH:true},
 r7:{
-"^":"E4;eh"},
+"^":"E4;eh",
+qP:function(a,b){var z,y
+z=P.wY(b)
+y=P.F(H.VM(new H.lJ(a,P.En()),[null,null]),!0,null)
+return P.dU(this.eh.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))}}},
 Tz:{
-"^":"Wk;eh",
+"^":"F6;eh",
 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
@@ -9133,107 +8465,106 @@
 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)},
-h:function(a,b){this.V7("push",[b])},
-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.BE(b,c,this.gB(this))
-this.V7("splice",[b,c-b])},
-YW:function(a,b,c,d,e){var z,y,x,w
+h:function(a,b){this.K9("push",[b])},
+FV:function(a,b){this.K9("push",b instanceof Array?b:P.F(b,!0,null))},
+aP:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
+this.K9("splice",[b,0,c])},
+UZ:function(a,b,c){P.oY(b,c,this.gB(this))
+this.K9("splice",[b,c-b])},
+YW:function(a,b,c,d,e){var z,y,x
 z=this.gB(this)
-y=J.Wx(b)
-if(y.C(b,0)||y.D(b,z))H.vh(P.TE(b,0,z))
-y=J.Wx(c)
-if(y.C(c,b)||y.D(c,z))H.vh(P.TE(c,b,z))
-x=y.W(c,b)
-if(J.de(x,0))return
+if(b<0||b>z)H.vh(P.TE(b,0,z))
+if(c<b||c>z)H.vh(P.TE(c,b,z))
+y=c-b
+if(y===0)return
 if(e<0)throw H.b(P.u(e))
-w=[b,x]
-C.Nm.FV(w,J.Ld(d,e).qZ(0,x))
-this.V7("splice",w)},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-GT:function(a,b){this.V7("sort",[b])},
-np:function(a){return this.GT(a,null)},
-static:{BE:[function(a,b,c){var z=J.Wx(a)
-if(z.C(a,0)||z.D(a,c))throw H.b(P.TE(a,0,c))
-z=J.Wx(b)
-if(z.C(b,a)||z.D(b,c))throw H.b(P.TE(b,a,c))},"$3","d6",6,0,null,134,[],135,[],249,[]]}},
-Wk:{
+x=[b,y]
+C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
+this.K9("splice",x)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+XP:function(a,b){this.K9("sort",[b])},
+Jd:function(a){return this.XP(a,null)},
+static:{oY: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))}}},
+F6:{
 "^":"E4+lD;",
-$isList:true,
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null},
+$iscX:true,
+$ascX:null},
 DV:{
-"^":"Tp:116;",
-$1:[function(a){var z=P.xZ(a,!1)
+"^":"Xs:10;",
+$1:function(a){var z=P.xZ(a,!1)
 P.Dm(z,$.Dp(),a)
-return z},"$1",null,2,0,null,99,[],"call"],
+return z},
 $isEH:true},
 Hp:{
-"^":"Tp:116;a",
-$1:[function(a){return new this.a(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Xs:10;a",
+$1:function(a){return new this.a(a)},
 $isEH:true},
 Nz:{
-"^":"Tp:116;",
-$1:[function(a){return new P.r7(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Xs:10;",
+$1:function(a){return new P.r7(a)},
 $isEH:true},
 Jd:{
-"^":"Tp:116;",
-$1:[function(a){return H.VM(new P.Tz(a),[null])},"$1",null,2,0,null,99,[],"call"],
+"^":"Xs:10;",
+$1:function(a){return H.VM(new P.Tz(a),[null])},
 $isEH:true},
 QS:{
-"^":"Tp:116;",
-$1:[function(a){return new P.E4(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Xs:10;",
+$1:function(a){return new P.E4(a)},
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
-VC:[function(a,b){a=536870911&a+b
+Zm:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","hj",4,0,null,238,[],30,[]],
-Up:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
+return a^a>>>6},
+xk:function(a){a=536870911&a+((67108863&a)<<3>>>0)
 a^=a>>>11
-return 536870911&a+((16383&a)<<15>>>0)},"$1","Hj",2,0,null,238,[]],
-J:[function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
+return 536870911&a+((16383&a)<<15>>>0)},
+J:function(a,b){var z
+if(typeof a!=="number")throw H.b(P.u(a))
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a>b)return b
 if(a<b)return a
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return(a+b)*a*b
-if(a===0&&C.ON.gzP(b)||C.ON.gG0(b))return b
-return a}return a},"$2","yT",4,0,null,118,[],199,[]],
-y:[function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
+if(a===0)z=b===0?1/b<0:b<0
+else z=!1
+if(z||isNaN(b))return b
+return a}return a},
+y:function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a>b)return a
 if(a<b)return b
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},"$2","Rb",4,0,null,118,[],199,[]],
-mg:{
+return a},
+mgb:{
 "^":"a;",
 j1:function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
 return Math.random()*a>>>0}},
 vY:{
-"^":"a;Bo,Hz",
-o2:function(){var z,y,x,w,v,u
-z=this.Bo
+"^":"a;AW,mK",
+hJ:function(){var z,y,x,w,v,u
+z=this.AW
 y=4294901760*z
 x=(y&4294967295)>>>0
 w=55905*z
 v=(w&4294967295)>>>0
-u=v+x+this.Hz
+u=v+x+this.mK
 z=(u&4294967295)>>>0
-this.Bo=z
-this.Hz=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
+this.AW=z
+this.mK=(C.jn.cU(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.C3("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
-if((a&z)===0){this.o2()
-return(this.Bo&z)>>>0}do{this.o2()
-y=this.Bo
+if((a&z)===0){this.hJ()
+return(this.AW&z)>>>0}do{this.hJ()
+y=this.AW
 x=y%a}while(y-x+a>=4294967296)
 return x},
-c3:function(a){var z,y,x,w,v,u,t,s
+XR: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)
@@ -9255,69 +8586,90 @@
 v=(x<<31>>>0)+x
 u=(v&4294967295)>>>0
 y=C.jn.cU(v-u,4294967296)
-v=this.Bo*1037
+v=this.AW*1037
 t=(v&4294967295)>>>0
-this.Bo=t
-s=(this.Hz*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
-this.Hz=s
-this.Bo=(t^u)>>>0
-this.Hz=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.de(a,z))
-if(this.Hz===0&&this.Bo===0)this.Bo=23063
-this.o2()
-this.o2()
-this.o2()
-this.o2()},
-static:{"^":"dK,PZ,r6",r2:function(a){var z=new P.vY(0,0)
-z.c3(a)
+this.AW=t
+s=(this.mK*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
+this.mK=s
+this.AW=(t^u)>>>0
+this.mK=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
+if(this.mK===0&&this.AW===0)this.AW=23063
+this.hJ()
+this.hJ()
+this.hJ()
+this.hJ()},
+static:{"^":"tgM,LA,y9",r2:function(a){var z=new P.vY(0,0)
+z.XR(a)
 return z}}},
-hL:{
+EX:{
 "^":"a;x>,y>",
 bu:function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},
 n:function(a,b){var z,y
 if(b==null)return!1
-if(!J.x(b).$ishL)return!1
+if(!J.x(b).$isEX)return!1
 z=this.x
 y=b.x
-return(z==null?y==null:z===y)&&J.de(this.y,b.y)},
+if(z==null?y==null:z===y){z=this.y
+y=b.y
+y=z==null?y==null:z===y
+z=y}else z=!1
+return z},
 giO:function(a){var z,y
 z=J.v1(this.x)
 y=J.v1(this.y)
-return P.Up(P.VC(P.VC(0,z),y))},
-g:function(a,b){var z,y,x
+return P.xk(P.Zm(P.Zm(0,z),y))},
+g:function(a,b){var z,y,x,w
 z=this.x
 y=J.RE(b)
 x=y.gx(b)
 if(typeof z!=="number")return z.g()
 if(typeof x!=="number")return H.s(x)
-y=new P.hL(z+x,J.WB(this.y,y.gy(b)))
+w=this.y
+y=y.gy(b)
+if(typeof w!=="number")return w.g()
+if(typeof y!=="number")return H.s(y)
+y=new P.EX(z+x,w+y)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y},
-W:function(a,b){var z,y,x
+W:function(a,b){var z,y,x,w
 z=this.x
 y=J.RE(b)
 x=y.gx(b)
 if(typeof z!=="number")return z.W()
 if(typeof x!=="number")return H.s(x)
-y=new P.hL(z-x,J.xH(this.y,y.gy(b)))
+w=this.y
+y=y.gy(b)
+if(typeof w!=="number")return w.W()
+if(typeof y!=="number")return H.s(y)
+y=new P.EX(z-x,w-y)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y},
-U:function(a,b){var z=this.x
+U:function(a,b){var z,y
+z=this.x
 if(typeof z!=="number")return z.U()
 if(typeof b!=="number")return H.s(b)
-z=new P.hL(z*b,J.vX(this.y,b))
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-$ishL:true},
-HDe:{
+y=this.y
+if(typeof y!=="number")return y.U()
+y=new P.EX(z*b,y*b)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},
+$isEX:true},
+IV:{
 "^":"a;",
-gT8:function(a){var z=this.gBb(this)
+gT8:function(a){var z,y
+z=this.gBb(this)
+y=this.R
 if(typeof z!=="number")return z.g()
-return z+this.R},
-gQG:function(a){var z=this.gG6(this)
+if(typeof y!=="number")return H.s(y)
+return z+y},
+gQG:function(a){var z,y
+z=this.gG6(this)
+y=this.fg
 if(typeof z!=="number")return z.g()
-return z+this.fg},
-bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+this.R+" x "+this.fg},
-n:function(a,b){var z,y,x
+if(typeof y!=="number")return H.s(y)
+return z+y},
+bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+H.d(this.R)+" x "+H.d(this.fg)},
+n:function(a,b){var z,y,x,w
 if(b==null)return!1
 z=J.x(b)
 if(!z.$istn)return!1
@@ -9326,136 +8678,81 @@
 if(y==null?x==null:y===x){y=this.G6
 x=z.gG6(b)
 if(y==null?x==null:y===x){x=this.Bb
+w=this.R
 if(typeof x!=="number")return x.g()
-if(x+this.R===z.gT8(b)){if(typeof y!=="number")return y.g()
-z=y+this.fg===z.gQG(b)}else z=!1}else z=!1}else z=!1
+if(typeof w!=="number")return H.s(w)
+if(x+w===z.gT8(b)){x=this.fg
+if(typeof y!=="number")return y.g()
+if(typeof x!=="number")return H.s(x)
+z=y+x===z.gQG(b)}else z=!1}else z=!1}else z=!1
 return z},
-giO:function(a){var z,y,x,w
+giO:function(a){var z,y,x,w,v,u
 z=J.v1(this.gBb(this))
 y=this.G6
 x=J.v1(y)
 w=this.Bb
+v=this.R
 if(typeof w!=="number")return w.g()
-w=w+this.R&0x1FFFFFFF
+if(typeof v!=="number")return H.s(v)
+u=this.fg
 if(typeof y!=="number")return y.g()
-y=y+this.fg&0x1FFFFFFF
-return P.Up(P.VC(P.VC(P.VC(P.VC(0,z),x),w),y))},
-gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
+if(typeof u!=="number")return H.s(u)
+return P.xk(P.Zm(P.Zm(P.Zm(P.Zm(0,z),x),w+v&0x1FFFFFFF),y+u&0x1FFFFFFF))},
+gSR:function(a){var z=new P.EX(this.gBb(this),this.G6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 tn:{
-"^":"HDe;Bb>,G6>,R>,fg>",
+"^":"IV;Bb>,G6>,R>,fg>",
 $istn:true,
 $astn:null,
-static:{T7:function(a,b,c,d,e){var z,y
+static:{Ci:function(a,b,c,d,e){var z,y
 if(typeof c!=="number")return c.C()
 if(c<0)z=-c*0
 else z=c
 if(typeof d!=="number")return d.C()
 if(d<0)y=-d*0
 else y=d
-return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.mirrors","dart:mirrors",,P,{
+return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
 "^":"",
-re:[function(a){var z,y
-z=J.x(a)
-if(!z.$isuq||z.n(a,C.HH))throw H.b(P.u(H.d(a)+" does not denote a class"))
-y=P.o1(a)
-if(!J.x(y).$isMs)throw H.b(P.u(H.d(a)+" does not denote a class"))
-return y.gJi()},"$1","dO",2,0,null,49,[]],
-o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},"$1","o9",2,0,null,49,[]],
-QF:{
-"^":"a;",
-$isQF:true},
-NL:{
-"^":"a;",
-$isNL:true,
-$isQF:true},
-vr:{
-"^":"a;",
-$isvr:true,
-$isQF:true},
-D4:{
-"^":"a;",
-$isD4:true,
-$isQF:true,
-$isNL:true},
-X9:{
-"^":"a;",
-$isX9:true,
-$isNL:true,
-$isQF:true},
-Ms:{
-"^":"a;",
-$isMs:true,
-$isQF:true,
-$isX9:true,
-$isNL:true},
-tg:{
-"^":"X9;",
-$istg:true},
-RS:{
-"^":"a;",
-$isRS:true,
-$isNL:true,
-$isQF:true},
-RY:{
-"^":"a;",
-$isRY:true,
-$isNL:true,
-$isQF:true},
-Ys:{
-"^":"a;",
-$isYs:true,
-$isRY:true,
-$isNL:true,
-$isQF:true},
-WS4:{
-"^":"a;ew,oQ,Js,f9"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
-"^":"",
-ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","lc",0,0,null],
+ah:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
 Gj:{
-"^":"mAS;EV"},
-mAS:{
-"^":"Nx+B8q;",
+"^":"mA;Ay"},
+mA:{
+"^":"Nx+cw;",
 $isZ0:true},
-B8q:{
+cw:{
 "^":"a;",
 u:function(a,b,c){return Q.ah()},
 FV:function(a,b){return Q.ah()},
-Rz:function(a,b){Q.ah()},
 V1:function(a){return Q.ah()},
 $isZ0:true},
 Nx:{
 "^":"a;",
-t:function(a,b){return this.EV.t(0,b)},
-u:function(a,b,c){this.EV.u(0,b,c)},
-FV:function(a,b){this.EV.FV(0,b)},
-V1:function(a){this.EV.V1(0)},
-x4:function(a){return this.EV.x4(a)},
-di:function(a){return this.EV.di(a)},
-aN:function(a,b){this.EV.aN(0,b)},
-gl0:function(a){return this.EV.X5===0},
-gor:function(a){return this.EV.X5!==0},
-gvc:function(){var z=this.EV
+t:function(a,b){return this.Ay.t(0,b)},
+u:function(a,b,c){this.Ay.u(0,b,c)},
+FV:function(a,b){this.Ay.FV(0,b)},
+V1:function(a){this.Ay.V1(0)},
+aN:function(a,b){this.Ay.aN(0,b)},
+gl0:function(a){return this.Ay.X5===0},
+gor:function(a){return this.Ay.X5!==0},
+gvc:function(){var z=this.Ay
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gB:function(a){return this.EV.X5},
-Rz:function(a,b){return this.EV.Rz(0,b)},
-gUQ:function(a){var z=this.EV
+gB:function(a){return this.Ay.X5},
+gUQ:function(a){var z=this.Ay
 return z.gUQ(z)},
-bu:function(a){return P.vW(this.EV)},
+bu:function(a){return P.vW(this.Ay)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
 "^":"",
-UI:function(a){a.toString
+m6:function(a){a.toString
 return a},
-bu:function(a){a.toString
+jZN:function(a){a.toString
 return a},
-aR:function(a){a.toString
+KY:function(a){a.toString
 return a},
-WZ:{
+D8:{
 "^":"Gv;",
-gbx:function(a){return C.PT},
-$isWZ:true,
+gbx:function(a){return C.E0},
+$isD8:true,
 "%":"ArrayBuffer"},
 pF:{
 "^":"Gv;",
@@ -9463,53 +8760,47 @@
 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)},
-PZ:function(a,b,c,d){this.ZF(a,b,d+1)
-return d},
 $ispF:true,
-$isHY:true,
-"%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
-df:{
+$isAS:true,
+"%":";ArrayBufferView;vF|Nb|nA|Dg|Ui|GVy|Pg"},
+di:{
 "^":"pF;",
-gbx:function(a){return C.T1},
-$isHY:true,
+gbx:function(a){return C.nI},
+$isAS:true,
 "%":"DataView"},
 Hg:{
 "^":"Dg;",
-gbx:function(a){return C.hN},
+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},
-D6:function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$isWO:true,
+$asWO:function(){return[P.CP]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.Pp]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.CP]},
+$isAS:true,
 "%":"Float32Array"},
-fS:{
+K8Q:{
 "^":"Dg;",
-gbx:function(a){return C.lk},
+gbx:function(a){return C.G0},
 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},
-D6:function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$isWO:true,
+$asWO:function(){return[P.CP]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.Pp]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.CP]},
+$isAS:true,
 "%":"Float64Array"},
-PS:{
+Hd:{
 "^":"Pg;",
 gbx:function(a){return C.jV},
 t:function(a,b){var z=a.length
@@ -9518,16 +8809,14 @@
 u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 a[b]=c},
-D6:function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.KN]},
+$isAS:true,
 "%":"Int16Array"},
-dE:{
+dE5:{
 "^":"Pg;",
 gbx:function(a){return C.Im},
 t:function(a,b){var z=a.length
@@ -9536,16 +8825,14 @@
 u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 a[b]=c},
-D6:function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.KN]},
+$isAS:true,
 "%":"Int32Array"},
-IJ:{
+Xn:{
 "^":"Pg;",
 gbx:function(a){return C.la},
 t:function(a,b){var z=a.length
@@ -9554,54 +8841,48 @@
 u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 a[b]=c},
-D6:function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.KN]},
+$isAS:true,
 "%":"Int8Array"},
 us:{
 "^":"Pg;",
-gbx:function(a){return C.iG},
+gbx:function(a){return C.oZ},
 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},
-D6:function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.KN]},
+$isAS:true,
 "%":"Uint16Array"},
-qe:{
+rs:{
 "^":"Pg;",
-gbx:function(a){return C.Vh},
+gbx:function(a){return C.dH},
 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},
-D6:function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.KN]},
+$isAS:true,
 "%":"Uint32Array"},
-eE:{
+eEV:{
 "^":"Pg;",
-gbx:function(a){return C.nG},
+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)
@@ -9609,18 +8890,16 @@
 u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 a[b]=c},
-D6:function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.KN]},
+$isAS:true,
 "%":"CanvasPixelArray|Uint8ClampedArray"},
-V6:{
+V6a:{
 "^":"Pg;",
-gbx:function(a){return C.eY},
+gbx:function(a){return C.HC},
 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)
@@ -9628,795 +8907,796 @@
 u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 a[b]=c},
-D6:function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.KN]},
+$isAS:true,
 "%":";Uint8Array"},
-b0B:{
+vF:{
 "^":"pF;",
 gB:function(a){return a.length},
 oZ:function(a,b,c,d,e){var z,y,x
 z=a.length+1
 this.ZF(a,b,z)
 this.ZF(a,c,z)
-if(J.z8(b,c))throw H.b(P.TE(b,0,c))
-y=J.xH(c,b)
+if(b>c)throw H.b(P.TE(b,0,c))
+y=c-b
 if(e<0)throw H.b(P.u(e))
 x=d.length
-if(typeof y!=="number")return H.s(y)
 if(x-e<y)throw H.b(P.w("Not enough elements"))
 if(e!==0||x!==y)d=d.subarray(e,e+y)
 a.set(d,b)},
 $isXj:true},
 Dg:{
-"^":"Ip;",
+"^":"nA;",
 YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(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)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true,
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$isWO:true,
+$asWO:function(){return[P.CP]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.Pp]}},
-Ui:{
-"^":"b0B+lD;",
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iscX:true,
+$ascX:function(){return[P.CP]}},
+Nb:{
+"^":"vF+lD;",
+$isWO:true,
+$asWO:function(){return[P.CP]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.Pp]}},
-Ip:{
-"^":"Ui+SU7;"},
+$iscX:true,
+$ascX:function(){return[P.CP]}},
+nA:{
+"^":"Nb+Lj;"},
 Pg:{
-"^":"nA;",
+"^":"GVy;",
 YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(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)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isPg:true,
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]}},
-ObS:{
-"^":"b0B+lD;",
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iscX:true,
+$ascX:function(){return[P.KN]}},
+Ui:{
+"^":"vF+lD;",
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]}},
-nA:{
-"^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
+$iscX:true,
+$ascX:function(){return[P.KN]}},
+GVy:{
+"^":"Ui+Lj;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
 "^":"",
-qw:[function(a){if(typeof dartPrint=="function"){dartPrint(a)
-return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
+qw: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)},"$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
-Ir:{
-"^":["D13;Py%-341,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.Py},null,null,1,0,320,"error",308,311],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,321,30,[],"error",308],
-"@":function(){return[C.uW]},
-static:{hG:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.OD.ZL(a)
-C.OD.oX(a)
-return a},null,null,0,0,115,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[394],
-D13:{
+ZP:{
+"^":"Vct;Py,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gkc:function(a){return a.Py},
+skc:function(a,b){a.Py=this.ct(a,C.yh,a.Py,b)},
+static:{Sj:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.wI.ZL(a)
+C.wI.XI(a)
+return a}}},
+Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
-rm:{
-"^":["WZq;a3%-305,Ab%-305,Ln%-395,y4%-396,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.a3},null,null,1,0,312,"text",308,309],
-sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,32,30,[],"text",308],
-gzW:[function(a){return a.Ab},null,null,1,0,312,"lineMode",308,309],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",308],
-gFR:[function(a){return a.Ln},null,null,1,0,397,"callback",308,311],
+nJ:{
+"^":"D13;a3,Ek,Ln,y4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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},
+sdu:function(a,b){a.Ek=this.ct(a,C.eh,a.Ek,b)},
+gFR:function(a){return a.Ln},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,398,30,[],"callback",308],
-gPK:[function(a){return a.y4},null,null,1,0,399,"results",308,309],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,400,30,[],"results",308],
-az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").value
-z=this.ct(a,C.eh,a.Ab,z)
-a.Ab=z
-if(J.de(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,350,21,[],351,[],82,[],"updateLineMode"],
-kk:[function(a,b,c,d){var z,y,x
-J.zJ(b)
+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),"$isJK").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,70,1,71,72],
+Z1:[function(a,b,c,d){var z,y,x
+J.fD(b)
 z=a.a3
 a.a3=this.ct(a,C.mi,z,"")
 if(a.Ln!=null){y=P.Fl(null,null)
-x=R.Jk(y)
+x=R.tB(y)
 J.kW(x,"expr",z)
-J.BM(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,350,21,[],351,[],82,[],"eval"],
-A3:[function(a,b){var z=J.MI(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,401,21,[],"selectExpr"],
-"@":function(){return[C.Qz]},
-static:{Rp:[function(a){var z,y,x,w,v
-z=R.Jk([])
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.Ab="1-line"
+J.Mx(a.y4,0,x)
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,70,1,71,72],
+YC:[function(a,b){var z=J.iz(J.l2(b),"expr")
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,93,1],
+static:{Rp:function(a){var z,y,x,w,v
+z=R.tB([])
+y=$.J1()
+x=P.YM(null,null,null,P.qU,W.I0)
+w=P.qU
+v=W.h4
+v=H.VM(new V.qC(P.YM(null,null,null,w,v),null,null),[w,v])
+a.Ek="1-line"
 a.y4=z
-a.SO=y
-a.B7=x
-a.X0=v
+a.on=y
+a.BA=x
+a.LL=v
 C.Gh.ZL(a)
-C.Gh.oX(a)
-return a},null,null,0,0,115,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[402],
-WZq:{
+C.Gh.XI(a)
+return a}}},
+D13:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"Tp:116;a-85",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,116,57,[],"call"],
-$isEH:true},
-"+ YW":[315]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
+"^":"Xs:10;a",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,94,"call"],
+$isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
-Lt:{
-"^":["Bc;TS%-304,bY%-85,jv%-305,oy%-341,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gO9:[function(a){return a.TS},null,null,1,0,307,"busy",308,309],
-sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,310,30,[],"busy",308],
-gFR:[function(a){return a.bY},null,null,1,0,115,"callback",308,311],
+Eg:{
+"^":"LPc;fe,l1,bY,jv,oy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gv8:function(a){return a.fe},
+sv8: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},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,116,30,[],"callback",308],
-gNW:[function(a){return a.jv},null,null,1,0,312,"expr",308,311],
-sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,32,30,[],"expr",308],
-gyG:[function(a){return a.oy},null,null,1,0,320,"result",308,311],
-syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,321,30,[],"result",308],
-wB:[function(a,b,c,d){var z=a.TS
+sFR:function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},
+gkZ:function(a){return a.jv},
+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
 if(z===!0)return
-if(a.bY!=null){a.TS=this.ct(a,C.S4,z,!0)
+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.Ou(a)).YM(new R.tM(a))}},"$3","gDf",6,0,313,118,[],199,[],289,[],"evalNow"],
-"@":function(){return[C.Vn]},
-static:{fL:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.TS=!1
+this.LY(a,a.jv).ml(new R.Kz(a)).wM(new R.uv(a))}},"$3","gbN",6,0,55,24,25,56],
+static:{fL:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.fe=!1
+a.l1="[evaluate]"
 a.bY=null
 a.jv=""
 a.oy=null
-a.SO=z
-a.B7=y
-a.X0=w
+a.on=z
+a.BA=y
+a.LL=w
 C.UF.ZL(a)
-C.UF.oX(a)
-return a},null,null,0,0,115,"new EvalLinkElement$created"]}},
-"+EvalLinkElement":[403],
-Bc:{
-"^":"xc+Pi;",
+C.UF.XI(a)
+return a}}},
+LPc:{
+"^":"ir+Pi;",
 $isd3:true},
-Ou:{
-"^":"Tp:321;a-85",
-$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,321,101,[],"call"],
+Kz:{
+"^":"Xs:95;a",
+$1:[function(a){var z=this.a
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,61,"call"],
 $isEH:true},
-"+ Ou":[315],
-tM:{
-"^":"Tp:115;b-85",
-$0:[function(){var z,y
-z=this.b
-y=J.RE(z)
-y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,115,"call"],
-$isEH:true},
-"+ tM":[315]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+uv:{
+"^":"Xs:42;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,{
 "^":"",
-UL:{
-"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.E6]},
-static:{zY:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+i7:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{dq:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
+a.on=z
+a.BA=y
+a.LL=w
 C.MC.ZL(a)
-C.MC.oX(a)
-return a},null,null,0,0,115,"new FieldRefElement$created"]}},
-"+FieldRefElement":[342]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+C.MC.XI(a)
+return a}}}}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
-jM:{
-"^":["pva;vt%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gt0:[function(a){return a.vt},null,null,1,0,337,"field",308,311],
-st0:[function(a,b){a.vt=this.ct(a,C.IV,a.vt,b)},null,null,3,0,338,30,[],"field",308],
-pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.vc]},
-static:{bH:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.LT.ZL(a)
-C.LT.oX(a)
-return a},null,null,0,0,115,"new FieldViewElement$created"]}},
-"+FieldViewElement":[404],
-pva:{
+Gk:{
+"^":"WZq;KV,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gt0:function(a){return a.KV},
+st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
+RF:[function(a,b){J.LE(a.KV).wM(b)},"$1","gVm",2,0,17,66],
+static:{Sy:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.by.ZL(a)
+C.by.XI(a)
+return a}}},
+WZq:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
-qW:{
-"^":["rs;lh%-304,qe%-304,zg%-304,Fs%-304,AP,fn,tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gU4:[function(a){return a.lh},null,null,1,0,307,"qualified",308,311],
-sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,310,30,[],"qualified",308],
-P9:[function(a,b){var z,y,x
-Q.xI.prototype.P9.call(this,a,b)
-this.ct(a,C.D2,0,1)
-this.ct(a,C.mP,0,1)
+DK:{
+"^":"Zz;lh,Qz,zg,Fs,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gU4:function(a){return a.lh},
+sU4:function(a,b){a.lh=this.ct(a,C.QK,a.lh,b)},
+Qj:[function(a,b){var z,y,x
+Q.xI.prototype.Qj.call(this,a,b)
+this.ct(a,C.ak,0,1)
+this.ct(a,C.Ql,0,1)
 z=a.tY
 y=z!=null
 if(y){x=J.U6(z)
-x=!J.de(x.t(z,"kind"),"Collected")&&!J.de(x.t(z,"kind"),"Native")&&!J.de(x.t(z,"kind"),"Tag")&&!J.de(x.t(z,"kind"),"Reused")}else x=!1
-a.Fs=this.ct(a,C.P9,a.Fs,x)
+x=!J.xC(x.t(z,"kind"),"Collected")&&!J.xC(x.t(z,"kind"),"Native")&&!J.xC(x.t(z,"kind"),"Tag")&&!J.xC(x.t(z,"kind"),"Reused")}else x=!1
+a.Fs=this.ct(a,C.a0,a.Fs,x)
 x=y&&J.UQ(z,"parent")!=null
-a.qe=this.ct(a,C.D2,a.qe,x)
+a.Qz=this.ct(a,C.ak,a.Qz,x)
 if(y){y=J.U6(z)
-y=y.t(z,"owner")!=null&&J.de(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,169,242,[],"refChanged"],
-gSY4:[function(a){return a.qe},null,null,1,0,307,"hasParent",308,309],
-sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,310,30,[],"hasParent",308],
-gIO:[function(a){return a.zg},null,null,1,0,307,"hasClass",308,309],
-sIO:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,310,30,[],"hasClass",308],
-gmN:[function(a){return a.Fs},null,null,1,0,307,"isDart",308,309],
-smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,310,30,[],"isDart",308],
-"@":function(){return[C.o3]},
-static:{Wz:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+y=y.t(z,"owner")!=null&&J.xC(y.t(z,"owner").gzS(),"Class")}else y=!1
+a.zg=this.ct(a,C.Ql,a.zg,y)},"$1","gLe",2,0,17,35],
+gSY:function(a){return a.Qz},
+sSY:function(a,b){a.Qz=this.ct(a,C.ak,a.Qz,b)},
+gE7:function(a){return a.zg},
+sE7:function(a,b){a.zg=this.ct(a,C.Ql,a.zg,b)},
+gni:function(a){return a.Fs},
+sni:function(a,b){a.Fs=this.ct(a,C.a0,a.Fs,b)},
+static:{E5:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.lh=!0
-a.qe=!1
+a.Qz=!1
 a.zg=!1
 a.Fs=!1
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
+a.on=z
+a.BA=y
+a.LL=w
 C.Xo.ZL(a)
-C.Xo.oX(a)
-return a},null,null,0,0,115,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[405],
-rs:{
+C.Xo.XI(a)
+return a}}},
+Zz:{
 "^":"xI+Pi;",
 $isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
-mk:{
-"^":["cda;De%-336,Iu%-305,Ru%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.De},null,null,1,0,337,"function",308,311],
-sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,338,30,[],"function",308],
-gUx:[function(a){return a.Iu},null,null,1,0,312,"qualifiedName",308,311],
-sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,32,30,[],"qualifiedName",308],
-gfY:[function(a){return a.Ru},null,null,1,0,312,"kind",308,311],
-sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,32,30,[],"kind",308],
-FW:[function(a,b){var z,y,x
+BS:{
+"^":"pva;P6,Sq,ZZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gig:function(a){return a.P6},
+sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
+gUx:function(a){return a.Sq},
+sUx:function(a,b){a.Sq=this.ct(a,C.AO,a.Sq,b)},
+gfY:function(a){return a.ZZ},
+sfY:function(a,b){a.ZZ=this.ct(a,C.Lc,a.ZZ,b)},
+W7:function(a,b){var z,y,x
 z=b!=null
 y=z&&J.UQ(b,"parent")!=null?J.UQ(b,"parent"):null
-if(y!=null)return this.FW(a,y)+"."+H.d(J.UQ(b,"user_name"))
+if(y!=null)return this.W7(a,y)+"."+H.d(J.UQ(b,"user_name"))
 if(z){z=J.U6(b)
-z=z.t(b,"owner")!=null&&J.de(z.t(b,"owner").gzS(),"Class")}else z=!1
+z=z.t(b,"owner")!=null&&J.xC(z.t(b,"owner").gzS(),"Class")}else z=!1
 x=z?J.UQ(b,"owner"):null
 if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
-return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,406,17,[],"_getQualifiedName"],
-ql:[function(a,b){var z,y
+return H.d(J.UQ(b,"user_name"))},
+yM:[function(a,b){var z,y
 this.ct(a,C.AO,0,1)
-this.ct(a,C.fy,0,1)
-z=this.FW(a,a.De)
-a.Iu=this.ct(a,C.AO,a.Iu,z)
-z=J.UQ(a.De,"kind")
-y=a.Ru
-switch(z){case"kRegularFunction":a.Ru=this.ct(a,C.fy,y,"function")
+this.ct(a,C.Lc,0,1)
+z=this.W7(a,a.P6)
+a.Sq=this.ct(a,C.AO,a.Sq,z)
+z=J.UQ(a.P6,"kind")
+y=a.ZZ
+switch(z){case"kRegularFunction":a.ZZ=this.ct(a,C.Lc,y,"function")
 break
-case"kClosureFunction":a.Ru=this.ct(a,C.fy,y,"closure function")
+case"kClosureFunction":a.ZZ=this.ct(a,C.Lc,y,"closure function")
 break
-case"kSignatureFunction":a.Ru=this.ct(a,C.fy,y,"signature function")
+case"kSignatureFunction":a.ZZ=this.ct(a,C.Lc,y,"signature function")
 break
-case"kGetterFunction":a.Ru=this.ct(a,C.fy,y,"getter function")
+case"kGetterFunction":a.ZZ=this.ct(a,C.Lc,y,"getter function")
 break
-case"kSetterFunction":a.Ru=this.ct(a,C.fy,y,"setter function")
+case"kSetterFunction":a.ZZ=this.ct(a,C.Lc,y,"setter function")
 break
-case"kConstructor":a.Ru=this.ct(a,C.fy,y,"constructor")
+case"kConstructor":a.ZZ=this.ct(a,C.Lc,y,"constructor")
 break
-case"kImplicitGetterFunction":a.Ru=this.ct(a,C.fy,y,"implicit getter function")
+case"kImplicitGetterFunction":a.ZZ=this.ct(a,C.Lc,y,"implicit getter function")
 break
-case"kImplicitSetterFunction":a.Ru=this.ct(a,C.fy,y,"implicit setter function")
+case"kImplicitSetterFunction":a.ZZ=this.ct(a,C.Lc,y,"implicit setter function")
 break
-case"kStaticInitializer":a.Ru=this.ct(a,C.fy,y,"static initializer")
+case"kStaticInitializer":a.ZZ=this.ct(a,C.Lc,y,"static initializer")
 break
-case"kMethodExtractor":a.Ru=this.ct(a,C.fy,y,"method extractor")
+case"kMethodExtractor":a.ZZ=this.ct(a,C.Lc,y,"method extractor")
 break
-case"kNoSuchMethodDispatcher":a.Ru=this.ct(a,C.fy,y,"noSuchMethod dispatcher")
+case"kNoSuchMethodDispatcher":a.ZZ=this.ct(a,C.Lc,y,"noSuchMethod dispatcher")
 break
-case"kInvokeFieldDispatcher":a.Ru=this.ct(a,C.fy,y,"invoke field dispatcher")
+case"kInvokeFieldDispatcher":a.ZZ=this.ct(a,C.Lc,y,"invoke field dispatcher")
 break
-default:a.Ru=this.ct(a,C.fy,y,"UNKNOWN")
-break}},"$1","gNC",2,0,169,242,[],"functionChanged"],
-pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.nu]},
-static:{N0:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.h4.ZL(a)
-C.h4.oX(a)
-return a},null,null,0,0,115,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[407],
-cda:{
+default:a.ZZ=this.ct(a,C.Lc,y,"UNKNOWN")
+break}},"$1","gnp",2,0,17,35],
+RF:[function(a,b){J.LE(a.P6).wM(b)},"$1","gVm",2,0,17,66],
+static:{nz:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.p0.ZL(a)
+C.p0.XI(a)
+return a}}},
+pva:{
 "^":"uL+Pi;",
 $isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
 "^":"",
-Qb:{
-"^":"a;HW,mS",
-F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,408],
-gvH:function(a){return J.Ts(this.mS,4)},
-static:{"^":"Q0z",x6:function(a,b){var z=J.RE(b)
-return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.YD(a)),z.gx(b)),4))}}},
+Hz:{
+"^":"a;zE,mS",
+m0:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,96],
+gvH:function(a){return C.CD.cU(this.mS,4)},
+static:{"^":"Q0z",x6:function(a,b){var z,y,x
+z=b.gy(b)
+y=J.DO(a)
+if(typeof z!=="number")return z.U()
+if(typeof y!=="number")return H.s(y)
+x=b.gx(b)
+if(typeof x!=="number")return H.s(x)
+return new O.Hz(a,(z*y+x)*4)}}},
 uc:{
 "^":"a;Yu<,tL"},
-pL:{
-"^":["waa;hi%-85,An%-85,dW%-85,rM%-85,Ge%-85,UL%-85,PA%-305,Oh%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gys:[function(a){return a.PA},null,null,1,0,312,"status",308,309],
-sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",308],
-gyw:[function(a){return a.Oh},null,null,1,0,337,"fragmentation",308,311],
-syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,338,30,[],"fragmentation",308],
-i4:[function(a){var z
-Z.uL.prototype.i4.call(this,a)
+Vb:{
+"^":"cda;hi,An,dW,rM,Ge,UL,PA,oj,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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},
+syw:function(a,b){a.oj=this.ct(a,C.QH,a.oj,b)},
+q0:function(a){var z
+Z.uL.prototype.q0.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
 a.hi=z
-J.oL(z).yI(this.gmo(a))
-J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,126,"enteredView"],
-LV:[function(a,b){var z,y,x
-for(z=J.GP(b),y=0;z.G();){x=z.gl()
+z=J.Q9(z)
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(this.gmo(a)),z.Sg),[H.Kp(z,0)]).Zz()
+z=J.GW(a.hi)
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(this.gJb(a)),z.Sg),[H.Kp(z,0)]).Zz()},
+LV:function(a,b){var z,y,x
+for(z=J.mY(b),y=0;z.G();){x=z.lo
 if(typeof x!=="number")return H.s(x)
-y=y*256+x}return y},"$1","gzK",2,0,409,410,[],"_packColor"],
-tn:[function(a,b,c,d){var z,y
-z=a.UL
-y=J.uH(c,"@")
-if(0>=y.length)return H.e(y,0)
-J.kW(z,b,y[0])
-J.kW(a.rM,b,d)
-J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,411,412,[],12,[],410,[],"_addClass"],
-an:[function(a,b,c){var z,y,x,w,v,u,t
-for(z=J.GP(J.UQ(b,"members"));z.G();){y=z.gl()
-x=J.U6(y)
-if(!J.de(x.t(y,"type"),"@Class")){N.Jx("").To(H.d(y))
-continue}w=H.BU(C.Nm.grZ(J.uH(x.t(y,"id"),"/")),null,null)
-v=w==null?C.OY:P.r2(w)
-u=[v.j1(128),v.j1(128),v.j1(128),255]
-x=x.t(y,"name")
-t=a.UL
-x=J.uH(x,"@")
-if(0>=x.length)return H.e(x,0)
-J.kW(t,w,x[0])
-J.kW(a.rM,w,u)
-J.kW(a.Ge,this.LV(a,u),w)}this.tn(a,c,"Free",$.R2())
-this.tn(a,0,"",$.eK())},"$2","gUw",4,0,413,414,[],415,[],"_updateClassList"],
-LI:[function(a,b){var z=b==null?C.OY:P.r2(b)
-return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,416,412,[],"_classIdToRGBA"],
-Ic:[function(a,b){var z,y,x
-z=O.x6(a.An,b)
-y=z.mS
-x=J.Cl(J.Qd(z.HW),y,J.WB(y,4))
-return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,417,418,[],"_classNameAt"],
-WE:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=J.vX(a.dW,J.YD(a.An))
-y=J.Ts(O.x6(a.An,b).mS,4)
-x=J.Wx(y)
-w=x.Z(y,z)
-v=x.Y(y,z)
-u=J.UQ(a.Oh,"pages")
-x=J.Wx(w)
-if(x.C(w,0)||x.F(w,J.q8(u)))return
-t=J.UQ(u,w)
-x=J.U6(t)
-s=x.t(t,"objects")
-r=J.U6(s)
+y=y*256+x}return y},
+tn:function(a,b,c,d){var z=J.uH(c,"@")
+if(0>=z.length)return H.e(z,0)
+a.UL.u(0,b,z[0])
+a.rM.u(0,b,d)
+a.Ge.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.Ge;z.G();){v=z.gl()
+u=J.U6(v)
+if(!J.xC(u.t(v,"type"),"@Class")){N.QM("").To(H.d(v))
+continue}t=H.BU(C.Nm.grZ(J.uH(u.t(v,"id"),"/")),null,null)
+s=t==null?C.pr:P.r2(t)
+r=[s.j1(128),s.j1(128),s.j1(128),255]
+u=J.uH(u.t(v,"name"),"@")
+if(0>=u.length)return H.e(u,0)
+y.u(0,t,u[0])
+x.u(0,t,r)
+w.u(0,this.LV(a,r),t)}this.tn(a,c,"Free",$.aw())
+this.tn(a,0,"",$.Sd())},
+WE:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
+z=a.dW
+y=J.DO(a.An)
+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).mS,4)
+v=C.CD.Z(w,x)
+u=C.CD.Y(w,x)
+t=J.UQ(a.oj,"pages")
+if(!(v<0)){z=J.q8(t)
+if(typeof z!=="number")return H.s(z)
+z=v>=z}else z=!0
+if(z)return
+s=J.UQ(t,v)
+z=J.U6(s)
+r=z.t(s,"objects")
+y=J.U6(r)
 q=0
 p=0
 o=0
-while(!0){n=r.gB(s)
+while(!0){n=y.gB(r)
 if(typeof n!=="number")return H.s(n)
 if(!(o<n))break
-p=r.t(s,o)
+p=y.t(r,o)
 if(typeof p!=="number")return H.s(p)
 q+=p
-if(q>v){v=q-p
-break}o+=2}x=H.BU(x.t(t,"object_start"),null,null)
-r=J.UQ(a.Oh,"unit_size_bytes")
-if(typeof r!=="number")return H.s(r)
-return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,419,418,[],"_objectAt"],
-U8:[function(a,b){var z,y,x,w,v,u
+if(q>u){u=q-p
+break}o+=2}z=H.BU(z.t(s,"object_start"),null,null)
+y=J.UQ(a.oj,"unit_size_bytes")
+if(typeof y!=="number")return H.s(y)
+return new O.uc(J.ew(z,u*y),J.vX(p,J.UQ(a.oj,"unit_size_bytes")))},
+U8:[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.cR(y.Yu,16)
+x=H.d(y.tL)+"B @ 0x"+J.u1(y.Yu,16)
 z=z.gD7(b)
 z=O.x6(a.An,z)
 w=z.mS
-v=J.Cl(J.Qd(z.HW),w,J.WB(w,4))
-u=J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,v)))
-z=J.de(u,"")?"-":H.d(u)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,401,325,[],"_handleMouseMove"],
-f1:[function(a,b){var z=J.cR(this.WE(a,J.HF(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,401,325,[],"_handleClick"],
-My:[function(a){var z,y,x,w
-z=a.Oh
+v=a.UL.t(0,a.Ge.t(0,this.LV(a,C.yp.Mu(J.Qd(z.zE),w,w+4))))
+z=J.xC(v,"")?"-":H.d(v)+" "+x
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,93,60],
+f1:[function(a,b){var z=J.u1(this.WE(a,J.HF(b)).Yu,16)
+window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,93,60],
+My:function(a){var z,y,x,w
+z=a.oj
 if(z==null||a.hi==null)return
-this.an(a,J.UQ(z,"class_list"),J.UQ(a.Oh,"free_class_id"))
-y=J.UQ(a.Oh,"pages")
-z=J.Q5(J.u3(a.hi))
-x=z.gR(z)
-z=J.Ts(J.Ts(J.UQ(a.Oh,"page_size_bytes"),J.UQ(a.Oh,"unit_size_bytes")),x)
+this.eD(a,J.UQ(z,"class_list"),J.UQ(a.oj,"free_class_id"))
+y=J.UQ(a.oj,"pages")
+z=a.hi.parentElement
+x=P.Ci(z.clientLeft,z.clientTop,z.clientWidth,z.clientHeight,null).R
+z=J.Ts(J.Ts(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
 w=J.q8(y)
 if(typeof w!=="number")return H.s(w)
-w=P.f9(J.Vf(a.hi).createImageData(x,z*w))
+w=P.J3(J.uP(a.hi).createImageData(x,z*w))
 a.An=w
-J.No(a.hi,J.YD(w))
-J.OE(a.hi,J.OBt(a.An))
-this.ps(a,0)},"$0","gCT",0,0,126,"_updateFragmentationData"],
-ps:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-z=J.UQ(a.Oh,"pages")
+J.fc(a.hi,J.DO(w))
+J.OE(a.hi,J.OB(a.An))
+this.ps(a,0)},
+ps: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 "+H.d(b)+" of "+H.d(y.gB(z))+" pages"
+x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
 a.PA=this.ct(a,C.PM,a.PA,x)
-x=J.Wx(b)
-if(x.F(b,y.gB(z)))return
-w=x.U(b,a.dW)
-v=O.x6(a.An,H.VM(new P.hL(0,w),[null]))
+x=y.gB(z)
+if(typeof x!=="number")return H.s(x)
+if(b>=x)return
+x=a.dW
+if(typeof x!=="number")return H.s(x)
+w=b*x
+v=O.x6(a.An,H.VM(new P.EX(0,w),[null]))
 u=J.UQ(y.t(z,b),"objects")
 y=J.U6(u)
+x=a.rM
 t=0
-while(!0){x=y.gB(u)
-if(typeof x!=="number")return H.s(x)
-if(!(t<x))break
-s=y.t(u,t)
-r=y.t(u,t+1)
-q=J.UQ(a.rM,r)
-for(;x=J.Wx(s),p=x.W(s,1),x.D(s,0);s=p){x=v.HW
+while(!0){s=y.gB(u)
+if(typeof s!=="number")return H.s(s)
+if(!(t<s))break
+r=y.t(u,t)
+q=x.t(0,y.t(u,t+1))
+for(;s=J.Wx(r),p=s.W(r,1),s.D(r,0);r=p){s=v.zE
 o=v.mS
-n=J.Qc(o)
-J.wp(J.Qd(x),o,n.g(o,4),q)
-v=new O.Qb(x,n.g(o,4))}t+=2}m=J.WB(w,a.dW)
+n=o+4
+C.yp.vg(J.Qd(s),o,n,q)
+v=new O.Hz(s,n)}t+=2}y=a.dW
+if(typeof y!=="number")return H.s(y)
+m=w+y
 while(!0){y=v.mS
-x=J.Wx(y)
-o=v.HW
-n=J.RE(o)
-l=J.bY(x.Z(y,4),n.gR(o))
-k=J.Ts(x.Z(y,4),n.gR(o))
-new P.hL(l,k).$builtinTypeInfo=[null]
-if(!J.u6(k,m))break
-l=$.eK()
-J.wp(n.gRn(o),y,x.g(y,4),l)
-v=new O.Qb(o,x.g(y,4))}y=J.Vf(a.hi)
+x=C.CD.cU(y,4)
+s=v.zE
+o=J.RE(s)
+n=o.gR(s)
+if(typeof n!=="number")return H.s(n)
+n=C.CD.Y(x,n)
+l=o.gR(s)
+if(typeof l!=="number")return H.s(l)
+l=C.CD.Z(x,l)
+new P.EX(n,l).$builtinTypeInfo=[null]
+if(!(l<m))break
+x=$.Sd()
+n=y+4
+C.yp.vg(o.gRn(s),y,n,x)
+v=new O.Hz(s,n)}y=J.uP(a.hi)
 x=a.An
-J.J4(y,x,0,0,0,w,J.YD(x),m)
-P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,420,421,[],"_renderPages"],
-pA:[function(a,b){var z=a.Oh
+J.kZ(y,x,0,0,0,w,J.DO(x),m)
+P.Iw(new O.R5(a,b),null)},
+RF:[function(a,b){var z=a.oj
 if(z==null)return
-J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,169,242,[],"fragmentationChanged"],
-"@":function(){return[C.Cu]},
-static:{"^":"nK<-85,RD<-85,SoT<-85",pn:[function(a){var z,y,x,w,v,u,t
+J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).wM(b)},"$1","gVm",2,0,17,66],
+nY:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,17,35],
+static:{"^":"nK,fM,SoT",pn:function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
-w=$.Nd()
-v=P.Py(null,null,null,J.O,W.I0)
-u=J.O
-t=W.cv
-t=H.VM(new V.qC(P.Py(null,null,null,u,t),null,null),[u,t])
+w=$.J1()
+v=P.YM(null,null,null,P.qU,W.I0)
+u=P.qU
+t=W.h4
+t=H.VM(new V.qC(P.YM(null,null,null,u,t),null,null),[u,t])
 a.rM=z
 a.Ge=y
 a.UL=x
-a.SO=w
-a.B7=v
-a.X0=t
+a.on=w
+a.BA=v
+a.LL=t
 C.pJ.ZL(a)
-C.pJ.oX(a)
-return a},null,null,0,0,115,"new HeapMapElement$created"]}},
-"+HeapMapElement":[422],
-waa:{
+C.pJ.XI(a)
+return a}}},
+cda:{
 "^":"uL+Pi;",
 $isd3:true},
-WQ:{
-"^":"Tp:115;a-85,b-326",
-$0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,115,"call"],
+R5:{
+"^":"Xs:42;a,b",
+$0:function(){J.fi(this.a,this.b+1)},
 $isEH:true},
-"+ WQ":[315],
 aG:{
-"^":"Tp:338;a-85",
-$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,338,423,[],"call"],
+"^":"Xs:98;a",
+$1:[function(a){var z=this.a
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true},
-"+ aG":[315],
 aO:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
+"^":"Xs:51;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,99,"call"],
 $isEH:true},
-"+ aO":[315],
 oc:{
-"^":"Tp:115;a-85",
-$0:[function(){J.vP(this.a)},"$0",null,0,0,115,"call"],
-$isEH:true},
-"+ oc":[315]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+"^":"Xs:42;a",
+$0:function(){J.vP(this.a)},
+$isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
-jY:{
-"^":["V4;GQ%-85,J0%-85,Oc%-85,CO%-85,nc%-425,Ol%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gLF:[function(a){return a.nc},null,null,1,0,426,"classTable",308,309],
-sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,427,30,[],"classTable",308],
-gB1:[function(a){return a.Ol},null,null,1,0,337,"profile",308,311],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,338,30,[],"profile",308],
-i4:[function(a){var z,y
-Z.uL.prototype.i4.call(this,a)
+Ly:{
+"^":"waa;GQ,I8,Oc,GM,Rp,Ol,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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)},
+q0:function(a){var z,y,x
+Z.uL.prototype.q0.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
-y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.zV(J.UQ($.NR,"PieChart"),[z])
-a.J0=y
-y.bG.u(0,"title","New Space")
+y=P.L5(null,null,null,null,null)
+x=new G.qu(null,y)
+x.vR=P.zV(J.UQ($.BY,"PieChart"),[z])
+a.I8=x
+y.u(0,"title","New Space")
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
-a.CO=z
-z.bG.u(0,"title","Old Space")
-this.uB(a)},"$0","gQd",0,0,126,"enteredView"],
-hZ:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+x=P.L5(null,null,null,null,null)
+z=new G.qu(null,x)
+z.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
+a.GM=z
+x.u(0,"title","Old Space")
+this.z5(a)},
+MQ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=a.Ol
-if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
-a.nc.lb()
-for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
+if(z==null||!J.x(J.UQ(z,"members")).$isWO||J.xC(J.q8(J.UQ(a.Ol,"members")),0))return
+a.Rp.B7()
+for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
 if(this.K1(a,y))continue
 x=J.UQ(y,"class")
-w=this.VI(a,y,1)
-v=this.VI(a,y,2)
-u=this.VI(a,y,3)
-t=this.VI(a,y,4)
-s=this.VI(a,y,5)
-r=this.VI(a,y,6)
-q=this.VI(a,y,7)
-p=this.VI(a,y,8)
-J.qK(a.nc,new G.Ni([x,w,v,u,t,s,r,q,p]))}J.Yl(a.nc)
-a.GQ.lb()
+w=this.zh(a,y,1)
+v=this.zh(a,y,2)
+u=this.zh(a,y,3)
+t=this.zh(a,y,4)
+s=this.zh(a,y,5)
+r=this.zh(a,y,6)
+q=this.zh(a,y,7)
+p=this.zh(a,y,8)
+J.Jr(a.Rp,new G.Ni([x,w,v,u,t,s,r,q,p]))}J.II(a.Rp)
+z=a.GQ.Yb
+z.K9("removeRows",[0,z.nQ("getNumberOfRows")])
 o=J.UQ(J.UQ(a.Ol,"heaps"),"new")
-z=J.U6(o)
-J.qK(a.GQ,["Used",z.t(o,"used")])
-J.qK(a.GQ,["Free",J.xH(z.t(o,"capacity"),z.t(o,"used"))])
-J.qK(a.GQ,["External",z.t(o,"external")])
-a.Oc.lb()
+z=a.GQ
+x=J.U6(o)
+w=x.t(o,"used")
+z=z.Yb
+v=[]
+C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
+z.K9("addRow",[H.VM(new P.Tz(v),[null])])
+v=a.GQ
+z=J.Hn(x.t(o,"capacity"),x.t(o,"used"))
+v=v.Yb
+w=[]
+C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
+v.K9("addRow",[H.VM(new P.Tz(w),[null])])
+w=a.GQ
+x=x.t(o,"external")
+w=w.Yb
+v=[]
+C.Nm.FV(v,C.Nm.ez(["External",x],P.En()))
+w.K9("addRow",[H.VM(new P.Tz(v),[null])])
+v=a.Oc.Yb
+v.K9("removeRows",[0,v.nQ("getNumberOfRows")])
 o=J.UQ(J.UQ(a.Ol,"heaps"),"old")
-z=J.U6(o)
-J.qK(a.Oc,["Used",z.t(o,"used")])
-J.qK(a.Oc,["Free",J.xH(z.t(o,"capacity"),z.t(o,"used"))])
-J.qK(a.Oc,["External",z.t(o,"external")])
-this.uB(a)},"$0","gYs",0,0,126,"_updateChartData"],
-uB:[function(a){var z=a.J0
+v=a.Oc
+w=J.U6(o)
+x=w.t(o,"used")
+v=v.Yb
+z=[]
+C.Nm.FV(z,C.Nm.ez(["Used",x],P.En()))
+v.K9("addRow",[H.VM(new P.Tz(z),[null])])
+z=a.Oc
+v=J.Hn(w.t(o,"capacity"),w.t(o,"used"))
+z=z.Yb
+x=[]
+C.Nm.FV(x,C.Nm.ez(["Free",v],P.En()))
+z.K9("addRow",[H.VM(new P.Tz(x),[null])])
+x=a.Oc
+w=w.t(o,"external")
+x=x.Yb
+z=[]
+C.Nm.FV(z,C.Nm.ez(["External",w],P.En()))
+x.K9("addRow",[H.VM(new P.Tz(z),[null])])
+this.z5(a)},
+z5:function(a){var z=a.I8
 if(z==null)return
 z.W2(a.GQ)
-a.CO.W2(a.Oc)},"$0","goI",0,0,126,"_draw"],
+a.GM.W2(a.Oc)},
 AE:[function(a,b,c,d){var z,y
-if(!!J.x(d).$isqk){z=a.nc.gxp()
+if(!!J.x(d).$isv6){z=a.Rp.gxp()
 y=d.cellIndex
-if(z==null?y!=null:z!==y){a.nc.sxp(y)
-J.Yl(a.nc)}}},"$3","gQq",6,0,428,21,[],351,[],82,[],"changeSort",309],
-K1:[function(a,b){var z,y,x
+if(z==null?y!=null:z!==y){a.Rp.sxp(y)
+J.II(a.Rp)}}},"$3","gQq",6,0,100,1,71,72],
+K1:function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
 x=z.t(b,"old")
-for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
-for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"$1","gbU",2,0,429,122,[],"_classHasNoAllocations"],
-VI:[function(a,b,c){var z
+for(z=J.mY(y);z.G();)if(!J.xC(z.gl(),0))return!1
+for(z=J.mY(x);z.G();)if(!J.xC(z.gl(),0))return!1
+return!0},
+zh:function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:return J.UQ(J.UQ(b,"new"),7)
 case 2:return J.UQ(J.UQ(b,"new"),6)
 case 3:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"new"),5))
+return J.ew(J.UQ(z.t(b,"new"),3),J.UQ(z.t(b,"new"),5))
 case 4:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4))
+return J.ew(J.UQ(z.t(b,"new"),2),J.UQ(z.t(b,"new"),4))
 case 5:return J.UQ(J.UQ(b,"old"),7)
 case 6:return J.UQ(J.UQ(b,"old"),6)
 case 7:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"old"),3),J.UQ(z.t(b,"old"),5))
+return J.ew(J.UQ(z.t(b,"old"),3),J.UQ(z.t(b,"old"),5))
 case 8:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,430,122,[],15,[],"_combinedTableColumnValue"],
-pA:[function(a,b){var z=a.Ol
+return J.ew(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.a9())},
+RF:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-cQ:[function(a,b){var z=a.Ol
+J.aT(z).cv("/allocationprofile").ml(new K.RM(a)).OA(new K.nx()).wM(b)},"$1","gVm",2,0,17,66],
+QH:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,169,339,[],"refreshGC"],
+J.aT(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).wM(b)},"$1","gyW",2,0,17,66],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,169,339,[],"resetAccumulator"],
+J.aT(z).cv("/allocationprofile?reset=true").ml(new K.ke(a)).OA(new K.xj()).wM(b)},"$1","gNb",2,0,17,66],
 pM:[function(a,b){var z,y,x,w
-try{this.hZ(a)}catch(x){w=H.Ru(x)
+try{this.MQ(a)}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
-N.Jx("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
+y=new H.oP(x,null)
+N.QM("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,169,242,[],"profileChanged"],
+this.ct(a,C.DS,[],this.gJN(a))},"$1","gd0",2,0,17,35],
 Ar:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,431,432,[],"formattedAverage",309],
+return C.CD.Sy(J.L9(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,101,102],
 uW:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,431,432,[],"formattedCollections",309],
-Q0:[function(a,b){var z,y
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,101,102],
+F9:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,431,432,[],"formattedTotalCollectionTime",309],
-Dd:[function(a){var z=new G.ig(P.zV(J.UQ($.NR,"DataTable"),null))
-a.GQ=z
-z.Gl("string","Type")
-a.GQ.Gl("number","Size")
-z=new G.ig(P.zV(J.UQ($.NR,"DataTable"),null))
-a.Oc=z
-z.Gl("string","Type")
-a.Oc.Gl("number","Size")
+return J.r0(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,101,102],
+Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
+a.GQ=new G.Kf(z)
+z.K9("addColumn",["string","Type"])
+a.GQ.Yb.K9("addColumn",["number","Size"])
+z=P.zV(J.UQ($.BY,"DataTable"),null)
+a.Oc=new G.Kf(z)
+z.K9("addColumn",["string","Type"])
+a.Oc.Yb.K9("addColumn",["number","Size"])
 z=H.VM([],[G.Ni])
-z=this.ct(a,C.M5,a.nc,new G.Vz([new G.Kt("Class",G.My()),new G.Kt("Accumulator Size (New)",G.AF()),new G.Kt("Accumulator (New)",G.Vj()),new G.Kt("Current Size (New)",G.AF()),new G.Kt("Current (New)",G.Vj()),new G.Kt("Accumulator Size (Old)",G.AF()),new G.Kt("Accumulator (Old)",G.Vj()),new G.Kt("Current Size (Old)",G.AF()),new G.Kt("Current (Old)",G.Vj())],z,[],0,!0,null,null))
-a.nc=z
-z.sxp(1)},null,null,0,0,115,"created"],
-"@":function(){return[C.dA]},
-static:{"^":"BO<-85,bQj<-85,xK<-85,V1g<-85,r1K<-85,qEV<-85,pC<-85,DY2<-85",Lz:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+z=this.ct(a,C.kG,a.Rp,new G.Vz([new G.YA("Class",G.Tp()),new G.YA("Accumulator Size (New)",G.Gt()),new G.YA("Accumulator (New)",G.xo()),new G.YA("Current Size (New)",G.Gt()),new G.YA("Current (New)",G.xo()),new G.YA("Accumulator Size (Old)",G.Gt()),new G.YA("Accumulator (Old)",G.xo()),new G.YA("Current Size (Old)",G.Gt()),new G.YA("Current (Old)",G.xo())],z,[],0,!0,null,null))
+a.Rp=z
+z.sxp(1)},
+static:{"^":"IJv,bQj,kh,wh,r1K,b3,pC,DY2",le:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.Vc.ZL(a)
-C.Vc.oX(a)
-C.Vc.Dd(a)
-return a},null,null,0,0,115,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[433],
-V4:{
+C.Vc.XI(a)
+C.Vc.Zy(a)
+return a}}},
+waa:{
 "^":"uL+Pi;",
 $isd3:true},
+RM:{
+"^":"Xs:98;a",
+$1:[function(a){var z=this.a
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,97,"call"],
+$isEH:true},
 nx:{
-"^":"Tp:338;a-85",
-$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,338,423,[],"call"],
+"^":"Xs:51;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,99,"call"],
 $isEH:true},
-"+ nx":[315],
-jm:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
-$isEH:true},
-"+ jm":[315],
 AN:{
-"^":"Tp:338;a-85",
-$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,338,423,[],"call"],
+"^":"Xs:98;a",
+$1:[function(a){var z=this.a
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,97,"call"],
 $isEH:true},
-"+ AN":[315],
 Ao:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
+"^":"Xs:51;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,99,"call"],
 $isEH:true},
-"+ Ao":[315],
+ke:{
+"^":"Xs:98;a",
+$1:[function(a){var z=this.a
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,97,"call"],
+$isEH:true},
 xj:{
-"^":"Tp:338;a-85",
-$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,338,423,[],"call"],
-$isEH:true},
-"+ xj":[315],
-VB:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
-$isEH:true},
-"+ VB":[315]}],["html_common","dart:html_common",,P,{
+"^":"Xs:51;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,99,"call"],
+$isEH:true}}],["html_common","dart:html_common",,P,{
 "^":"",
-bL:[function(a){var z,y
+bL:function(a){var z,y
 z=[]
-y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).$1(a)
-new P.wO().$0()
-return y},"$1","Lq",2,0,null,30,[]],
-o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},"$2$mustCopy","A1",2,3,null,223,6,[],251,[]],
-f9:[function(a){var z,y
+y=new P.Kk(new P.wF([],z),new P.rG(z),new P.rM(z)).$1(a)
+new P.Qa().$0()
+return y},
+o7:function(a,b){var z=[]
+return new P.xL(b,new P.CA([],z),new P.D6(z),new P.KC(z)).$1(a)},
+J3:function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
 if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"$1","D3",2,0,null,252,[]],
-QO:[function(a){if(!!J.x(a).$isqS)return{data:a.Rn,height:a.fg,width:a.R}
-return a},"$1","Gg",2,0,null,253,[]],
-dg:function(){var z=$.L4
-if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
-$.L4=z}return z},
-F7:function(){var z=$.PN
-if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
-$.PN=z}return z},
-aI:{
-"^":"Tp:200;b,c",
-$1:[function(a){var z,y,x
+y.BYTES_PER_ELEMENT=1}return a}return new P.nl(a.data,a.height,a.width)},
+QO:function(a){if(!!J.x(a).$isnl)return{data:a.Rn,height:a.fg,width:a.R}
+return a},
+F7:function(){var z=$.R6
+if(z==null){z=$.Qz
+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},
+wF:{
+"^":"Xs:26;b,c",
+$1:function(a){var z,y,x
 z=this.b
 y=z.length
 for(x=0;x<y;++x)if(z[x]===a)return x
 z.push(a)
 this.c.push(null)
-return y},"$1",null,2,0,null,30,[],"call"],
+return y},
 $isEH:true},
 rG:{
-"^":"Tp:363;d",
-$1:[function(a){var z=this.d
+"^":"Xs:103;d",
+$1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
-return z[a]},"$1",null,2,0,null,334,[],"call"],
+return z[a]},
 $isEH:true},
-yh:{
-"^":"Tp:434;e",
-$2:[function(a,b){var z=this.e
+rM:{
+"^":"Xs:104;e",
+$2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"$2",null,4,0,null,334,[],28,[],"call"],
+z[a]=b},
 $isEH:true},
-wO:{
-"^":"Tp:115;",
-$0:[function(){},"$0",null,0,0,null,"call"],
+Qa:{
+"^":"Xs:42;",
+$0:function(){},
 $isEH:true},
-Tm:{
-"^":"Tp:116;f,UI,bK",
-$1:[function(a){var z,y,x,w,v,u
+Kk:{
+"^":"Xs:10;f,UI,bK",
+$1:function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -10424,11 +9704,11 @@
 if(typeof a==="string")return a
 y=J.x(a)
 if(!!y.$isiP)return new Date(a.y3)
-if(!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
+if(!!y.$iswL)throw H.b(P.SY("structured clone of RegExp"))
 if(!!y.$ishH)return a
-if(!!y.$isAz)return a
+if(!!y.$isO4)return a
 if(!!y.$isSg)return a
-if(!!y.$isWZ)return a
+if(!!y.$isD8)return a
 if(!!y.$ispF)return a
 if(!!y.$isZ0){x=this.f.$1(a)
 w=this.UI.$1(x)
@@ -10437,48 +9717,46 @@
 w={}
 z.a=w
 this.bK.$2(x,w)
-y.aN(a,new P.ib(z,this))
-return z.a}if(!!y.$isList){v=y.gB(a)
+y.aN(a,new P.q1(z,this))
+return z.a}if(!!y.$isWO){v=y.gB(a)
 x=this.f.$1(a)
 w=this.UI.$1(x)
 if(w!=null){if(!0===w){w=new Array(v)
 this.bK.$2(x,w)}return w}w=new Array(v)
 this.bK.$2(x,w)
-if(typeof v!=="number")return H.s(v)
-u=0
-for(;u<v;++u){z=this.$1(y.t(a,u))
+for(u=0;u<v;++u){z=this.$1(y.t(a,u))
 if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"$1",null,2,0,null,21,[],"call"],
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
 $isEH:true},
-ib:{
-"^":"Tp:300;a,Gq",
-$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,49,[],30,[],"call"],
+q1:{
+"^":"Xs:51;a,IU",
+$2:function(a,b){this.a.a[a]=this.IU.$1(b)},
 $isEH:true},
 CA:{
-"^":"Tp:200;a,b",
-$1:[function(a){var z,y,x,w
+"^":"Xs:26;a,b",
+$1:function(a){var z,y,x,w
 z=this.a
 y=z.length
 for(x=0;x<y;++x){w=z[x]
 if(w==null?a==null:w===a)return x}z.push(a)
 this.b.push(null)
-return y},"$1",null,2,0,null,30,[],"call"],
+return y},
 $isEH:true},
-YL:{
-"^":"Tp:363;c",
-$1:[function(a){var z=this.c
+D6:{
+"^":"Xs:103;c",
+$1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
-return z[a]},"$1",null,2,0,null,334,[],"call"],
+return z[a]},
 $isEH:true},
 KC:{
-"^":"Tp:434;d",
-$2:[function(a,b){var z=this.d
+"^":"Xs:104;d",
+$2:function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"$2",null,4,0,null,334,[],28,[],"call"],
+z[a]=b},
 $isEH:true},
 xL:{
-"^":"Tp:116;e,f,UI,bK",
-$1:[function(a){var z,y,x,w,v,u,t
+"^":"Xs:10;e,f,UI,bK",
+$1:function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
 if(typeof a==="number")return a
@@ -10502,803 +9780,838 @@
 u=J.w1(y)
 t=0
 for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
-return y}return a},"$1",null,2,0,null,21,[],"call"],
+return y}return a},
 $isEH:true},
-qS:{
+nl:{
 "^":"a;Rn>,fg>,R>",
-$isqS:true,
+$isnl:true,
 $isSg:true},
-As:{
+As3:{
 "^":"a;",
 bu:function(a){return this.lF().zV(0," ")},
-O4:function(a,b){var z,y
-z=this.lF()
-if(!z.tg(0,a)){z.h(0,a)
-y=!0}else{z.Rz(0,a)
-y=!1}this.p5(z)
-return y},
-qU:function(a){return this.O4(a,null)},
 gA:function(a){var z=this.lF()
 z=H.VM(new P.zQ(z,z.zN,null,null),[null])
 z.zq=z.O2.H9
 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.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,435,128,[]],
-ev:function(a,b){var z=this.lF()
-return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},
-Ft:[function(a,b){var z=this.lF()
-return H.VM(new H.kV(z,b),[H.ip(z,"mW",0),null])},"$1","git",2,0,436,128,[]],
+ez:[function(a,b){return this.lF().ez(0,b)},"$1","gIr",2,0,105,48],
+ev:function(a,b){return this.lF().ev(0,b)},
+Ft:[function(a,b){return this.lF().Ft(0,b)},"$1","git",2,0,106,48],
 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},
 tg:function(a,b){return this.lF().tg(0,b)},
-hV:function(a){return this.lF().tg(0,a)?a:null},
-h:function(a,b){return this.OS(new P.GE(b))},
+iQ:function(a){return this.lF().tg(0,a)?a:null},
+h:function(a,b){return this.OS(new P.Fe(b))},
 Rz:function(a,b){var z,y
 z=this.lF()
 y=z.Rz(0,b)
 this.p5(z)
 return y},
-FV:function(a,b){this.OS(new P.rl(b))},
+FV:function(a,b){this.OS(new P.WK(b))},
 grZ:function(a){var z=this.lF().lX
 if(z==null)H.vh(P.w("No elements"))
 return z.gGc()},
 tt:function(a,b){return this.lF().tt(0,b)},
 br:function(a){return this.tt(a,!0)},
-eR:function(a,b){var z=this.lF()
-return H.ke(z,b,H.ip(z,"mW",0))},
-Zv:function(a,b){return this.lF().Zv(0,b)},
 V1:function(a){this.OS(new P.uQ())},
 OS:function(a){var z,y
 z=this.lF()
 y=a.$1(z)
 this.p5(z)
 return y},
-$isz5:true,
-$asz5:function(){return[J.O]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.O]}},
-GE:{
-"^":"Tp:116;a",
-$1:[function(a){return a.h(0,this.a)},"$1",null,2,0,null,94,[],"call"],
+$iscX:true,
+$ascX:function(){return[P.qU]}},
+Fe:{
+"^":"Xs:10;a",
+$1:function(a){return a.h(0,this.a)},
 $isEH:true},
-rl:{
-"^":"Tp:116;a",
-$1:[function(a){return a.FV(0,this.a)},"$1",null,2,0,null,94,[],"call"],
+WK:{
+"^":"Xs:10;a",
+$1:function(a){return a.FV(0,this.a)},
 $isEH:true},
 uQ:{
-"^":"Tp:116;",
-$1:[function(a){return a.V1(0)},"$1",null,2,0,null,94,[],"call"],
+"^":"Xs:10;",
+$1:function(a){return a.V1(0)},
 $isEH:true},
 D7:{
-"^":"ar;ndS,h2",
-gzT:function(){var z=this.h2
-return P.F(z.ev(z,new P.hT()),!0,W.cv)},
-aN:function(a,b){H.bQ(this.gzT(),b)},
-u:function(a,b,c){var z=this.gzT()
+"^":"rm;NJ,iz",
+gye:function(){var z=this.iz
+return P.F(z.ev(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()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.ZP(z[b],c)},
-sB:function(a,b){var z,y
-z=this.gzT().length
-y=J.Wx(b)
-if(y.F(b,z))return
-else if(y.C(b,0))throw H.b(P.u("Invalid list length"))
+J.Bj(z[b],c)},
+sB:function(a,b){var z=this.gye().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.h2.NL.appendChild(b)},
+h:function(a,b){this.iz.NL.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.iz.NL;z.G();)y.appendChild(z.lo)},
 tg:function(a,b){return!1},
-GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
-np:function(a){return this.GT(a,null)},
+XP:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
+Jd:function(a){return this.XP(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.D6(this.gzT(),b,c),new P.GS())},
-V1:function(a){J.r4(this.h2.NL)},
-xe:function(a,b,c){this.h2.xe(0,b,c)},
-oF:function(a,b,c){var z,y
-z=this.h2.NL
+vg: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)},
+aP:function(a,b,c){this.iz.aP(0,b,c)},
+UG:function(a,b,c){var z,y
+z=this.iz.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
-Rz:function(a,b){return!1},
-gB:function(a){return this.gzT().length},
-t:function(a,b){var z=this.gzT()
+J.Qk(z,c,y[b])},
+gB:function(a){return this.gye().length},
+t:function(a,b){var z=this.gye()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-gA:function(a){var z=this.gzT()
+gA:function(a){var z=this.gye()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
-"^":"Tp:116;",
-$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,211,[],"call"],
+"^":"Xs:10;",
+$1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
 GS:{
-"^":"Tp:116;",
-$1:[function(a){return J.QC(a)},"$1",null,2,0,null,295,[],"call"],
+"^":"Xs:10;",
+$1:function(a){return J.wp(a)},
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
 pR:{
-"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gD5:[function(a){var z=a.tY
-if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
-else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
-else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
-else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
-else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,312,"hoverText"],
-Qx:[function(a){return this.gus(a)},"$0","gyX",0,0,115,"expander"],
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gJp:function(a){var z=a.tY
+if(z!=null)if(J.xC(z.gzS(),"Null"))if(J.xC(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
+else if(J.xC(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
+else if(J.xC(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
+else if(J.xC(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
+else if(J.xC(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
+return Q.xI.prototype.gJp.call(this,a)},
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,42],
 vQ:[function(a,b,c){var z,y
 z=a.tY
-if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
+if(b===!0)J.LE(z).ml(new B.qB(a)).wM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,437,438,[],339,[],"expandEvent"],
-"@":function(){return[C.VW]},
-static:{lu:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+c.$0()}},"$2","gNe",4,0,107,108,66],
+static:{lu:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.cp.ZL(a)
-C.cp.oX(a)
-return a},null,null,0,0,115,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[342],
-Js:{
-"^":"Tp:116;a-85",
+a.on=z
+a.BA=y
+a.LL=w
+C.EL.ZL(a)
+C.EL.XI(a)
+return a}}},
+qB:{
+"^":"Xs:10;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.szz(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
-y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
-y.ct(z,C.kY,0,1)},"$1",null,2,0,116,57,[],"call"],
-$isEH:true},
-"+ Js":[315]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+z.tY=y.ct(z,C.xP,z.tY,a)
+y.ct(z,C.xP,0,1)},"$1",null,2,0,null,94,"call"],
+$isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["V9;Xh%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gQr:[function(a){return a.Xh},null,null,1,0,337,"instance",308,311],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,338,30,[],"instance",308],
-vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
-Xe:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,343,344,[],"retainedSize"],
-pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.qlk]},
-static:{Co:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.pU.ZL(a)
-C.pU.oX(a)
-return a},null,null,0,0,115,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[439],
-V9:{
+"^":"V5;Xh,f2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+ghf:function(a){return a.Xh},
+shf:function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},
+gIi:function(a){return a.f2},
+sIi:function(a,b){a.f2=this.ct(a,C.XM,a.f2,b)},
+vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,67,68],
+S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,109,69],
+ee:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,109,87],
+RF:[function(a,b){J.LE(a.Xh).wM(b)},"$1","gVm",2,0,17,66],
+static:{BN:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.ry.ZL(a)
+C.ry.XI(a)
+return a}}},
+V5:{
 "^":"uL+Pi;",
-$isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
+$isd3:true},
+cL:{
+"^":"Xs:95;a",
+$1:[function(a){var z=this.a
+z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,61,"call"],
+$isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
+"^":"",
+L4:{
+"^":"V8;PM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gkm:function(a){return a.PM},
+skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
+RF:[function(a,b){J.LE(a.PM).wM(b)},"$1","gVm",2,0,17,66],
+static:{p4:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.za.ZL(a)
+C.za.XI(a)
+return a}}},
+V8:{
+"^":"uL+Pi;",
+$isd3:true},
+mO:{
+"^":"V10;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gjx:function(a){return a.Cr},
+sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gVm",2,0,17,66],
+static:{G7:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.Ie.ZL(a)
+C.Ie.XI(a)
+return a}}},
+V10:{
+"^":"uL+Pi;",
+$isd3:true},
+DE:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{oB:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.Ig.ZL(a)
+C.Ig.XI(a)
+return a}}},
+U1:{
+"^":"V11;yR,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gql:function(a){return a.yR},
+sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
+RF:[function(a,b){J.LE(a.yR).wM(b)},"$1","gVm",2,0,17,66],
+TY:[function(a){J.LE(a.yR).wM(new E.XB(a))},"$0","gW6",0,0,15],
+q0:function(a){Z.uL.prototype.q0.call(this,a)
+a.mZ=P.ww(P.ii(0,0,0,0,0,1),this.gW6(a))},
+Nz:function(a){var z
+Z.uL.prototype.Nz.call(this,a)
+z=a.mZ
+if(z!=null){z.ed()
+a.mZ=null}},
+static:{hm:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.NK.ZL(a)
+C.NK.XI(a)
+return a}}},
+V11:{
+"^":"uL+Pi;",
+$isd3:true},
+XB:{
+"^":"Xs:42;a",
+$0:[function(){var z=this.a
+if(z.mZ!=null)z.mZ=P.ww(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
+$isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 Se:{
-"^":["Y2;B1>,SF<-440,H<-440,Zn@-305,vs@-305,ki@-305,Vh@-305,LH@-305,eT,yt-326,wd-327,oH-328,R7,aZ,cp,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
-gtT:[function(a){return J.on(this.H)},null,null,1,0,346,"code",308],
-C4:function(a){var z,y,x,w,v,u,t,s,r
+"^":"Y2;B1>,YK,H,Zn<,vs<,ki<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
+gtT:function(a){return J.on(this.H)},
+C4:function(a){var z,y,x,w,v,u,t,s
 z=this.B1
 y=J.UQ(z,"threshold")
-x=this.wd
-w=J.U6(x)
-if(J.z8(w.gB(x),0))return
-for(v=this.H,u=J.GP(J.uw(v)),t=this.SF;u.G();){s=u.gl()
-r=J.FW(s.gAv(),v.gAv())
+x=this.ks
+if(x.length>0)return
+for(w=this.H,v=J.mY(J.EO(w)),u=this.YK;v.G();){t=v.gl()
+s=J.L9(t.gAv(),w.gAv())
 if(typeof y!=="number")return H.s(y)
-if(!(r>y||J.FW(J.on(s).gDu(),t.gAv())>y))continue
-w.h(x,X.SJ(z,t,s,this))}},
-o8:function(){},
-Nh:function(){return J.z8(J.q8(J.uw(this.H)),0)},
+if(!(s>y||J.L9(J.on(t).gDu(),u.Av)>y))continue
+x.push(X.SJ(z,u,t,this))}},
+cO:function(){},
+Nh:function(){return J.q8(J.EO(this.H))>0},
 mW:function(a,b,c,d){var z,y
 z=this.H
 this.Vh=H.d(z.gAv())
-this.LH=G.P0(J.FW(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.de(J.Iz(y.gtT(z)),C.oA)){this.Zn="Tag (category)"
-if(d==null)this.vs=G.G0(z.gAv(),this.SF.gAv())
-else this.vs=G.G0(z.gAv(),d.H.gAv())
-this.ki=G.G0(z.gAv(),this.SF.gAv())}else{if(J.de(J.Iz(y.gtT(z)),C.WA)||J.de(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
+if(J.xC(J.Iz(y.gtT(z)),C.Z7)){this.Zn="Tag (category)"
+if(d==null)this.vs=G.dj(z.gAv(),this.YK.Av)
+else this.vs=G.dj(z.gAv(),d.H.gAv())
+this.ki=G.dj(z.gAv(),this.YK.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.G0(z.gAv(),this.SF.gAv())
-else this.vs=G.G0(z.gAv(),d.H.gAv())
-this.ki=G.G0(y.gtT(z).gDu(),this.SF.gAv())}z=this.oH
-y=J.w1(z)
-y.h(z,this.vs)
-y.h(z,this.ki)},
+if(d==null)this.vs=G.dj(z.gAv(),this.YK.Av)
+else this.vs=G.dj(z.gAv(),d.H.gAv())
+this.ki=G.dj(y.gtT(z).gDu(),this.YK.Av)}z=this.oH
+z.push(this.vs)
+z.push(this.ki)},
 static:{SJ:function(a,b,c,d){var z,y
 z=H.VM([],[G.Y2])
-y=d!=null?J.WB(d.yt,1):0
+y=d!=null?d.yt+1:0
 z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192","cursor: pointer;",!1,null,null)
 z.k7(d)
 z.mW(a,b,c,d)
 return z}}},
-E7:{
-"^":["V10;pD%-336,zt%-304,eH%-305,NT%-305,Xv%-305,M5%-305,ik%-305,jS%-305,XX%-441,BJ%-305,qO=-85,Hm%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.pD},null,null,1,0,337,"profile",308,311],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,338,30,[],"profile",308],
-gPL:[function(a){return a.zt},null,null,1,0,307,"hideTagsChecked",308,309],
-sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,310,30,[],"hideTagsChecked",308],
-gEW:[function(a){return a.eH},null,null,1,0,312,"sampleCount",308,309],
-sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,32,30,[],"sampleCount",308],
-gUo:[function(a){return a.NT},null,null,1,0,312,"refreshTime",308,309],
-sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,32,30,[],"refreshTime",308],
-gEly:[function(a){return a.Xv},null,null,1,0,312,"sampleRate",308,309],
-sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",308],
-gIZ:[function(a){return a.M5},null,null,1,0,312,"sampleDepth",308,309],
-sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",308],
-gNG:[function(a){return a.ik},null,null,1,0,312,"displayCutoff",308,309],
-sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",308],
-gQl:[function(a){return a.jS},null,null,1,0,312,"timeSpan",308,309],
-sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,32,30,[],"timeSpan",308],
-gib:[function(a){return a.BJ},null,null,1,0,312,"tagSelector",308,309],
-sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,32,30,[],"tagSelector",308],
-pM:[function(a,b){var z,y,x,w
-z=a.pD
+kK:{
+"^":"V12;ix,fv,y7,hZ,Jy,Cv,zo,fJ,XX,VH,EX,Hm=,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gB1:function(a){return a.ix},
+sB1:function(a,b){a.ix=this.ct(a,C.vb,a.ix,b)},
+gGq:function(a){return a.fv},
+sGq:function(a,b){a.fv=this.ct(a,C.He,a.fv,b)},
+gLW:function(a){return a.y7},
+sLW:function(a,b){a.y7=this.ct(a,C.Gs,a.y7,b)},
+gUo:function(a){return a.hZ},
+sUo:function(a,b){a.hZ=this.ct(a,C.Dj,a.hZ,b)},
+gEl:function(a){return a.Jy},
+sEl:function(a,b){a.Jy=this.ct(a,C.YD,a.Jy,b)},
+gnZ:function(a){return a.Cv},
+snZ:function(a,b){a.Cv=this.ct(a,C.bE,a.Cv,b)},
+gNG:function(a){return a.zo},
+sNG:function(a,b){a.zo=this.ct(a,C.aH,a.zo,b)},
+gQl:function(a){return a.fJ},
+sQl:function(a,b){a.fJ=this.ct(a,C.zz,a.fJ,b)},
+gZA:function(a){return a.VH},
+sZA:function(a,b){a.VH=this.ct(a,C.TW,a.VH,b)},
+pM:[function(a,b){var z,y,x,w,v
+z=a.ix
 if(z==null)return
 y=J.UQ(z,"samples")
 x=new P.iP(Date.now(),!1)
 x.EK()
 z=J.AG(y)
-a.eH=this.ct(a,C.XU,a.eH,z)
+a.y7=this.ct(a,C.Gs,a.y7,z)
 z=x.bu(0)
-a.NT=this.ct(a,C.Dj,a.NT,z)
-z=J.AG(J.UQ(a.pD,"depth"))
-a.M5=this.ct(a,C.bE,a.M5,z)
-w=J.UQ(a.pD,"period")
+a.hZ=this.ct(a,C.Dj,a.hZ,z)
+z=J.AG(J.UQ(a.ix,"depth"))
+a.Cv=this.ct(a,C.bE,a.Cv,z)
+w=J.UQ(a.ix,"period")
 if(typeof w!=="number")return H.s(w)
-z=C.CD.yM(1000000/w,0)
-a.Xv=this.ct(a,C.mI,a.Xv,z)
-z=G.mG(J.UQ(a.pD,"timeSpan"))
-a.jS=this.ct(a,C.zz,a.jS,z)
-z=J.AG(J.vX(a.XX,100))+"%"
-a.ik=this.ct(a,C.aH,a.ik,z)
-J.QP(a.pD).N3(a.pD)
-J.kW(a.pD,"threshold",a.XX)
-this.Cx(a)},"$1","gwm",2,0,169,242,[],"profileChanged"],
-i4:[function(a){var z=R.Jk([])
+z=C.CD.Sy(1000000/w,0)
+a.Jy=this.ct(a,C.YD,a.Jy,z)
+z=G.mG(J.UQ(a.ix,"timeSpan"))
+a.fJ=this.ct(a,C.zz,a.fJ,z)
+z=a.XX
+v=C.ON.bu(z*100)+"%"
+a.zo=this.ct(a,C.aH,a.zo,v)
+J.aT(a.ix).N3(a.ix)
+J.kW(a.ix,"threshold",z)
+this.Dq(a)},"$1","gd0",2,0,17,35],
+q0:function(a){var z=R.tB([])
 a.Hm=new G.XN(z,null,null)
-this.Cx(a)},"$0","gQd",0,0,126,"enteredView"],
-m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,169,242,[],"tagSelectorChanged"],
-pA:[function(a,b){var z="profile?tags="+H.d(a.BJ)
-J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-Cx:[function(a){if(a.pD==null)return
-this.EX(a)},"$0","gBn",0,0,126,"_update"],
-EX:[function(a){var z,y,x,w,v
-z=J.QP(a.pD).gBC()
+this.Dq(a)},
+m5:[function(a,b){this.RF(a,null)},"$1","gb6",2,0,17,35],
+RF:[function(a,b){var z="profile?tags="+H.d(a.VH)
+J.aT(a.ix).cv(z).ml(new X.Xy(a)).wM(b)},"$1","gVm",2,0,17,66],
+Dq:function(a){if(a.ix==null)return
+this.a8(a)},
+a8:function(a){var z,y,x,w,v,u,t
+z=J.aT(a.ix).gBC()
 if(z==null)return
-try{a.Hm.rT(X.SJ(a.pD,z,z,null))}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,126,"_buildStackTree"],
-ba:[function(a){this.EX(a)},"$0","gvr",0,0,126,"_buildTree"],
-ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,443,331,[],"padding",309],
-ZZ:[function(a,b){var z=J.bY(J.xH(b.gyt(),1),9)
-if(z>>>0!==z||z>=9)return H.e(C.Ym,z)
-return C.Ym[z]},"$1","gth",2,0,443,331,[],"coloring",309],
-YF:[function(a,b,c,d){var z,y,x,w,v,u
-w=J.RE(b)
-if(!J.de(J.F8(w.gN(b)),"expand")&&!J.de(w.gN(b),d))return
-z=J.u3(d)
-if(!!J.x(z).$isqp)try{w=a.Hm
-v=J.Bx(z)
-if(typeof v!=="number")return v.W()
-w.qU(v-1)}catch(u){w=H.Ru(u)
+try{w=a.Hm
+v=X.SJ(a.ix,z,z,null)
+w=w.WT
+u=J.w1(w)
+u.V1(w)
+v.C4(0)
+u.FV(w,v.ks)}catch(t){w=H.Ru(t)
 y=w
-x=new H.XO(u,null)
-N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,428,21,[],351,[],82,[],"toggleExpanded",309],
-"@":function(){return[C.jR]},
-static:{"^":"B6<-85",jD:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.eH=""
-a.NT=""
-a.Xv=""
-a.M5=""
-a.ik=""
-a.jS=""
+x=new H.oP(t,null)
+N.QM("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,110,63],
+LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,110,63],
+YF:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+w=J.RE(b)
+if(!J.xC(J.F8(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()
+u=w.WT
+t=J.U6(u)
+z=t.t(u,v-1)
+if(z.r8()===!0)t.UG(u,t.u8(u,z)+1,J.EO(z))
+else w.FS(z)}catch(s){w=H.Ru(s)
+y=w
+x=new H.oP(s,null)
+N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,100,1,71,72],
+static:{"^":"B6",os:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.y7=""
+a.hZ=""
+a.Jy=""
+a.Cv=""
+a.zo=""
+a.fJ=""
 a.XX=0.0002
-a.BJ="uv"
-a.qO="#tableTree"
-a.SO=z
-a.B7=y
-a.X0=w
-C.kS.ZL(a)
-C.kS.oX(a)
-return a},null,null,0,0,115,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[444],
-V10:{
-"^":"uL+Pi;",
-$isd3:true},
-SV:{
-"^":"Tp:338;a-85",
-$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,338,202,[],"call"],
-$isEH:true},
-"+ SV":[315]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
-"^":"",
-oO:{
-"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.j6]},
-static:{Zgg:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.LN.ZL(a)
-C.LN.oX(a)
-return a},null,null,0,0,115,"new IsolateRefElement$created"]}},
-"+IsolateRefElement":[342]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
-"^":"",
-Stq:{
-"^":["V11;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
-"@":function(){return[C.aM]},
-static:{N5:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.Qt.ZL(a)
-C.Qt.oX(a)
-return a},null,null,0,0,115,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[446],
-V11:{
-"^":"uL+Pi;",
-$isd3:true},
-IWF:{
-"^":["V12;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
-TJ:[function(a,b){return a.Pw.cv("debug/pause").ml(new D.GG(a))},"$1","gAK",2,0,447,117,[],"pause"],
-nY:[function(a,b){return a.Pw.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,447,117,[],"resume"],
-"@":function(){return[C.Xuf]},
-static:{dm:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.F2.ZL(a)
-C.F2.oX(a)
-return a},null,null,0,0,115,"new IsolateRunStateElement$created"]}},
-"+IsolateRunStateElement":[448],
+a.VH="uv"
+a.EX="#tableTree"
+a.on=z
+a.BA=y
+a.LL=w
+C.bb.ZL(a)
+C.bb.XI(a)
+return a}}},
 V12:{
 "^":"uL+Pi;",
 $isd3:true},
-GG:{
-"^":"Tp:116;a-85",
-$1:[function(a){return J.am(J.qz(this.a))},"$1",null,2,0,116,57,[],"call"],
-$isEH:true},
-"+ GG":[315],
-r8:{
-"^":"Tp:116;a-85",
-$1:[function(a){return J.am(J.qz(this.a))},"$1",null,2,0,116,57,[],"call"],
-$isEH:true},
-"+ r8":[315],
-Yj:{
-"^":["V13;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
-"@":function(){return[C.Ux]},
-static:{b2:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.rC.ZL(a)
-C.rC.oX(a)
-return a},null,null,0,0,115,"new IsolateLocationElement$created"]}},
-"+IsolateLocationElement":[449],
+Xy:{
+"^":"Xs:98;a",
+$1:[function(a){var z=this.a
+z.ix=J.Q5(z,C.vb,z.ix,a)},"$1",null,2,0,null,111,"call"],
+$isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+"^":"",
+oa:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{IB:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.LN.ZL(a)
+C.LN.XI(a)
+return a}}}}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"^":"",
+St:{
+"^":"V13;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.nM.ZL(a)
+C.nM.XI(a)
+return a}}},
 V13:{
 "^":"uL+Pi;",
 $isd3:true},
-Oz:{
-"^":["V14;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
-"@":function(){return[C.Po]},
-static:{RP:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.kd.ZL(a)
-C.kd.oX(a)
-return a},null,null,0,0,115,"new IsolateSharedSummaryElement$created"]}},
-"+IsolateSharedSummaryElement":[450],
+IW:{
+"^":"V14;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+god:function(a){return a.ow},
+sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
+Fv:[function(a,b){return a.ow.cv("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,112,11],
+jh:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,112,11],
+static:{dm:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.F2.ZL(a)
+C.F2.XI(a)
+return a}}},
 V14:{
 "^":"uL+Pi;",
 $isd3:true},
+GG:{
+"^":"Xs:10;a",
+$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,94,"call"],
+$isEH:true},
+r8:{
+"^":"Xs:10;a",
+$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,94,"call"],
+$isEH:true},
+Qh:{
+"^":"V15;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+god:function(a){return a.ow},
+sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
+static:{Qj:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.rC.ZL(a)
+C.rC.XI(a)
+return a}}},
+V15:{
+"^":"uL+Pi;",
+$isd3:true},
+Oz:{
+"^":"V16;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+god:function(a){return a.ow},
+sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
+static:{RP:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.Ji.ZL(a)
+C.Ji.XI(a)
+return a}}},
+V16:{
+"^":"uL+Pi;",
+$isd3:true},
 vT:{
-"^":"a;z3,Nt",
+"^":"a;Y0,WL",
 eC:function(a){var z,y,x,w,v,u
-z=this.z3.Yb
-if(J.de(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Name"])
-z.V7("addColumn",["number","Value"])}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-for(y=J.GP(a.gvc()),x=J.U6(a);y.G();){w=y.gl()
+z=this.Y0.Yb
+if(J.xC(z.nQ("getNumberOfColumns"),0)){z.K9("addColumn",["string","Name"])
+z.K9("addColumn",["number","Value"])}z.K9("removeRows",[0,z.nQ("getNumberOfRows")])
+for(y=J.mY(a.gvc()),x=J.U6(a);y.G();){w=y.gl()
 v=J.uH(x.t(a,w),"%")
 if(0>=v.length)return H.e(v,0)
 u=[]
-C.Nm.FV(u,C.Nm.ez([w,H.IH(v[0],null)],P.En()))
+C.Nm.FV(u,C.Nm.ez([w,H.RR(v[0],null)],P.En()))
 u=new P.Tz(u)
 u.$builtinTypeInfo=[null]
-z.V7("addRow",[u])}},
-W2:function(a){var z=this.Nt
-if(z==null){z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.zV(J.UQ($.NR,"PieChart"),[a])
-this.Nt=z}z.W2(this.z3)}},
-YA:{
-"^":["V15;E1%-451,iF%-452,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ghw:[function(a){return a.E1},null,null,1,0,453,"counters",308,311],
-shw:[function(a,b){a.E1=this.ct(a,C.MR,a.E1,b)},null,null,3,0,454,30,[],"counters",308],
-ak:[function(a,b){var z,y
-z=a.E1
+z.K9("addRow",[u])}}},
+Mc:{
+"^":"V17;wd,iF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gKE:function(a){return a.wd},
+sKE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
+ak:[function(a,b){var z,y,x
+if(a.wd==null)return
+if($.Xr().MM.Gv!==0&&a.iF==null)a.iF=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
+z=a.iF
 if(z==null)return
-a.iF.eC(z)
+z.eC(a.wd)
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#counterPieChart")
-if(y!=null)a.iF.W2(y)},"$1","gAB",2,0,169,242,[],"countersChanged"],
-"@":function(){return[C.Bd]},
-static:{BP:[function(a){var z,y,x,w,v
-z=P.zV(J.UQ($.NR,"DataTable"),null)
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.iF=new D.vT(new G.ig(z),null)
-a.SO=y
-a.B7=x
-a.X0=v
+if(y!=null){z=a.iF
+x=z.WL
+if(x==null){x=new G.qu(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,17,35],
+static:{BP:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.wQ.ZL(a)
-C.wQ.oX(a)
-return a},null,null,0,0,115,"new IsolateCounterChartElement$created"]}},
-"+IsolateCounterChartElement":[455],
-V15:{
+C.wQ.XI(a)
+return a}}},
+V17:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
 Lr:{
-"^":"a;hO,Pl",
+"^":"a;Xr,Z5",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.hO.Yb
-if(J.de(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
-for(y=a.gaf(),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=y.lo
-if(J.de(x,"Idle"))continue
-z.V7("addColumn",["number",x])}}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-y=a.gaf()
-w=H.TK(y,"Idle",0,y.length)
-v=a.gZ0()
+z=this.Xr.Yb
+if(J.xC(z.nQ("getNumberOfColumns"),0)){z.K9("addColumn",["string","Time"])
+for(y=J.mY(a.gaf());y.G();){x=y.lo
+if(J.xC(x,"Idle"))continue
+z.K9("addColumn",["number",x])}}z.K9("removeRows",[0,z.nQ("getNumberOfRows")])
+w=J.UU(a.gaf(),"Idle")
+v=a.gij()
 for(u=0;u<a.glI().length;++u){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-t=y[u].gSP()
+t=y[u].SP
 s=[]
 if(t>0){if(typeof v!=="number")return H.s(v)
-s.push("t "+C.CD.yM(t-v,2))}else s.push("")
+s.push("t "+C.CD.Sy(t-v,2))}else s.push("")
 y=a.glI()
 if(u>=y.length)return H.e(y,u)
-r=y[u].gaQ()
+r=y[u].wZ
 if(r===0){q=0
 while(!0){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-y=J.q8(J.Mv(y[u]))
-if(typeof y!=="number")return H.s(y)
-if(!(q<y))break
+if(!(q<y[u].KE.length))break
 c$1:{if(q===w)break c$1
 s.push(0)}++q}}else{q=0
 while(!0){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-y=J.q8(J.Mv(y[u]))
-if(typeof y!=="number")return H.s(y)
-if(!(q<y))break
+if(!(q<y[u].KE.length))break
 c$1:{if(q===w)break c$1
 y=a.glI()
 if(u>=y.length)return H.e(y,u)
-s.push(C.CD.yu(J.FW(J.UQ(J.Mv(y[u]),q),r)*100))}++q}}y=[]
+y=y[u].KE
+if(q>=y.length)return H.e(y,q)
+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.Tz(y)
 y.$builtinTypeInfo=[null]
-z.V7("addRow",[y])}},
-W2:function(a){var z,y
-if(this.Pl==null){z=P.L5(null,null,null,null,null)
-y=new G.qu(null,z)
-y.vR=P.zV(J.UQ($.NR,"SteppedAreaChart"),[a])
-this.Pl=y
-z.u(0,"isStacked",!0)
-this.Pl.bG.u(0,"connectSteps",!1)
-this.Pl.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.Pl.W2(this.hO)}},
-qkb:{
-"^":["V16;oY%-445,ts%-456,e6%-457,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.oY},null,null,1,0,318,"isolate",308,311],
-sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,319,30,[],"isolate",308],
-vV:[function(a,b){var z=a.oY
-return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
-Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,126,"_updateTagProfile"],
-i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,126,"enteredView"],
-xo:[function(a){var z
-Z.uL.prototype.xo.call(this,a)
-z=a.ts
-if(z!=null)z.ed()},"$0","gbt",0,0,126,"leftView"],
-Ob:[function(a){var z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#tagProfileChart")
-if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,126,"_drawTagProfileChart"],
-pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-TJ:[function(a,b){return a.oY.cv("debug/pause").ml(new L.CV(a))},"$1","gAK",2,0,447,117,[],"pause"],
-nY:[function(a,b){return a.oY.cv("resume").ml(new L.IT(a))},"$1","gDQ",2,0,447,117,[],"resume"],
-"@":function(){return[C.NG]},
-static:{uD:[function(a){var z,y,x,w,v
-z=P.zV(J.UQ($.NR,"DataTable"),null)
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.e6=new L.Lr(new G.ig(z),null)
-a.SO=y
-a.B7=x
-a.X0=v
+z.K9("addRow",[y])}}},
+qk:{
+"^":"V18;px,ii,LR,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+god:function(a){return a.px},
+sod:function(a,b){a.px=this.ct(a,C.rB,a.px,b)},
+vV:[function(a,b){var z=a.px
+return z.cv(J.ew(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,67,68],
+MJ:[function(a){a.px.m7().ml(new L.LX(a))},"$0","gPW",0,0,15],
+q0:function(a){Z.uL.prototype.q0.call(this,a)
+a.ii=P.ww(P.ii(0,0,0,0,0,1),this.gPW(a))},
+Nz:function(a){var z
+Z.uL.prototype.Nz.call(this,a)
+z=a.ii
+if(z!=null)z.ed()},
+RF:[function(a,b){J.LE(a.px).wM(b)},"$1","gVm",2,0,17,66],
+Fv:[function(a,b){return a.px.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,112,11],
+jh:[function(a,b){return a.px.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,112,11],
+static:{KM:function(a){var z,y,x,w,v
+z=P.zV(J.UQ($.BY,"DataTable"),null)
+y=$.J1()
+x=P.YM(null,null,null,P.qU,W.I0)
+w=P.qU
+v=W.h4
+v=H.VM(new V.qC(P.YM(null,null,null,w,v),null,null),[w,v])
+a.LR=new L.Lr(new G.Kf(z),null)
+a.on=y
+a.BA=x
+a.LL=v
 C.Xe.ZL(a)
-C.Xe.oX(a)
-return a},null,null,0,0,115,"new IsolateViewElement$created"]}},
-"+IsolateViewElement":[458],
-V16:{
+C.Xe.XI(a)
+return a}}},
+V18:{
 "^":"uL+Pi;",
 $isd3:true},
-BQ:{
-"^":"Tp:116;a-85",
-$1:[function(a){var z,y,x
+LX:{
+"^":"Xs:10;a",
+$1:[function(a){var z,y,x,w,v
 z=this.a
-y=J.RE(z)
-y.ge6(z).eC(a)
+y=z.LR
+y.eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
-if(x!=null)y.ge6(z).W2(x)
-y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,116,459,[],"call"],
+if(x!=null){if(y.Z5==null){w=P.L5(null,null,null,null,null)
+v=new G.qu(null,w)
+v.vR=P.zV(J.UQ($.BY,"SteppedAreaChart"),[x])
+y.Z5=v
+w.u(0,"isStacked",!0)
+y.Z5.bG.u(0,"connectSteps",!1)
+y.Z5.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.Z5.W2(y.Xr)}z.ii=P.ww(P.ii(0,0,0,0,0,1),J.yo(z))},"$1",null,2,0,null,113,"call"],
 $isEH:true},
-"+ BQ":[315],
 CV:{
-"^":"Tp:116;a-85",
-$1:[function(a){return J.am(J.Ag(this.a))},"$1",null,2,0,116,57,[],"call"],
+"^":"Xs:10;a",
+$1:[function(a){return J.LE(this.a.px)},"$1",null,2,0,null,94,"call"],
 $isEH:true},
-"+ CV":[315],
-IT:{
-"^":"Tp:116;a-85",
-$1:[function(a){return J.am(J.Ag(this.a))},"$1",null,2,0,116,57,[],"call"],
-$isEH:true},
-"+ IT":[315]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+Vq:{
+"^":"Xs:10;a",
+$1:[function(a){return J.LE(this.a.px)},"$1",null,2,0,null,94,"call"],
+$isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
-fM:{
-"^":"a;Fv,lp",
-KN:function(a,b){var z,y,x,w,v,u,t,s,r,q
-z=this.lp
+xh:{
+"^":"a;hw,jc",
+KN:function(a,b){var z,y,x,w,v,u,t,s
+z=this.jc
 if(z.tg(0,a))return
 z.h(0,a)
-for(y=J.GP(a.gvc()),x=this.Fv,w=J.U6(a),v=b+1;y.G();){u=y.gl()
+for(y=J.mY(a.gvc()),x=this.hw,w=J.U6(a),v=b+1;y.G();){u=y.gl()
 t=w.t(a,u)
 s=J.x(t)
-if(!!s.$isZ0){if(typeof "  "!=="number")return H.s("  ")
-r=b*"  "
-s=typeof r==="string"
-x.vM+=s?r:H.d(r)
-q="\""+H.d(u)+"\": {\n"
-x.vM+=q
+if(!!s.$isZ0){s=C.xB.U("  ",b)
+x.vM+=s
+s="\""+H.d(u)+"\": {\n"
+x.vM+=s
 this.KN(t,v)
-q=x.vM+=s?r:H.d(r)
-x.vM=q+"}\n"}else if(!!s.$isList){if(typeof "  "!=="number")return H.s("  ")
-r=b*"  "
-s=typeof r==="string"
-x.vM+=s?r:H.d(r)
-q="\""+H.d(u)+"\": [\n"
-x.vM+=q
-this.lG(t,v)
-q=x.vM+=s?r:H.d(r)
-x.vM=q+"]\n"}else{if(typeof "  "!=="number")return H.s("  ")
-r=b*"  "
-x.vM+=typeof r==="string"?r:H.d(r)
+s=C.xB.U("  ",b)
+s=x.vM+=s
+x.vM=s+"}\n"}else if(!!s.$isWO){s=C.xB.U("  ",b)
+x.vM+=s
+s="\""+H.d(u)+"\": [\n"
+x.vM+=s
+this.HC(t,v)
+s=C.xB.U("  ",b)
+s=x.vM+=s
+x.vM=s+"]\n"}else{s=C.xB.U("  ",b)
+x.vM+=s
 s="\""+H.d(u)+"\": "+H.d(t)
 s=x.vM+=s
 x.vM=s+"\n"}}z.Rz(0,a)},
-lG:function(a,b){var z,y,x,w,v,u,t,s
-z=this.lp
+HC:function(a,b){var z,y,x,w,v,u
+z=this.jc
 if(z.tg(0,a))return
 z.h(0,a)
-for(y=J.GP(a),x=this.Fv,w=b+1;y.G();){v=y.gl()
+for(y=J.mY(a),x=this.hw,w=b+1;y.G();){v=y.gl()
 u=J.x(v)
-if(!!u.$isZ0){if(typeof "  "!=="number")return H.s("  ")
-t=b*"  "
-u=typeof t==="string"
-s=x.vM+=u?t:H.d(t)
-x.vM=s+"{\n"
+if(!!u.$isZ0){u=C.xB.U("  ",b)
+u=x.vM+=u
+x.vM=u+"{\n"
 this.KN(v,w)
-s=x.vM+=u?t:H.d(t)
-x.vM=s+"}\n"}else if(!!u.$isList){if(typeof "  "!=="number")return H.s("  ")
-t=b*"  "
-u=typeof t==="string"
-s=x.vM+=u?t:H.d(t)
-x.vM=s+"[\n"
-this.lG(v,w)
-s=x.vM+=u?t:H.d(t)
-x.vM=s+"]\n"}else{if(typeof "  "!=="number")return H.s("  ")
-t=b*"  "
-x.vM+=typeof t==="string"?t:H.d(t)
+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.HC(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)}},
 vj:{
-"^":["V17;OZ%-336,X7%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gIr:[function(a){return a.OZ},null,null,1,0,337,"map",308,311],
+"^":"V19;OZ,X7,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gIr:function(a){return a.OZ},
 ez:function(a,b){return this.gIr(a).$1(b)},
-sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,338,30,[],"map",308],
-gxU:[function(a){return a.X7},null,null,1,0,312,"mapAsString",308,309],
-sxU:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,32,30,[],"mapAsString",308],
+sIr:function(a,b){a.OZ=this.ct(a,C.SR,a.OZ,b)},
+glp:function(a){return a.X7},
+slp:function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},
 oC:[function(a,b){var z,y,x
 z=P.p9("")
 y=P.Ls(null,null,null,null)
 x=a.OZ
 z.vM=""
 z.KF("{\n")
-new Z.fM(z,y).KN(x,0)
+new Z.xh(z,y).KN(x,0)
 z.KF("}\n")
 z=z.vM
-a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,169,242,[],"mapChanged"],
-"@":function(){return[C.KH]},
-static:{mA:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gdB",2,0,17,35],
+static:{M7:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.Yt.ZL(a)
-C.Yt.oX(a)
-return a},null,null,0,0,115,"new JsonViewElement$created"]}},
-"+JsonViewElement":[460],
-V17:{
+C.Yt.XI(a)
+return a}}},
+V19:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.uy]},
-static:{rA:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{rA:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
+a.on=z
+a.BA=y
+a.LL=w
 C.Z3.ZL(a)
-C.Z3.oX(a)
-return a},null,null,0,0,115,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[342]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+C.Z3.XI(a)
+return a}}}}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
-KL:{
-"^":["V18;a1%-461,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.a1},null,null,1,0,462,"library",308,311],
-stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,463,30,[],"library",308],
-vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
-pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.Oyb]},
-static:{Ro:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+CX:{
+"^":"V20;iI,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gHt:function(a){return a.iI},
+sHt:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)},
+vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.F8(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,67,68],
+RF:[function(a,b){J.LE(a.iI).wM(b)},"$1","gVm",2,0,17,66],
+static:{as:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.MG.ZL(a)
-C.MG.oX(a)
-return a},null,null,0,0,115,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[464],
-V18:{
+C.MG.XI(a)
+return a}}},
+V20:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
-TJ:{
-"^":"a;oc>,eT>,n2,Cj>,wd>,Gs",
+Rw:{
+"^":"a;oc>,eT>,qp,EV>,ks>,iL",
 gB8:function(){var z,y,x
 z=this.eT
-y=z==null||J.de(J.O6(z),"")
+y=z==null||J.xC(J.O6(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.qp
 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
+sOR:function(a){if($.RL&&this.eT!=null)this.qp=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.IE()},
+gSZ:function(){return this.JG()},
 Im: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()
 y=new P.iP(Date.now(),!1)
 y.EK()
-x=$.xO
-$.xO=x+1
+x=$.Y1
+$.Y1=x+1
 w=new N.HV(a,b,z,y,x,c,d)
-if($.RL)for(v=this;v!=null;){z=J.RE(v)
-z.od(v,w)
-v=z.geT(v)}else J.EY(N.Jx(""),w)}},
-X2:function(a,b,c){return this.Y6(C.Ek,a,b,c)},
+if($.RL)for(v=this;v!=null;){v.mw(w)
+v=J.Lp(v)}else N.QM("").mw(w)}},
+X2:function(a,b,c){return this.Y6(C.Ab,a,b,c)},
 x9:function(a){return this.X2(a,null,null)},
-dL:function(a,b,c){return this.Y6(C.R5,a,b,c)},
-J4:function(a){return this.dL(a,null,null)},
-ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
-To:function(a){return this.ZG(a,null,null)},
+dL:function(a,b,c){return this.Y6(C.eI,a,b,c)},
+Ny:function(a){return this.dL(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)},
 xH:function(a,b,c){return this.Y6(C.nT,a,b,c)},
 j2:function(a){return this.xH(a,null,null)},
-WB:function(a,b,c){return this.Y6(C.cV,a,b,c)},
-hh:function(a){return this.WB(a,null,null)},
-IE:function(){if($.RL||this.eT==null){var z=this.Gs
+WB:function(a,b,c){return this.Y6(C.Xm,a,b,c)},
+YX:function(a){return this.WB(a,null,null)},
+JG:function(){if($.RL||this.eT==null){var z=this.iL
 if(z==null){z=P.bK(null,null,!0,N.HV)
-this.Gs=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.Jx("").IE()},
-od:function(a,b){var z=this.Gs
+this.iL=z}z.toString
+return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.QM("").JG()},
+mw:function(a){var z=this.iL
 if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(b)}},
+z.Iv(a)}},
 QL:function(a,b,c){var z=this.eT
-if(z!=null)J.Tr(z).u(0,this.oc,this)},
-$isTJ:true,
-static:{"^":"DY",Jx:function(a){return $.U0().to(a,new N.dG(a))}}},
+if(z!=null)J.rl(z).u(0,this.oc,this)},
+$isRw:true,
+static:{"^":"Uj",QM:function(a){return $.Iu().to(a,new N.dG(a))}}},
 dG:{
-"^":"Tp:115;a",
-$0:[function(){var z,y,x,w,v
+"^":"Xs:42;a",
+$0:function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
 y=C.xB.cn(z,".")
-if(y===-1)x=z!==""?N.Jx(""):null
-else{x=N.Jx(C.xB.Nj(z,0,y))
-z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,J.O,N.TJ)
-v=new N.TJ(z,x,null,w,H.VM(new Q.Gj(w),[null,null]),null)
+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.Rw)
+v=new N.Rw(z,x,null,w,H.VM(new Q.Gj(w),[null,null]),null)
 v.QL(z,x,w)
-return v},"$0",null,0,0,null,"call"],
+return v},
 $isEH:true},
 qV:{
 "^":"a;oc>,P>",
@@ -11322,344 +10635,316 @@
 giO:function(a){return this.P},
 bu:function(a){return this.oc},
 $isqV:true,
-static:{"^":"K9,tmj,EL,LkO,reI,pd,dc,MHK,ow,lM,B9"}},
+static:{"^":"X9,tmj,Enk,LkO,tY,Fn,hlK,WE,Uu,lM,uxc"}},
 HV:{
-"^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
-bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
+"^":"a;OR<,G1>,Mw,Fl<,O0,kc>,I4<",
+bu:function(a){return"["+this.OR.oc+"] "+this.Mw+": "+this.G1},
 $isHV:true,
-static:{"^":"xO"}}}],["","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
+static:{"^":"Y1"}}}],["","main.dart",,F,{
 "^":"",
-E2:[function(){N.Jx("").sOR(C.IF)
-N.Jx("").gSZ().yI(new F.em())
-N.Jx("").To("Starting Observatory")
-var z=H.VM(new P.Zf(P.Dt(null)),[null])
-N.Jx("").To("Loading Google Charts API")
-J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],null,null))])
-z.MM.ml(G.vN()).ml(new F.Lb())},"$0","qg",0,0,null],
-em:{
-"^":"Tp:466;",
+V3:[function(){N.QM("").sOR(C.IF)
+N.QM("").gSZ().yI(new F.T7())
+N.QM("").To("Starting Observatory")
+$.mC().MM.ml(new F.R0())},"$0","wV",0,0,42],
+T7:{
+"^":"Xs:115;",
 $1:[function(a){var z
-if(J.de(a.gOR(),C.nT)){z=J.RE(a)
-if(J.co(z.gG1(a),"Error evaluating expression"))z=J.kE(z.gG1(a),"Can't assign to null: ")===!0||J.kE(z.gG1(a),"Expression is not assignable: ")===!0
+if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
+if(J.co(z.gG1(a),"Error evaluating expression"))z=J.x5(z.gG1(a),"Can't assign to null: ")===!0||J.x5(z.gG1(a),"Expression is not assignable: ")===!0
 else z=!1}else z=!1
 if(z)return
-P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,465,[],"call"],
+P.FL(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,114,"call"],
 $isEH:true},
-Lb:{
-"^":"Tp:116;",
-$1:[function(a){N.Jx("").To("Initializing Polymer")
-A.Ok()},"$1",null,2,0,null,117,[],"call"],
-$isEH:true}}],["metadata","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
+R0:{
+"^":"Xs:10;",
+$1:[function(a){var z,y
+N.QM("").To("Loading Google Charts API")
+z=J.UQ($.ca(),"google")
+y=$.Xr()
+z.K9("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",P.mt(y.gv6(y))],null,null))])
+return $.Xr().MM.ml(G.vN()).ml(new F.zp())},"$1",null,2,0,null,11,"call"],
+$isEH:true},
+zp:{
+"^":"Xs:10;",
+$1:[function(a){N.QM("").To("Polymer Ready.")},"$1",null,2,0,null,11,"call"],
+$isEH:true}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
-jh:{
-"^":"a;T9,Ym",
-static:{"^":"LB,ziq,pjg,nq,xa"}},
-tzK:{
-"^":"a;"},
-bW:{
-"^":"a;oc>"},
-PO:{
-"^":"a;"},
-oBi:{
-"^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
-"^":"",
-F1:{
-"^":["V19;Mz%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gqW:[function(a){return a.Mz},null,null,1,0,307,"pad",308,311],
-sqW:[function(a,b){a.Mz=this.ct(a,C.ZU,a.Mz,b)},null,null,3,0,310,30,[],"pad",308],
-"@":function(){return[C.nW]},
-static:{aD:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.Mz=!0
-a.SO=z
-a.B7=y
-a.X0=w
+md:{
+"^":"V21;i4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+giC:function(a){return a.i4},
+siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
+static:{aD:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.i4=!0
+a.on=z
+a.BA=y
+a.LL=w
 C.kD.ZL(a)
-C.kD.oX(a)
-return a},null,null,0,0,115,"new NavBarElement$created"]}},
-"+NavBarElement":[467],
-V19:{
-"^":"uL+Pi;",
-$isd3:true},
-aQ:{
-"^":["V20;KU%-305,V4%-305,Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,312,"link",308,311],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",308],
-gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",308,311],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",308],
-grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
-"@":function(){return[C.u7]},
-static:{AJ:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.KU="#"
-a.V4="---"
-a.Jo=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.SU.ZL(a)
-C.SU.oX(a)
-return a},null,null,0,0,115,"new NavMenuElement$created"]}},
-"+NavMenuElement":[468],
-V20:{
-"^":"uL+Pi;",
-$isd3:true},
-Qa:{
-"^":["V21;KU%-305,V4%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,312,"link",308,311],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",308],
-gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",308,311],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",308],
-"@":function(){return[C.qT]},
-static:{JR:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.KU="#"
-a.V4="---"
-a.SO=z
-a.B7=y
-a.X0=w
-C.nn.ZL(a)
-C.nn.oX(a)
-return a},null,null,0,0,115,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[469],
+C.kD.XI(a)
+return a}}},
 V21:{
 "^":"uL+Pi;",
 $isd3:true},
-Ww:{
-"^":["V22;rU%-85,SB%-304,Hq%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFR:[function(a){return a.rU},null,null,1,0,115,"callback",308,311],
-Ki:function(a){return this.gFR(a).$0()},
-LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,116,30,[],"callback",308],
-gxw:[function(a){return a.SB},null,null,1,0,307,"active",308,311],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,310,30,[],"active",308],
-gph:[function(a){return a.Hq},null,null,1,0,312,"label",308,311],
-sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,32,30,[],"label",308],
-Ty:[function(a,b,c,d){var z=a.SB
-if(z===!0)return
-a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,350,21,[],351,[],82,[],"buttonClick"],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,126,"refreshDone"],
-"@":function(){return[C.XG]},
-static:{zN:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SB=!1
-a.Hq="Refresh"
-a.SO=z
-a.B7=y
-a.X0=w
-C.J7.ZL(a)
-C.J7.oX(a)
-return a},null,null,0,0,115,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[470],
+Bm:{
+"^":"V22;KU,V4,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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)},
+grZ:function(a){return a.Jo},
+srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
+static:{AJ:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.KU="#"
+a.V4="---"
+a.Jo=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.SU.ZL(a)
+C.SU.XI(a)
+return a}}},
 V22:{
 "^":"uL+Pi;",
 $isd3:true},
-tz:{
-"^":["V23;Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
-"@":function(){return[C.NT]},
-static:{J8:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.Jo=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.lx.ZL(a)
-C.lx.oX(a)
-return a},null,null,0,0,115,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[471],
+Ya:{
+"^":"V23;KU,V4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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:{JR:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.KU="#"
+a.V4="---"
+a.on=z
+a.BA=y
+a.LL=w
+C.nn.ZL(a)
+C.nn.XI(a)
+return a}}},
 V23:{
 "^":"uL+Pi;",
 $isd3:true},
-flR:{
-"^":["V24;Jo%-304,iy%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
-gF1:[function(a){return a.iy},null,null,1,0,318,"isolate",308,311],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,319,30,[],"isolate",308],
-vD:[function(a,b){this.ct(a,C.Ia,0,1)},"$1","gQ1",2,0,169,242,[],"isolateChanged"],
-gu6:[function(a){var z=a.iy
-if(z!=null)return z.gHP()
-else return""},null,null,1,0,312,"hashLinkWorkaround",308],
-su6:[function(a,b){},null,null,3,0,116,28,[],"hashLinkWorkaround",308],
-"@":function(){return[C.zaS]},
-static:{Du:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.Jo=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.RR.ZL(a)
-C.RR.oX(a)
-return a},null,null,0,0,115,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[472],
+Ww:{
+"^":"V24;rU,cj,z2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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.cj},
+sjl:function(a,b){a.cj=this.ct(a,C.aP,a.cj,b)},
+gph:function(a){return a.z2},
+sph:function(a,b){a.z2=this.ct(a,C.hf,a.z2,b)},
+Ty:[function(a,b,c,d){var z=a.cj
+if(z===!0)return
+a.cj=this.ct(a,C.aP,z,!0)
+if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gzY",6,0,70,1,71,72],
+rT:[function(a){a.cj=this.ct(a,C.aP,a.cj,!1)},"$0","gCB",0,0,15],
+static:{ZC:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.cj=!1
+a.z2="Refresh"
+a.on=z
+a.BA=y
+a.LL=w
+C.J7.ZL(a)
+C.J7.XI(a)
+return a}}},
 V24:{
 "^":"uL+Pi;",
 $isd3:true},
-oM:{
-"^":["V25;Ap%-461,Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.Ap},null,null,1,0,462,"library",308,311],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,463,30,[],"library",308],
-grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
-"@":function(){return[C.KI]},
-static:{PQ:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+G1:{
+"^":"V25;Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+grZ:function(a){return a.Jo},
+srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
+static:{J8:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.ct.ZL(a)
-C.ct.oX(a)
-return a},null,null,0,0,115,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[473],
+a.on=z
+a.BA=y
+a.LL=w
+C.lx.ZL(a)
+C.lx.XI(a)
+return a}}},
 V25:{
 "^":"uL+Pi;",
 $isd3:true},
-iL:{
-"^":["V26;Au%-336,Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Au},null,null,1,0,337,"cls",308,311],
-sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,338,30,[],"cls",308],
-grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
-"@":function(){return[C.qJ]},
-static:{lT:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+fl:{
+"^":"V26;Jo,iy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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)},
+Wt:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","gQ1",2,0,17,35],
+gu6:function(a){var z=a.iy
+if(z!=null)return z.gHP()
+else return""},
+su6:function(a,b){},
+static:{Du:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Jo=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.ae.ZL(a)
-C.ae.oX(a)
-return a},null,null,0,0,115,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[474],
+a.on=z
+a.BA=y
+a.LL=w
+C.cF.ZL(a)
+C.cF.XI(a)
+return a}}},
 V26:{
 "^":"uL+Pi;",
+$isd3:true},
+UK:{
+"^":"V27;VW,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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:{JT:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Jo=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.ct.ZL(a)
+C.ct.XI(a)
+return a}}},
+V27:{
+"^":"uL+Pi;",
+$isd3:true},
+wM:{
+"^":"V28;Au,Jo,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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},
+srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
+static:{GO:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Jo=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.z5.ZL(a)
+C.z5.XI(a)
+return a}}},
+V28:{
+"^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
-F1i:{
-"^":["V27;k5%-304,Oe%-475,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzj:[function(a){return a.k5},null,null,1,0,307,"devtools",308,311],
-szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,310,30,[],"devtools",308],
-guw:[function(a){return a.Oe},null,null,1,0,476,"app",308,309],
-suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,477,30,[],"app",308],
-ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+F1:{
+"^":"V29;qC,yT,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gzj:function(a){return a.qC},
+szj:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
+giJ:function(a){return a.yT},
+siJ:function(a,b){a.yT=this.ct(a,C.j2,a.yT,b)},
+q0:function(a){var z
+Z.uL.prototype.q0.call(this,a)
+if(a.qC===!0){z=new U.bl(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.PI()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.hq()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+a.yT=this.ct(a,C.j2,a.yT,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.SC()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.US()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,115,"created"],
-"@":function(){return[C.kR]},
-static:{fv:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.k5=!1
-a.SO=z
-a.B7=y
-a.X0=w
+a.yT=this.ct(a,C.j2,a.yT,z)}},
+static:{Lu:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.qC=!1
+a.on=z
+a.BA=y
+a.LL=w
 C.k0.ZL(a)
-C.k0.oX(a)
-C.k0.ZB(a)
-return a},null,null,0,0,115,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[478],
-V27:{
+C.k0.XI(a)
+return a}}},
+V29:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,126,"enteredView"],
-xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,126,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,479,12,[],242,[],243,[],"attributeChanged"],
-b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,480,123,[],"formatTimePrecise"],
-nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,480,123,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,480,28,[],"formatSeconds"],
-Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,121,124,[],"formatSize"],
-at:[function(a,b){var z,y,x
-z=J.U6(b)
-y=J.UQ(z.t(b,"script"),"user_name")
-x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","guT",2,0,481,482,[],"fileAndLine"],
-b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,483,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,483,11,[],"isError"],
+"^":"ir;AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+q0:function(a){A.dM.prototype.q0.call(this,a)},
+Nz:function(a){A.dM.prototype.Nz.call(this,a)},
+I9:function(a){A.dM.prototype.I9.call(this,a)},
+wN:function(a,b,c,d){A.dM.prototype.wN.call(this,a,b,c,d)},
+a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,116,117],
+Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,12,13],
+uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,118,119],
+i5:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,118,119],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,483,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,483,11,[],"isBool"],
-ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,483,11,[],"isString"],
-rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,483,11,[],"isInstance"],
-JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,483,11,[],"isDouble"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,118,119],
+Qr:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,118,119],
+ff:[function(a,b){return J.xC(b,"String")},"$1","gu7",2,0,118,119],
+fZ:[function(a,b){return J.xC(b,"Instance")},"$1","gNs",2,0,118,119],
+xx:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,118,119],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,483,11,[],"isList"],
-tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,483,11,[],"isType"],
-AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,483,11,[],"isUnexpected"],
-"@":function(){return[C.Br]},
-static:{Hx:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,118,119],
+tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,118,119],
+SG:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,118,119],
+static:{EE:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.Pf.ZL(a)
-C.Pf.oX(a)
-return a},null,null,0,0,115,"new ObservatoryElement$created"]}},
-"+ObservatoryElement":[484]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+C.Pf.XI(a)
+return a}}}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
+"^":"",
+Ap:{
+"^":"a;",
+sP:function(a,b){},
+$isAp:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
-gUj:function(a){var z=a.AP
-if(z==null){z=this.gqw(a)
-z=P.bK(this.gl1(a),z,!0,null)
+gqh:function(a){var z=a.AP
+if(z==null){z=this.gcm(a)
+z=P.bK(this.gym(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"$0","gqw",0,0,126],
-ni:[function(a){a.AP=null},"$0","gl1",0,0,126],
+k0:[function(a){},"$0","gcm",0,0,15],
+NB:[function(a){a.AP=null},"$0","gym",0,0,15],
 BN:[function(a){var z,y,x
 z=a.fn
 a.fn=null
@@ -11667,7 +10952,7 @@
 x=H.VM(new P.Yp(z),[T.yj])
 if(y.Gv>=4)H.vh(y.q7())
 y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,307],
+return!0}return!1},"$0","gDx",0,0,78],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
@@ -11683,230 +10968,176 @@
 "^":"a;",
 $isyj:true},
 qI:{
-"^":"yj;WA>,oc>,jL>,zZ>",
+"^":"yj;WA>,oc>,jL,zZ",
 bu:function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},
-$isqI:true}}],["observe.src.compound_path_observer","package:observe/src/compound_path_observer.dart",,Y,{
+$isqI:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
-J3:{
-"^":"Pi;b9,kK,Sv,rk,YX,B6,AP,fn",
-kb:function(a){return this.rk.$1(a)},
-gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,115,"value",308],
-wE:function(a){var z,y,x,w,v
-if(this.YX)return
-this.YX=!0
-z=this.geu()
-for(y=this.b9,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=this.kK;y.G();){w=J.xq(y.lo).w4(!1)
-v=w.Lj
-w.pN=v.cR(z)
-w.o7=P.VH(P.AY(),v)
-w.Bd=v.Al(P.v3())
-x.push(w)}this.Ow()},
-TF:[function(a){if(this.B6)return
-this.B6=!0
-P.rb(this.gMc())},"$1","geu",2,0,169,117,[]],
-Ow:[function(){var z,y
-this.B6=!1
-z=this.b9
-if(z.length===0)return
-y=H.VM(new H.A8(z,new Y.E5()),[null,null]).br(0)
-if(this.rk!=null)y=this.kb(y)
-this.Sv=F.Wi(this,C.ls,this.Sv,y)},"$0","gMc",0,0,126],
-cO:function(a){var z,y
-z=this.b9
-if(z.length===0)return
-if(this.YX)for(y=this.kK,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)y.lo.ed()
-C.Nm.sB(z,0)
-C.Nm.sB(this.kK,0)
-this.Sv=null},
-k0:[function(a){return this.wE(0)},"$0","gqw",0,0,115],
-ni:[function(a){return this.cO(0)},"$0","gl1",0,0,115],
-$isJ3:true},
-E5:{
-"^":"Tp:116;",
-$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,99,[],"call"],
-$isEH:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
-"^":"",
-Y3:[function(){var z,y,x,w,v,u,t,s,r,q
-if($.Td)return
-if($.tW==null)return
-$.Td=!0
+N0:function(){var z,y,x,w,v,u,t,s,r,q
+if($.AM)return
+if($.Oo==null)return
+$.AM=!0
 z=0
 y=null
 do{++z
 if(z===1000)y=[]
-x=$.tW
+x=$.Oo
 w=[]
 w.$builtinTypeInfo=[F.d3]
-$.tW=w
+$.Oo=w
 for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
-s=J.RE(t)
-if(s.gnz(t)){if(s.BN(t)){if(w)y.push([u,t])
-v=!0}$.tW.push(t)}}}while(z<1000&&v)
-if(w&&v){w=$.iU()
+s=t.R9
+s=s.iE!==s
+if(s){if(t.BN(0)){if(w)y.push([u,t])
+v=!0}$.Oo.push(t)}}}while(z<1000&&v)
+if(w&&v){w=$.OD()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
 for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
 q=J.U6(r)
-w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.el=$.tW.length
-$.Td=!1},"$0","D6",0,0,null],
-Ht:[function(){var z={}
-z.a=!1
-z=new O.o5(z)
-return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"$0","Zq",0,0,null],
-o5:{
-"^":"Tp:485;a",
-$2:[function(a,b){var z=this.a
-if(z.a)return
-z.a=!0
-a.RK(b,new O.b5(z))},"$2",null,4,0,null,181,[],166,[],"call"],
-$isEH:true},
-b5:{
-"^":"Tp:115;a",
-$0:[function(){this.a.a=!1
-O.Y3()},"$0",null,0,0,null,"call"],
-$isEH:true},
-zI:{
-"^":"Tp:182;b",
-$4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
-$isEH:true},
-Zb:{
-"^":"Tp:115;c,d,e,f",
-$0:[function(){this.c.$2(this.d,this.e)
-return this.f.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-id:{
-"^":"Tp:486;UI",
-$4:[function(a,b,c,d){if(d==null)return d
-return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
-$isEH:true},
-iV:{
-"^":"Tp:116;bK,Gq,Rm,w3",
-$1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,28,[],"call"],
-$isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
+w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.ax=$.Oo.length
+$.AM=!1}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
-f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-z=J.WB(J.xH(f,e),1)
-y=J.WB(J.xH(c,b),1)
-if(typeof z!=="number")return H.s(z)
+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
+y=J.ew(J.Hn(c,b),1)
 x=Array(z)
 for(w=x.length,v=0;v<z;++v){if(typeof y!=="number")return H.s(y)
 u=Array(y)
-u.fixed$length=init
 if(v>=w)return H.e(x,v)
 x[v]=u
-if(0<0||0>=u.length)return H.e(u,0)
+if(0>=u.length)return H.e(u,0)
 u[0]=v}if(typeof y!=="number")return H.s(y)
 t=0
 for(;t<y;++t){if(0>=w)return H.e(x,0)
-J.kW(x[0],t,t)}for(u=J.U6(d),s=J.Qc(b),r=J.U6(a),v=1;v<z;++v)for(q=v-1,p=e+v-1,t=1;t<y;++t){o=J.de(u.t(d,p),r.t(a,J.xH(s.g(b,t),1)))
-n=t-1
-m=x[q]
-if(o){if(v>=w)return H.e(x,v)
+u=x[0]
+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]
-if(q>=w)return H.e(x,q)
-J.kW(o,t,J.UQ(m,n))}else{if(q>=w)return H.e(x,q)
-l=J.WB(J.UQ(m,t),1)
+n=x[r]
+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(t>=n.length)return H.e(n,t)
+p=n[t]
+if(typeof p!=="number")return p.g()
 if(v>=w)return H.e(x,v)
-k=J.WB(J.UQ(x[v],n),1)
-J.kW(x[v],t,P.J(l,k))}}return x},"$6","cL",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
-Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p
+n=o.length
+if(m>=n)return H.e(o,m)
+m=o[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},
+kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
 if(0>=z)return H.e(a,0)
-x=J.xH(J.q8(a[0]),1)
+x=a[0].length-1
 if(y<0)return H.e(a,y)
-w=J.UQ(a[y],x)
-v=[]
-while(!0){if(!(y>0||J.z8(x,0)))break
-c$0:{if(y===0){v.push(2)
-x=J.xH(x,1)
-break c$0}u=J.x(x)
-if(u.n(x,0)){v.push(3);--y
-break c$0}t=y-1
-if(t<0)return H.e(a,t)
-s=J.UQ(a[t],u.W(x,1))
-r=J.UQ(a[t],x)
+w=a[y]
+if(x<0||x>=w.length)return H.e(w,x)
+v=w[x]
+u=[]
+while(!0){if(!(y>0||x>0))break
+c$0:{if(y===0){u.push(2);--x
+break c$0}if(x===0){u.push(3);--y
+break c$0}w=y-1
+if(w<0)return H.e(a,w)
+t=a[w]
+s=x-1
+r=t.length
+if(s<0||s>=r)return H.e(t,s)
+q=t[s]
+if(x<0||x>=r)return H.e(t,x)
+p=t[x]
 if(y<0)return H.e(a,y)
-q=J.UQ(a[y],u.W(x,1))
-p=P.J(P.J(r,q),s)
-if(p===s){if(J.de(s,w))v.push(0)
-else{v.push(1)
-w=s}x=u.W(x,1)
-y=t}else if(p===r){v.push(3)
-w=r
-y=t}else{v.push(2)
-x=u.W(x,1)
-w=q}}}return H.VM(new H.iK(v),[null]).br(0)},"$1","fZ",2,0,null,260,[]],
-rB:[function(a,b,c){var z,y,x
-for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},"$3","QI",6,0,null,261,[],262,[],263,[]],
-xU:[function(a,b,c){var z,y,x,w,v,u
+t=a[y]
+if(s>=t.length)return H.e(t,s)
+o=t[s]
+n=P.J(P.J(p,o),q)
+if(n===q){if(q==null?v==null:q===v)u.push(0)
+else{u.push(1)
+v=q}x=s
+y=w}else if(n===p){u.push(3)
+v=p
+y=w}else{u.push(2)
+v=o
+x=s}}}return H.VM(new H.iK(u),[null]).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)
+if(!J.xC(x,b[y]))return y}return c},
+xU:function(a,b,c){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
-x=J.U6(b)
-w=x.gB(b)
-v=0
-while(!0){if(v<c){y=J.xH(y,1)
-u=z.t(a,y)
-w=J.xH(w,1)
-u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},"$3","M9",6,0,null,261,[],262,[],263,[]],
-jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+x=b.length
+w=0
+while(!0){if(w<c){--y
+v=z.t(a,y);--x
+if(x<0||x>=b.length)return H.e(b,x)
+v=J.xC(v,b[x])}else v=!1
+if(!v)break;++w}return w},
+jj:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=J.Wx(c)
-y=J.Wx(f)
-x=P.J(z.W(c,b),y.W(f,e))
-w=J.x(b)
-v=w.n(b,0)&&e===0?G.rB(a,d,x):0
-u=z.n(c,J.q8(a))&&y.n(f,J.q8(d))?G.xU(a,d,x-v):0
-b=w.g(b,v)
-e+=v
-c=z.W(c,u)
-f=y.W(f,u)
+y=P.J(z.W(c,b),f-e)
+x=J.x(b)
+w=x.n(b,0)&&e===0?G.rN(a,d,y):0
+v=z.n(c,J.q8(a))&&f===d.length?G.xU(a,d,y-w):0
+b=x.g(b,w)
+e+=w
+c=z.W(c,v)
+f-=v
 z=J.Wx(c)
-if(J.de(z.W(c,b),0)&&J.de(J.xH(f,e),0))return C.xD
-if(J.de(b,c)){t=[]
-z=new P.Yp(t)
+if(J.xC(z.W(c,b),0)&&f-e===0)return C.xD
+if(J.xC(b,c)){u=[]
+z=new P.Yp(u)
 z.$builtinTypeInfo=[null]
-s=new G.DA(a,z,t,b,0)
-if(typeof f!=="number")return H.s(f)
-z=J.U6(d)
-for(;e<f;e=r){r=e+1
-J.wT(s.Il,z.t(d,e))}return[s]}else if(e===f){z=z.W(c,b)
-t=[]
-y=new P.Yp(t)
-y.$builtinTypeInfo=[null]
-return[new G.DA(a,y,t,b,z)]}q=G.Mw(G.f6(a,b,c,d,e,f))
-p=[]
-p.$builtinTypeInfo=[G.DA]
-for(z=J.U6(d),o=e,n=b,s=null,m=0;m<q.length;++m)switch(q[m]){case 0:if(s!=null){p.push(s)
-s=null}n=J.WB(n,1);++o
+t=new G.DA(a,z,u,b,0)
+for(;e<f;e=s){z=t.Il
+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))
+q=[]
+q.$builtinTypeInfo=[G.DA]
+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.ew(o,1);++p
 break
-case 1:if(s==null){t=[]
-y=new P.Yp(t)
-y.$builtinTypeInfo=[null]
-s=new G.DA(a,y,t,n,0)}s.dM=J.WB(s.dM,1)
-n=J.WB(n,1)
-J.wT(s.Il,z.t(d,o));++o
+case 1:if(t==null){u=[]
+z=new P.Yp(u)
+z.$builtinTypeInfo=[null]
+t=new G.DA(a,z,u,o,0)}t.dM=J.ew(t.dM,1)
+o=J.ew(o,1)
+z=t.Il
+if(p>>>0!==p||p>=d.length)return H.e(d,p)
+J.bi(z,d[p]);++p
 break
-case 2:if(s==null){t=[]
-y=new P.Yp(t)
-y.$builtinTypeInfo=[null]
-s=new G.DA(a,y,t,n,0)}s.dM=J.WB(s.dM,1)
-n=J.WB(n,1)
+case 2:if(t==null){u=[]
+z=new P.Yp(u)
+z.$builtinTypeInfo=[null]
+t=new G.DA(a,z,u,o,0)}t.dM=J.ew(t.dM,1)
+o=J.ew(o,1)
 break
-case 3:if(s==null){t=[]
-y=new P.Yp(t)
-y.$builtinTypeInfo=[null]
-s=new G.DA(a,y,t,n,0)}J.wT(s.Il,z.t(d,o));++o
-break}if(s!=null)p.push(s)
-return p},"$6","mu",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
-m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+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.Il
+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)
+return q},
+m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=J.RE(b)
 y=z.gWA(b)
 z=z.gvH(b)
-x=J.qA(b.gIl())
+x=J.Nd(b.gIl())
 w=b.gNg()
 if(w==null)w=0
 v=new P.Yp(x)
@@ -11914,68 +11145,63 @@
 u=new G.DA(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.sjr(J.WB(q.gjr(),s))
+q.jr=J.ew(q.jr,s)
 if(t)continue
 z=u.jr
-y=J.WB(z,J.q8(u.ok.G4))
-x=J.RE(q)
-v=x.gvH(q)
-p=P.J(y,J.WB(x.gvH(q),q.gNg()))-P.y(z,v)
-if(p>=0){C.Nm.KI(a,r);--r
-z=J.xH(q.gNg(),J.q8(q.gRt().G4))
+y=J.ew(z,u.Uj.G4.length)
+x=q.jr
+p=P.J(y,J.ew(x,q.dM))-P.y(z,x)
+if(p>=0){C.Nm.W4(a,r);--r
+z=J.Hn(q.dM,q.Uj.G4.length)
 if(typeof z!=="number")return H.s(z)
 s-=z
-u.dM=J.WB(u.dM,J.xH(q.gNg(),p))
-o=J.xH(J.WB(J.q8(u.ok.G4),J.q8(q.gRt().G4)),p)
-if(J.de(u.dM,0)&&J.de(o,0))t=!0
-else{n=q.gIl()
-if(J.u6(u.jr,x.gvH(q))){z=u.ok
-z=z.Mu(z,0,J.xH(x.gvH(q),u.jr))
-n.toString
-if(typeof n!=="object"||n===null||!!n.fixed$length)H.vh(P.f("insertAll"))
-H.IC(n,0,z)}if(J.z8(J.WB(u.jr,J.q8(u.ok.G4)),J.WB(x.gvH(q),q.gNg()))){z=u.ok
-J.bj(n,z.Mu(z,J.xH(J.WB(x.gvH(q),q.gNg()),u.jr),J.q8(u.ok.G4)))}u.Il=n
-u.ok=q.gok()
-if(J.u6(x.gvH(q),u.jr))u.jr=x.gvH(q)
-t=!1}}else if(J.u6(u.jr,x.gvH(q))){C.Nm.xe(a,r,u);++r
-m=J.xH(u.dM,J.q8(u.ok.G4))
-q.sjr(J.WB(q.gjr(),m))
-if(typeof m!=="number")return H.s(m)
-s+=m
-t=!0}else t=!1}if(!t)a.push(u)},"$2","pE",4,0,null,264,[],29,[]],
-xl:[function(a,b){var z,y
+z=J.ew(u.dM,J.Hn(q.dM,p))
+u.dM=z
+y=u.Uj.G4.length
+x=q.Uj.G4.length
+if(J.xC(z,0)&&y+x-p===0)t=!0
+else{o=q.Il
+if(J.u6(u.jr,q.jr)){z=u.Uj
+z=z.Mu(z,0,J.Hn(q.jr,u.jr))
+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.ew(u.jr,u.Uj.G4.length),J.ew(q.jr,q.dM))){z=u.Uj
+J.bj(o,z.Mu(z,J.Hn(J.ew(q.jr,q.dM),u.jr),u.Uj.G4.length))}u.Il=o
+u.Uj=q.Uj
+if(J.u6(q.jr,u.jr))u.jr=q.jr
+t=!1}}else if(J.u6(u.jr,q.jr)){C.Nm.aP(a,r,u);++r
+n=J.Hn(u.dM,u.Uj.G4.length)
+q.jr=J.ew(q.jr,n)
+if(typeof n!=="number")return H.s(n)
+s+=n
+t=!0}else t=!1}if(!t)a.push(u)},
+xl:function(a,b){var z,y
 z=H.VM([],[G.DA])
 for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"$2","l0",4,0,null,76,[],265,[]],
-u2:[function(a,b){var z,y,x,w,v,u
-if(b.length===1)return b
+return z},
+Qi:function(a,b){var z,y,x,w,v,u
+if(b.length<=1)return b
 z=[]
-for(y=G.xl(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=a.ao;y.G();){w=y.lo
-if(J.de(w.gNg(),1)&&J.de(J.q8(w.gRt().G4),1)){v=J.i4(w.gRt().G4,0)
+for(y=G.xl(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=a.Xk;y.G();){w=y.lo
+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]
 u=J.zj(w)
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
-if(!J.de(v,x[u]))z.push(w)
+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.gIl(),0,J.q8(w.gRt().G4)))}return z},"$2","W5",4,0,null,76,[],265,[]],
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.ew(v.gvH(w),w.gNg()),w.gIl(),0,w.gRt().G4.length))}return z},
 DA:{
-"^":"a;WA>,ok<,Il<,jr@,dM",
+"^":"a;WA>,Uj,Il<,jr,dM",
 gvH:function(a){return this.jr},
-gRt:function(){return this.ok},
+gRt:function(){return this.Uj},
 gNg:function(){return this.dM},
-ck:function(a){var z=this.jr
-if(typeof z!=="number")return H.s(z)
-z=a<z
-if(z)return!1
-if(!J.de(this.dM,J.q8(this.ok.G4)))return!0
-z=J.WB(this.jr,this.dM)
-if(typeof z!=="number")return H.s(z)
-return a<z},
 bu:function(a){var z,y
 z="#<ListChangeRecord index: "+H.d(this.jr)+", removed: "
-y=this.ok
+y=this.Uj
 return z+y.bu(y)+", addedCount: "+H.d(this.dM)+">"},
 $isDA:true,
-static:{XM:function(a,b,c,d){var z
+static:{K6:function(a,b,c,d){var z
 if(d==null)d=[]
 if(c==null)c=0
 z=new P.Yp(d)
@@ -11987,53 +11213,52 @@
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
-Wi:[function(a,b,c,d){var z=J.RE(a)
-if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},"$4","Ha",8,0,null,101,[],266,[],242,[],243,[]],
+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;",
 $isd3:true},
-lS:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z,y,x,w,v
+ic:{
+"^":"Xs:51;a,b",
+$2:function(a,b){var z,y,x,w,v
 z=this.b
-y=z.wv.rN(a).gAx()
-if(!J.de(b,y)){x=this.a
+y=$.cp().jD(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]))
-z.V2.u(0,a,y)}},"$2",null,4,0,null,12,[],242,[],"call"],
+z.V2.u(0,a,y)}},
 $isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
 "^":"",
-xh:{
-"^":"Pi;L1,AP,fn",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",308],
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},243,[],"value",308],
-bu:function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+Sk:{
+"^":"Pi;",
+gP:function(a){return this.u1},
+sP:function(a,b){this.u1=F.Wi(this,C.YI,this.u1,b)},
+bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.u1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
-"^":"er;b3,xg,ao,AP,fn",
-gvp:function(){var z=this.xg
-if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
-this.xg=z}z.toString
+"^":"uFU;ID@,IO,Xk,AP,fn",
+gRT:function(){var z=this.IO
+if(z==null){z=P.bK(new Q.cj(this),null,!0,null)
+this.IO=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.ao.length},null,null,1,0,487,"length",308],
-sB:[function(a,b){var z,y,x,w,v,u
-z=this.ao
+gB:function(a){return this.Xk.length},
+sB:function(a,b){var z,y,x,w,v
+z=this.Xk
 y=z.length
 if(y===b)return
 this.ct(this,C.Wn,y,b)
 x=y===0
-w=J.x(b)
-this.ct(this,C.ai,x,w.n(b,0))
-this.ct(this,C.nZ,!x,!w.n(b,0))
-x=this.xg
-if(x!=null){v=x.iE
-x=v==null?x!=null:v!==x}else x=!1
-if(x)if(w.C(b,y)){if(w.C(b,0)||w.D(b,z.length))H.vh(P.TE(b,0,z.length))
-if(typeof b!=="number")return H.s(b)
+w=b===0
+this.ct(this,C.ai,x,w)
+this.ct(this,C.nZ,!x,!w)
+x=this.IO
+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(y<b||y>z.length)H.vh(P.TE(y,b,z.length))
 x=new H.nH(z,b,y)
 x.$builtinTypeInfo=[null]
@@ -12043,67 +11268,63 @@
 x=x.br(0)
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,x,b,0))}else{x=w.W(b,y)
-u=[]
-w=new P.Yp(u)
-w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,363,30,[],"length",308],
-t:[function(a,b){var z=this.ao
+this.b4(new G.DA(this,w,x,b,0))}else{v=[]
+x=new P.Yp(v)
+x.$builtinTypeInfo=[null]
+this.b4(new G.DA(this,x,v,y,b-y))}C.Nm.sB(z,b)},
+t:function(a,b){var z=this.Xk
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[J.bU]}},this.$receiver,"wn")},15,[],"[]",308],
-u:[function(a,b,c){var z,y,x,w
-z=this.ao
+return z[b]},
+u:function(a,b,c){var z,y,x,w
+z=this.Xk
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 y=z[b]
-x=this.xg
+x=this.IO
 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)
-z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[J.bU,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",308],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,307,"isEmpty",308],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,307,"isNotEmpty",308],
+this.b4(new G.DA(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)},
 Mh:function(a,b,c){var z,y,x
 z=J.x(c)
-if(!z.$isList&&!z.$isz5)c=z.br(c)
+if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.xg
+z=this.IO
 if(z!=null){x=z.iE
 z=x==null?z!=null:x!==z}else z=!1
-if(z&&J.z8(y,0)){z=this.ao
-H.K0(z,b,y)
-this.iH(G.XM(this,b,y,H.q9(z,b,y,null).br(0)))}H.ed(this.ao,b,c)},
+if(z&&y>0){z=this.Xk
+H.xF(z,b,y)
+this.b4(G.K6(this,b,y,H.j5(z,b,y,null).br(0)))}H.xr(this.Xk,b,c)},
 h:function(a,b){var z,y,x,w
-z=this.ao
+z=this.Xk
 y=z.length
-this.nU(y,y+1)
-x=this.xg
+this.n9(y,y+1)
+x=this.IO
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
-if(x)this.iH(G.XM(this,y,1,null))
+if(x)this.b4(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.Xk
 y=z.length
 C.Nm.FV(z,b)
-this.nU(y,z.length)
+this.n9(y,z.length)
 x=z.length-y
-z=this.xg
+z=this.IO
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.iH(G.XM(this,y,x,null))},
-Rz:function(a,b){var z,y
-for(z=this.ao,y=0;y<z.length;++y)if(J.de(z[y],b)){this.UZ(0,y,y+1)
-return!0}return!1},
+if(z&&x>0)this.b4(G.K6(this,y,x,null))},
 UZ: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)))
-y=!(c<b)
-if(!y||c>this.ao.length)H.vh(P.TE(c,b,this.gB(this)))
+if(!z||b>this.Xk.length)H.vh(P.TE(b,0,this.gB(this)))
+y=c>=b
+if(!y||c>this.Xk.length)H.vh(P.TE(c,b,this.gB(this)))
 x=c-b
-w=this.ao
+w=this.Xk
 v=w.length
 u=v-x
 this.ct(this,C.Wn,v,u)
@@ -12111,7 +11332,7 @@
 u=u===0
 this.ct(this,C.ai,t,u)
 this.ct(this,C.nZ,!t,!u)
-u=this.xg
+u=this.IO
 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))
@@ -12124,118 +11345,137 @@
 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.b4(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
+UG:function(a,b,c){var z,y,x,w
+if(b<0||b>this.Xk.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
-if(!z.$isList&&!z.$isz5)c=z.br(c)
+if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.ao
+z=this.Xk
 x=z.length
-if(typeof y!=="number")return H.s(y)
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
-H.ed(z,b,c)
-this.nU(x,z.length)
-z=this.xg
+H.xr(z,b,c)
+this.n9(x,z.length)
+z=this.IO
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&y>0)this.iH(G.XM(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(z&&y>0)this.b4(G.K6(this,b,y,null))},
+aP:function(a,b,c){var z,y,x
+if(b>this.Xk.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.Xk
 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.nU(y-1,y)
-y=this.xg
+this.n9(y-1,y)
+y=this.IO
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
-if(y)this.iH(G.XM(this,b,1,null))
+if(y)this.b4(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.xg
+b4:function(a){var z,y
+z=this.IO
 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)},
-nU:function(a,b){var z,y
+if(this.ID==null){this.ID=[]
+P.rb(this.gL6())}this.ID.push(a)},
+n9:function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
-y=J.x(b)
-this.ct(this,C.ai,z,y.n(b,0))
-this.ct(this,C.nZ,!z,!y.n(b,0))},
+y=b===0
+this.ct(this,C.ai,z,y)
+this.ct(this,C.nZ,!z,!y)},
 Lu:[function(){var z,y,x
-z=this.b3
+z=this.ID
 if(z==null)return!1
-y=G.u2(this,z)
-this.b3=null
-z=this.xg
+y=G.Qi(this,z)
+this.ID=null
+z=this.IO
 if(z!=null){x=z.iE
 x=x==null?z!=null:x!==z}else x=!1
-if(x){x=H.VM(new P.Yp(y),[G.DA])
+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,307],
+return!0}return!1},"$0","gL6",0,0,78],
 $iswn:true,
-static:{uX:function(a,b){var z=H.VM([],[b])
-return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
-er:{
-"^":"ar+Pi;",
+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
+if(a===b)throw H.b(P.u("can't use same list for previous and current"))
+for(z=J.mY(c),y=J.w1(b);z.G();){x=z.gl()
+w=J.RE(x)
+v=J.ew(w.gvH(x),x.gNg())
+u=J.ew(w.gvH(x),x.gRt().G4.length)
+t=y.Mu(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))
+r=J.Wx(u)
+if(r.C(u,w)||r.D(u,a.length))H.vh(P.TE(u,w,a.length))
+q=r.W(u,w)
+p=t.gB(t)
+r=J.Wx(q)
+if(r.F(q,p)){o=r.W(q,p)
+n=s.g(w,p)
+s=a.length
+if(typeof o!=="number")return H.s(o)
+m=s-o
+H.qG(a,w,n,t,0)
+if(o!==0){H.qG(a,n,m,a,u)
+C.Nm.sB(a,m)}}else{o=J.Hn(p,q)
+r=a.length
+if(typeof o!=="number")return H.s(o)
+l=r+o
+n=s.g(w,p)
+C.Nm.sB(a,l)
+H.qG(a,n,l,a,u)
+H.qG(a,w,n,t,0)}}}}},
+uFU:{
+"^":"rm+Pi;",
 $isd3:true},
-Bj:{
-"^":"Tp:115;a",
-$0:[function(){this.a.xg=null},"$0",null,0,0,null,"call"],
+cj:{
+"^":"Xs:42;a",
+$0:function(){this.a.IO=null},
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
-HA:{
-"^":"yj;G3>,jL>,zZ>,JD,dr",
+ya:{
+"^":"yj;G3>,jL,zZ,aC,w5",
 bu:function(a){var z
-if(this.JD)z="insert"
-else z=this.dr?"remove":"set"
+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)+">"},
-$isHA:true},
+$isya:true},
 qC:{
 "^":"Pi;Zp,AP,fn",
-gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",308],
-gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",308],
-gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,487,"length",308],
-gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,307,"isEmpty",308],
-gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,307,"isNotEmpty",308],
-di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,488,30,[],"containsValue",308],
-x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,488,49,[],"containsKey",308],
-t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},49,[],"[]",308],
-u:[function(a,b,c){var z,y,x,w,v
-z=this.Zp
-y=z.gB(z)
-x=z.t(0,b)
+gvc:function(){return this.Zp.gvc()},
+gUQ:function(a){var z=this.Zp
+return z.gUQ(z)},
+gB:function(a){var z=this.Zp
+return z.gB(z)},
+gl0:function(a){var z=this.Zp
+return z.gB(z)===0},
+gor:function(a){var z=this.Zp
+return z.gB(z)!==0},
+t:function(a,b){return this.Zp.t(0,b)},
+u:function(a,b,c){var z,y,x,w
+z=this.AP
+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
+x=z.gB(z)
+w=z.t(0,b)
 z.u(0,b,c)
-w=this.AP
-if(w!=null){v=w.iE
-w=v==null?w!=null:v!==w}else w=!1
-if(w){z=z.gB(z)
-if(y!==z){F.Wi(this,C.Wn,y,z)
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"un",void:true,args:[a,b]}},this.$receiver,"qC")},49,[],30,[],"[]=",308],
+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.nq(this,H.VM(new T.qI(this,C.Yn,null,null),[null]))}},
 FV:function(a,b){J.kH(b,new V.zT(this))},
-Rz:function(a,b){var z,y,x,w,v
-z=this.Zp
-y=z.gB(z)
-x=z.Rz(0,b)
-w=this.AP
-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.HA(b,x,null,!1,!0),[null,null]))
-F.Wi(this,C.Wn,y,z.gB(z))}return x},
 V1:function(a){var z,y,x,w
 z=this.Zp
 y=z.gB(z)
@@ -12243,2023 +11483,2076 @@
 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)}z.V1(0)},
+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)},
+G8:function(){this.nq(this,H.VM(new T.qI(this,C.Yy,null,null),[null]))
+this.nq(this,H.VM(new T.qI(this,C.Yn,null,null),[null]))},
 $isqC:true,
 $isZ0:true,
-static:{WF:function(a,b,c){var z=V.Bq(a,b,c)
-z.FV(0,a)
-return z},Bq:function(a,b,c){var z,y
-z=J.x(a)
-if(!!z.$isNb)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
-else y=!!z.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.Py(null,null,null,b,c),null,null),[b,c])
-return y}}},
+static:{AB:function(a,b,c){var z
+if(!!a.$isBa)z=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
+else z=!!a.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.YM(null,null,null,b,c),null,null),[b,c])
+return z}}},
 zT:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Xs;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,52,18,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
+$signature:function(){return H.IG(function(a,b){return{func:"H7",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"$2",null,4,0,null,49,[],30,[],"call"],
-$isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
+"^":"Xs:51;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,{
 "^":"",
-Wa:[function(a,b){var z=J.x(a)
-if(!!z.$isqI)return J.de(a.oc,b)
-if(!!z.$isHA){z=J.x(b)
-if(!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},"$2","Uv",4,0,null,29,[],49,[]],
-yf:[function(a,b){var z,y,x,w
+cc:{
+"^":"Ap;fq,Pc,WS,Vq,qU",
+QI:function(a){return this.Pc.$1(a)},
+EO:function(a){return this.Vq.$1(a)},
+TR:function(a,b){var z
+this.Vq=b
+z=this.QI(J.mu(this.fq,this.gv7()))
+this.qU=z
+return z},
+jA:[function(a){var z=this.QI(a)
+if(J.xC(z,this.qU))return
+this.qU=z
+return this.EO(z)},"$1","gv7",2,0,10,36],
+xO:function(a){var z=this.fq
+if(z!=null)J.yd(z)
+this.fq=null
+this.Pc=null
+this.WS=null
+this.Vq=null
+this.qU=null},
+gP:function(a){var z=this.QI(J.Vm(this.fq))
+this.qU=z
+return z},
+sP:function(a,b){J.Fc(this.fq,b)}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
+"^":"",
+yf:function(a,b){var z,y,x,w,v
 if(a==null)return
-x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
-y=H.jO(J.bB(z.gAx()).LU)
-try{if(L.TH(y,b)){x=z.rN(b).gAx()
-return x}if(L.M6(y,C.fz)){x=J.UQ(a,J.GL(b))
-return x}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
-if(x.Im(C.Ek))x.x9("can't get "+H.d(b)+" in "+H.d(a))
-return},"$2","MT",4,0,null,6,[],74,[]],
-ir:[function(a,b,c){var z,y,x,w
+z=b
+if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$isIN){z=a
+y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
+if(!y){z=a
+y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
+z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
+if(z)return J.UQ(a,$.b7().eB.t(0,b))
+try{z=a
+y=b
+x=$.cp().Gu.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)).$ismp){z=J.bB(a)
+v=$.yQ().Qk(z,C.OV)
+if(!(v!=null&&v.fY===C.it&&!v.Fo))throw w}else throw w}}z=$.Ku()
+if(z.Im(C.Ab))z.x9("can't get "+H.d(b)+" in "+H.d(a))
+return},
+iu:function(a,b,c){var z,y,x
 if(a==null)return!1
-x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
-return!0}}else if(!!J.x(b).$iswv){z=H.vn(a)
-y=H.jO(J.bB(z.gAx()).LU)
-try{if(L.dR(y,b)){x=c
-z.tu(b,2,[x],C.CM)
-H.vn(x)
-return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
-return!0}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
-if(x.Im(C.Ek))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"$3","J6",6,0,null,6,[],74,[],30,[]],
-TH:[function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().nb
-if(z.x4(b))return!0
-if(z.x4(C.OV))return!0
-a=L.pY(a)}return!1},"$2","fY",4,0,null,11,[],12,[]],
-dR:[function(a,b){var z,y
-z=new H.GD(H.u1(H.d(b.gfN(b))+"="))
-for(;!J.de(a,$.aA());){y=a.gYK().nb
-if(!!J.x(y.t(0,b)).$isRY)return!0
-if(y.x4(z))return!0
-if(y.x4(C.OV))return!0
-a=L.pY(a)}return!1},"$2","we",4,0,null,11,[],12,[]],
-M6:[function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
-if(!!J.x(z).$isRS&&z.guU())return!0
-a=L.pY(a)}return!1},"$2","Wt",4,0,null,11,[],12,[]],
-pY:[function(a){var z,y
-try{z=a.gAY()
-return z}catch(y){H.Ru(y)
-return $.aA()}},"$1","WV",2,0,null,11,[]],
-cB:[function(a){a=J.JA(a,$.c3(),"")
+z=b
+if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
+return!0}}else if(!!J.x(b).$isIN){z=a
+y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
+if(!y){z=a
+y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
+z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
+if(z){J.kW(a,$.b7().eB.t(0,b),c)
+return!0}try{$.cp().Cq(a,b,c)
+return!0}catch(x){if(!!J.x(H.Ru(x)).$ismp){z=J.bB(a)
+if(!$.yQ().UK(z,C.OV))throw x}else throw x}}z=$.Ku()
+if(z.Im(C.Ab))z.x9("can't set "+H.d(b)+" in "+H.d(a))
+return!1},
+cB:function(a){a=J.rr(a)
 if(a==="")return!0
 if(0>=a.length)return H.e(a,0)
 if(a[0]===".")return!1
-return $.tN().zD(a)},"$1","wf",2,0,null,94,[]],
+return $.tN().zD(a)},
 WR:{
-"^":"Pi;ay,YB,BK,kN,cs,cT,AP,fn",
-E4:function(a){return this.cT.$1(a)},
-gWA:function(a){var z=this.kN
-if(0>=z.length)return H.e(z,0)
-return z[0]},
-gP:[function(a){var z,y
-if(!this.YB)return
-z=this.AP
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",308],
-sP:[function(a,b){var z,y,x,w
-z=this.BK
+"^":"AR;I3,pn,LG,jR,xX,jB,Hy",
+gEQ:function(){return this.I3==null},
+sP:function(a,b){var z=this.I3
+if(z!=null)z.rL(this.pn,b)},
+gX6:function(){return 2},
+TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
+BB:function(){this.LG=L.SE(this,this.pn)
+this.Oq(!0)},
+fV:function(){this.Hy=null
+this.I3=null
+this.pn=null},
+GA:function(a){this.I3.kJ(this.pn,a)},
+Oq:function(a){var z,y
+z=this.Hy
+y=this.I3.Tl(this.pn)
+this.Hy=y
+if(a||J.xC(y,z))return!1
+this.WP(this.Hy,z)
+return!0},
+Pz:function(){return this.Oq(!1)},
+$isAp:true},
+Tv:{
+"^":"a;Ih",
+gB:function(a){return this.Ih.length},
+gl0:function(a){return this.Ih.length===0},
+gPu:function(){return!0},
+bu:function(a){if(!this.gPu())return"<invalid path>"
+return H.VM(new H.lJ(this.Ih,new L.f7()),[null,null]).zV(0,".")},
+n:function(a,b){var z,y,x,w,v
+if(b==null)return!1
+if(this===b)return!0
+if(!J.x(b).$isTv)return!1
+if(this.gPu()!==b.gPu())return!1
+z=this.Ih
 y=z.length
-if(y===0)return
-x=this.AP
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-if(!x)this.Zy(y-1)
-x=this.kN
-w=y-1
-if(w<0||w>=x.length)return H.e(x,w)
-x=x[w]
-if(w>=z.length)return H.e(z,w)
-if(L.ir(x,z[w],b)){z=this.kN
-if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,489,243,[],"value",308],
-k0:[function(a){O.Pi.prototype.k0.call(this,this)
-this.ov()
-this.XI()},"$0","gqw",0,0,126],
-ni:[function(a){var z,y
-for(z=0;y=this.cs,z<y.length;++z){y=y[z]
-if(y!=null){y.ed()
-y=this.cs
-if(z>=y.length)return H.e(y,z)
-y[z]=null}}O.Pi.prototype.ni.call(this,this)},"$0","gl1",0,0,126],
-Zy:function(a){var z,y,x,w,v,u
-if(a==null)a=this.BK.length
-z=this.BK
+x=b.Ih
+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.Ih,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
+x=536870911&x+((524287&x)<<10>>>0)
+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
+if(!this.gPu())return
+for(z=this.Ih,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+if(a==null)return
+a=L.yf(a,y)}return a},
+rL:function(a,b){var z,y,x
+z=this.Ih
 y=z.length-1
-if(typeof a!=="number")return H.s(a)
-x=this.cT!=null
-w=0
-for(;w<a;){v=this.kN
-if(w>=v.length)return H.e(v,w)
-v=v[w]
-if(w>=z.length)return H.e(z,w)
-u=L.yf(v,z[w])
-if(w===y&&x)u=this.E4(u)
-v=this.kN;++w
-if(w>=v.length)return H.e(v,w)
-v[w]=u}},
-ov:function(){return this.Zy(null)},
-hd:function(a){var z,y,x,w,v,u,t,s,r
-for(z=this.BK,y=z.length-1,x=this.cT!=null,w=a,v=null,u=null;w<=y;w=s){t=this.kN
-s=w+1
-r=t.length
-if(s>=r)return H.e(t,s)
-v=t[s]
-if(w>=r)return H.e(t,w)
-t=t[w]
-if(w>=z.length)return H.e(z,w)
-u=L.yf(t,z[w])
-if(w===y&&x)u=this.E4(u)
-if(v==null?u==null:v===u){this.Rl(a,w)
-return}t=this.kN
-if(s>=t.length)return H.e(t,s)
-t[s]=u}this.ij(a)
-if(this.gnz(this)&&!J.de(v,u)){z=new T.qI(this,C.ls,v,u)
-z.$builtinTypeInfo=[null]
-this.nq(this,z)}},
-Rl:function(a,b){var z,y
-if(b==null)b=this.BK.length
-if(typeof b!=="number")return H.s(b)
-z=a
-for(;z<b;++z){y=this.cs
-if(z>=y.length)return H.e(y,z)
-y=y[z]
-if(y!=null)y.ed()
-this.Kh(z)}},
-XI:function(){return this.Rl(0,null)},
-ij:function(a){return this.Rl(a,null)},
-Kh:function(a){var z,y,x,w,v
-z=this.kN
-if(a>=z.length)return H.e(z,a)
-y=z[a]
-z=this.BK
-if(a>=z.length)return H.e(z,a)
-x=z[a]
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(y).$iswn){z=this.cs
-w=y.gvp().w4(!1)
-v=w.Lj
-w.pN=v.cR(new L.Px(this,a,x))
-w.o7=P.VH(P.AY(),v)
-w.Bd=v.Al(P.v3())
-if(a>=z.length)return H.e(z,a)
-z[a]=w}}else{z=J.x(y)
-if(!!z.$isd3){v=this.cs
-w=z.gUj(y).w4(!1)
-z=w.Lj
-w.pN=z.cR(new L.C4(this,a,x))
-w.o7=P.VH(P.AY(),z)
-w.Bd=z.Al(P.v3())
-if(a>=v.length)return H.e(v,a)
-v[a]=w}}},
-d4:function(a,b,c){var z,y,x,w
-if(this.YB)for(z=J.rr(b).split("."),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),y=this.BK;z.G();){x=z.lo
-if(J.de(x,""))continue
-w=H.BU(x,10,new L.qL())
-y.push(w!=null?w:new H.GD(H.u1(x)))}z=this.BK
-this.kN=H.VM(Array(z.length+1),[P.a])
-if(z.length===0&&c!=null)a=c.$1(a)
-y=this.kN
-if(0>=y.length)return H.e(y,0)
-y[0]=a
-this.cs=H.VM(Array(z.length),[P.MO])},
-$isWR:true,
-static:{Sk:function(a,b,c){var z=new L.WR(b,L.cB(b),H.VM([],[P.a]),null,null,c,null,null)
-z.d4(a,b,c)
-return z}}},
-qL:{
-"^":"Tp:116;",
-$1:[function(a){return},"$1",null,2,0,null,117,[],"call"],
+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.yf(a,z[x])}if(y>=z.length)return H.e(z,y)
+return L.iu(a,z[y],b)},
+kJ:function(a,b){var z,y,x,w
+if(!this.gPu()||this.Ih.length===0)return
+z=this.Ih
+y=z.length-1
+for(x=0;a!=null;x=w){b.$1(a)
+if(x>=y)break
+w=x+1
+if(x>=z.length)return H.e(z,x)
+a=L.yf(a,z[x])}},
+$isTv:true,
+static:{hk:function(a){var z,y,x,w,v,u,t,s
+if(!!J.x(a).$isWO){z=P.F(a,!1,null)
+y=new H.a7(z,z.length,0,null)
+y.$builtinTypeInfo=[H.Kp(z,0)]
+for(;y.G();){x=y.lo
+if((typeof x!=="number"||Math.floor(x)!==x)&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints and Symbols"))}return new L.Tv(z)}if(a==null)a=""
+w=$.fX().t(0,a)
+if(w!=null)return w
+if(!L.cB(a))return $.V6()
+v=[]
+y=J.rr(a).split(".")
+u=new H.a7(y,y.length,0,null)
+u.$builtinTypeInfo=[H.Kp(y,0)]
+for(;u.G();){x=u.lo
+if(J.xC(x,""))continue
+t=H.BU(x,10,new L.oq())
+v.push(t!=null?t:$.b7().d8.t(0,x))}w=new L.Tv(C.Nm.tt(v,!1))
+y=$.fX()
+if(y.X5>=100){y.toString
+u=new P.i5(y)
+u.$builtinTypeInfo=[H.Kp(y,0)]
+s=u.gA(u)
+if(!s.G())H.vh(H.DU())
+y.Rz(0,s.gl())}y.u(0,a,w)
+return w}}},
+oq:{
+"^":"Xs:10;",
+$1:function(a){return},
 $isEH:true},
-Px:{
-"^":"Tp:490;a,b,c",
-$1:[function(a){var z,y
-for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"$1",null,2,0,null,265,[],"call"],
+f7:{
+"^":"Xs:10;",
+$1:[function(a){return!!J.x(a).$isIN?$.b7().eB.t(0,a):a},"$1",null,2,0,null,120,"call"],
 $isEH:true},
-C4:{
-"^":"Tp:491;d,e,f",
-$1:[function(a){var z,y
-for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"$1",null,2,0,null,265,[],"call"],
+ov:{
+"^":"Tv;Ih",
+gPu:function(){return!1},
+static:{"^":"qr"}},
+MdQ:{
+"^":"Xs:42;",
+$0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.ol("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
 $isEH:true},
-Md:{
-"^":"Tp:115;",
-$0:[function(){return new H.VR(H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
+NV:{
+"^":"AR;LG,Bg,jR,xX,jB,Hy",
+gEQ:function(){return this.Bg==null},
+gX6:function(){return 3},
+TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
+BB:function(){var z,y,x,w
+this.Oq(!0)
+for(z=this.Bg,y=z.length,x=0;x<y;x+=2){w=z[x]
+if(w!==C.dV){z=$.xG
+if(z!=null){y=z.zT
+y=y==null?w!=null:y!==w}else y=!0
+if(y){z=new L.zG(w,P.GV(null,null,null,null),null,null,!1)
+$.xG=z}z.R3.u(0,this.jR,this)
+this.GA(z.gTT())
+this.LG=null
+break}}},
+fV:function(){var z,y,x,w
+this.Hy=null
+for(z=0;y=this.Bg,x=y.length,z<x;z+=2)if(y[z]===C.dV){w=z+1
+if(w>=x)return H.e(y,w)
+J.yd(y[w])}this.Bg=null},
+yN:function(a,b){var z
+if(this.xX!=null||this.Bg==null)throw H.b(P.w("Cannot add paths once started."))
+if(!J.x(b).$isTv)b=L.hk(b)
+z=this.Bg
+z.push(a)
+z.push(b)},
+ti:function(a){return this.yN(a,null)},
+GA:function(a){var z,y,x,w,v
+for(z=0;y=this.Bg,x=y.length,z<x;z+=2){w=y[z]
+if(w!==C.dV){v=z+1
+if(v>=x)return H.e(y,v)
+H.Go(y[v],"$isTv").kJ(w,a)}}},
+Oq:function(a){var z,y,x,w,v,u,t,s,r
+J.Vw(this.Hy,C.jn.cU(this.Bg.length,2))
+for(z=!1,y=null,x=0;w=this.Bg,v=w.length,x<v;x+=2){u=x+1
+if(u>=v)return H.e(w,u)
+t=w[u]
+s=w[x]
+if(s===C.dV){H.Go(t,"$isAp")
+r=t.gP(t)}else r=H.Go(t,"$isTv").Tl(s)
+if(a){J.kW(this.Hy,C.jn.cU(x,2),r)
+continue}w=this.Hy
+v=C.jn.cU(x,2)
+if(J.xC(r,J.UQ(w,v)))continue
+w=this.jB
+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.Hy,v))}J.kW(this.Hy,v,r)
+z=!0}if(!z)return!1
+this.JQ(this.Hy,y,w)
+return!0},
+Pz:function(){return this.Oq(!1)},
+$isAp:true},
+iNc:{
+"^":"a;"},
+AR:{
+"^":"Ap;jR<",
+d9:function(){return this.xX.$0()},
+hM:function(a){return this.xX.$1(a)},
+Lt:function(a,b){return this.xX.$2(a,b)},
+bO:function(a,b,c){return this.xX.$3(a,b,c)},
+gcF:function(){return this.xX!=null},
+TR:function(a,b){if(this.xX!=null||this.gEQ())throw H.b(P.w("Observer has already been opened."))
+if(X.Lx(b)>this.gX6())throw H.b(P.u("callback should take "+this.gX6()+" or fewer arguments"))
+this.xX=b
+this.jB=P.J(this.gX6(),X.aW(b))
+this.BB()
+return this.Hy},
+gP:function(a){this.Oq(!0)
+return this.Hy},
+xO:function(a){if(this.xX==null)return
+this.fV()
+this.Hy=null
+this.xX=null},
+di:[function(a){if(this.xX!=null)this.Fe()},"$1","gQ8",2,0,17,11],
+Fe:function(){var z=0
+while(!0){if(!(z<1000&&this.Pz()))break;++z}return z>0},
+JQ:function(a,b,c){var z,y,x,w
+try{switch(this.jB){case 0:this.d9()
+break
+case 1:this.hM(a)
+break
+case 2:this.Lt(a,b)
+break
+case 3:this.bO(a,b,c)
+break}}catch(x){w=H.Ru(x)
+z=w
+y=new H.oP(x,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0(z,y)}},
+WP:function(a,b){return this.JQ(a,b,null)}},
+zG:{
+"^":"a;zT,R3,ZY,bl,bV",
+TR:function(a,b){this.R3.u(0,b.gjR(),b)
+b.GA(this.gTT())},
+wE:[function(a){var z=J.x(a)
+if(!!z.$iswn)this.Uq(a.gRT())
+if(!!z.$isd3)this.Uq(z.gqh(a))},"$1","gTT",2,0,121],
+Uq:function(a){var z,y
+if(this.ZY==null)this.ZY=P.YM(null,null,null,null,null)
+z=this.bl
+y=z!=null?z.Rz(0,a):null
+if(y!=null)this.ZY.u(0,a,y)
+else if(!this.ZY.x4(a))this.ZY.u(0,a,a.yI(this.gp7()))},
+CH:[function(a){var z,y,x,w,v
+if(!this.bV)return
+z=this.bl
+if(z==null)z=P.YM(null,null,null,null,null)
+this.bl=this.ZY
+this.ZY=z
+for(y=this.R3,y=H.VM(new P.ro(y),[H.Kp(y,0),H.Kp(y,1)]),x=y.Fb,w=H.Kp(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.qv]),x.qT,x.bb,null),[H.Kp(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
+if(v.gcF())v.GA(this.gTT())}for(y=this.bl,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
+this.bl=null},"$0","gSI",0,0,15],
+Hi:[function(a){var z,y
+for(z=this.R3,z=H.VM(new P.ro(z),[H.Kp(z,0),H.Kp(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+if(y.gcF())y.Pz()}this.bV=!0
+P.rb(this.gSI(this))},"$1","gp7",2,0,17,122],
+static:{"^":"xG",SE:function(a,b){var z,y
+z=$.xG
+if(z!=null){y=z.zT
+y=y==null?b!=null:y!==b}else y=!0
+if(y){z=new L.zG(b,P.GV(null,null,null,null),null,null,!1)
+$.xG=z}z.R3.u(0,a.jR,a)
+a.GA(z.gTT())}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
-Jk:[function(a){var z,y,x
+tB:[function(a){var z,y,x
 z=J.x(a)
 if(!!z.$isd3)return a
-if(!!z.$isZ0){y=V.Bq(a,null,null)
-z.aN(a,new R.km(y))
-return y}if(!!z.$isQV){z=z.ez(a,R.np())
-x=Q.uX(null,null)
+if(!!z.$isZ0){y=V.AB(a,null,null)
+z.aN(a,new R.Fk(y))
+return y}if(!!z.$iscX){z=z.ez(a,R.Ft())
+x=Q.ch(null,null)
 x.FV(0,z)
-return x}return a},"$1","np",2,0,116,30,[]],
-km:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"$2",null,4,0,null,376,[],122,[],"call"],
+return x}return a},"$1","Ft",2,0,10,18],
+Fk:{
+"^":"Xs:51;a",
+$2:function(a,b){this.a.u(0,R.tB(a),R.tB(b))},
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
-JX:[function(){var z,y
-z=document.createElement("style",null)
-J.c9(z,".polymer-veiled { opacity: 0; } \n.polymer-unveil{ -webkit-transition: opacity 0.3s; transition: opacity 0.3s; }\n")
-y=document.querySelector("head")
-y.insertBefore(z,y.firstChild)
-A.B2()
-$.mC().MM.ml(new A.Zj())},"$0","Ti",0,0,null],
-B2:[function(){var z,y,x
-for(z=$.IN(),z=H.VM(new H.a7(z,1,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-for(x=W.vD(document.querySelectorAll(y),null),x=x.gA(x);x.G();)J.wT(J.pP(x.lo),"polymer-veiled")}},"$0","Gi",0,0,null],
-yV:[function(a){var z,y
-z=$.xY().Rz(0,a)
-if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},"$1","Km",2,0,null,12,[]],
-oF:[function(a,b){var z,y,x,w
-if(J.de(a,$.H8()))return b
-b=A.oF(a.gAY(),b)
-for(z=a.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
-if(y.gFo()||y.gq4())continue
-x=J.x(y)
-if(!(!!x.$isRY&&!x.gV5(y)))w=!!x.$isRS&&y.glT()
-else w=!0
-if(w)for(w=J.GP(y.gc9());w.G();)if(!!J.x(w.lo.gAx()).$isyL){if(!x.$isRS||A.bc(a,y)){if(b==null)b=P.Fl(null,null)
-b.u(0,y.gIf(),y)}break}}return b},"$2","Cd",4,0,null,267,[],268,[]],
-Oy:[function(a,b){var z,y
-do{z=a.gYK().nb.t(0,b)
-y=J.x(z)
-if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
-a=a.gAY()}while(!J.de(a,$.H8()))
-return},"$2","il",4,0,null,267,[],74,[]],
-bc:[function(a,b){var z,y
-z=H.u1(H.d(b.gIf().fN)+"=")
-y=a.gYK().nb.t(0,new H.GD(z))
-return!!J.x(y).$isRS&&y.ghB()},"$2","i8",4,0,null,267,[],269,[]],
-YG:[function(a,b,c){var z,y,x
-z=$.cM()
-if(z==null||a==null)return
-if(!z.Bm("ShadowDOMPolyfill"))return
-y=J.UQ(z,"Platform")
+oF:function(a,b){var z,y,x
+for(z=$.yQ().Me(0,a,C.YV),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+x=J.RE(y)
+if(x.gV5(y)===!0)continue
+if(b==null)b=P.Fl(null,null)
+b.u(0,L.hk([x.goc(y)]),y)}return b},
+YG:function(a,b,c){var z,y
+if(a==null||$.Nc()!==!0)return
+z=J.UQ($.ca(),"Platform")
+if(z==null)return
+y=J.UQ(z,"ShadowCSS")
 if(y==null)return
-x=J.UQ(y,"ShadowCSS")
-if(x==null)return
-x.V7("shimStyling",[a,b,c])},"$3","OA",6,0,null,270,[],12,[],271,[]],
-Hl:[function(a){var z,y,x,w,v,u
+y.K9("shimStyling",[a,b,c])},
+Hl:function(a){var z,y,x,w,v
 if(a==null)return""
+if($.ok)return""
 w=J.RE(a)
 z=w.gmH(a)
-if(J.de(z,""))z=w.gQg(a).MW.getAttribute("href")
-w=$.cM()
-if(w!=null&&w.Bm("HTMLImports")){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||!1)H.vh(P.u("object cannot be a num, string, bool, or null"))
-v=J.UQ(P.ND(P.wY(a)),"__resource")
-if(v!=null)return v
-$.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\"")
-return""}try{w=new XMLHttpRequest()
+if(J.xC(z,""))z=w.gQg(a).MW.getAttribute("href")
+try{w=new XMLHttpRequest()
 C.W3.eo(w,"GET",z,!1)
 w.send()
 w=w.responseText
-return w}catch(u){w=H.Ru(u)
+return w}catch(v){w=H.Ru(v)
 if(!!J.x(w).$isNh){y=w
-x=new H.XO(u,null)
-$.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},"$1","BV",2,0,null,272,[]],
-Ad:[function(a,b){var z
-if(b==null)b=C.Tu
-$.Ej().u(0,a,b)
-z=$.p2().Rz(0,a)
-if(z!=null)J.Or(z)},"$2","ZK",2,2,null,85,12,[],11,[]],
-xv:[function(a){A.pb(a,new A.Mq())},"$1","N1",2,0,null,273,[]],
-pb:[function(a,b){var z
+x=new H.oP(v,null)
+$.Es().Ny("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
+return""}else throw v}},
+fS:[function(a){var z,y
+z=$.b7().eB.t(0,a)
+if(z==null)return!1
+y=J.rY(z)
+return y.Tc(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","NL",2,0,43,44],
+Ad:function(a,b){$.Ej().u(0,a,b)
+H.Go(J.UQ($.ca(),"Polymer"),"$isr7").PO([a])},
+xv:function(a){A.Cm(a,new A.YC())},
+Cm:function(a,b){var z
 if(a==null)return
 b.$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"$2","e0",4,0,null,273,[],164,[]],
-lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
-return new A.L6(a,b)},"$4","y4",8,0,null,274,[],12,[],273,[],275,[]],
-z9:[function(a){var z
-for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"$1","b4",2,0,null,273,[]],
-HR:[function(a,b,c){var z,y,x
-z=H.vn(a)
-y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
-if(y!=null){x=y.gMP()
-x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"$3","xi",6,0,null,48,[],276,[],19,[]],
-Rk:[function(a,b){var z
-do{z=a.gYK().nb.t(0,b)
-if(!!J.x(z).$isRS)return z
-a=a.gAY()}while(a!=null)},"$2","ov",4,0,null,11,[],12,[]],
-ZI:[function(a,b){var z,y
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.Cm(z,b)},
+pf:function(a,b,c){return new A.L6(a,b)},
+h6:function(a,b){var z,y
 if(a==null)return
 z=document.createElement("style",null)
-J.c9(z,J.nJ(a))
+J.t3(z,J.dY(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"$2","tO",4,0,null,277,[],278,[]],
-pX:[function(){var z=window
-C.ol.hr(z)
-C.ol.oB(z,W.aF(new A.hm()))},"$0","ji",0,0,null],
-al:[function(a,b){var z,y,x
-z=J.x(b)
-y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
-z=J.RE(y)
-if(J.de(z.gUx(y),C.PU)||J.de(z.gUx(y),C.nN))if(a!=null){x=A.h5(a)
-if(x!=null)return P.re(x)
-return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"$2","bP",4,0,null,30,[],74,[]],
-h5:[function(a){if(a==null)return C.Qf
-if(typeof a==="number"&&Math.floor(a)===a)return C.yw
-if(typeof a==="number")return C.O4
-if(typeof a==="boolean")return C.HL
-if(typeof a==="string")return C.Db
-if(!!J.x(a).$isiP)return C.Yc
-return},"$1","v9",2,0,null,30,[]],
-Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
-z.Gr(A.PB())
-return z}A.ei()
-return $.X3},"$0","ym",0,0,null],
-ei:[function(){var z=document
-W.wi(window,z,"polymer-element",C.Bm,null)
-A.Jv()
-A.JX()
-$.ax().ml(new A.rD())},"$0","PB",0,0,126],
-Jv:[function(){var z,y,x,w,v,u,t
-for(w=$.UP(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
-try{A.pw(z)}catch(v){u=H.Ru(v)
-y=u
-x=new H.XO(v,null)
-u=new P.vs(0,$.X3,null,null,null,null,null,null)
-u.$builtinTypeInfo=[null]
-new P.Zf(u).$builtinTypeInfo=[null]
-t=y
-if(t==null)H.vh(P.u("Error must not be null"))
-if(u.Gv!==0)H.vh(P.w("Future already completed"))
-u.CG(t,x)}}},"$0","vH",0,0,null],
-GA:[function(a,b,c,d){var z,y,x,w,v,u
-if(c==null)c=P.Ls(null,null,null,W.YN)
-if(d==null){d=[]
-d.$builtinTypeInfo=[J.O]}if(a==null){z="warning: "+H.d(b)+" not found."
-y=$.oK
-if(y==null)H.qw(z)
-else y.$1(z)
-return d}if(c.tg(0,a))return d
-c.h(c,a)
-for(y=W.vD(a.querySelectorAll("script,link[rel=\"import\"]"),null),y=y.gA(y),x=!1;y.G();){w=y.lo
-v=J.x(w)
-if(!!v.$isQj)A.GA(w.import,w.href,c,d)
-else if(!!v.$isj2&&w.type==="application/dart")if(!x){u=v.gLA(w)
-d.push(u===""?b:u)
-x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
-v=$.oK
-if(v==null)H.qw(z)
-else v.$1(z)}}return d},"$4","fE",4,4,null,85,85,279,[],280,[],281,[],282,[]],
-pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
-z=$.RQ()
-z.toString
-y=P.hK(a)
-x=y.Fi
-if(x!==""){w=y.ku
-v=y.gJf(y)
-u=y.gtp(y)
-t=z.SK(y.r0)
-s=y.tP}else{if(y.gJf(y)!==""){w=y.ku
-v=y.gJf(y)
-u=y.gtp(y)
-t=z.SK(y.r0)
-s=y.tP}else{r=y.r0
-if(r===""){t=z.r0
-s=y.tP
-s=s!==""?s:z.tP}else{r=J.co(r,"/")
-q=y.r0
-t=r?z.SK(q):z.SK(z.Ky(z.r0,q))
-s=y.tP}w=z.ku
-v=z.gJf(z)
-u=z.gtp(z)}x=z.Fi}p=P.R6(y.Ka,v,t,null,u,s,null,x,w)
-y=$.UG().nb
-o=y.t(0,p)
-n=p.r0
-if(p.Fi===z.Fi)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
-else z=!1
-else z=!1
-else z=!1
-if(z){z=p.r0
-m=y.t(0,P.hK("package:"+C.xB.yn(z,J.U6(z).cn(z,"packages/")+9)))
-if(m!=null)o=m}if(o==null){$.M7().To(p.bu(0)+" library not found")
-return}z=o.gYK().nb
-z=z.gUQ(z)
-y=new A.Fn()
-r=new H.U5(z,y)
-r.$builtinTypeInfo=[H.ip(z,"mW",0)]
-z=z.gA(z)
-y=new H.SO(z,y)
-y.$builtinTypeInfo=[H.Kp(r,0)]
-for(;y.G();)A.ZB(o,z.gl())
-z=o.gYK().nb
-z=z.gUQ(z)
-y=new A.e3()
-r=new H.U5(z,y)
-r.$builtinTypeInfo=[H.ip(z,"mW",0)]
-z=z.gA(z)
-y=new H.SO(z,y)
-y.$builtinTypeInfo=[H.Kp(r,0)]
-for(;y.G();){l=z.gl()
-for(r=J.GP(l.gc9());r.G();){k=r.lo.gAx()
-if(!!J.x(k).$isV3){q=k.ns
-j=l.gYj()
-$.Ej().u(0,q,j)
-i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"$1","qt",2,0,null,283,[]],
-ZB:[function(a,b){var z,y,x
-for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
-break}if(!y)return
-if(!b.gFo()){x="warning: methods marked with @initMethod should be static, "+J.AG(b.gIf())+" is not."
-z=$.oK
-if(z==null)H.qw(x)
-else z.$1(x)
-return}z=b.gMP()
-z=z.ev(z,new A.pM())
-if(z.gA(z).G()){x="warning: methods marked with @initMethod should take no arguments, "+J.AG(b.gIf())+" expects some."
-z=$.oK
-if(z==null)H.qw(x)
-else z.$1(x)
-return}a.CI(b.gIf(),C.xD)},"$2","Ii",4,0,null,101,[],233,[]],
-Zj:{
-"^":"Tp:116;",
-$1:[function(a){A.pX()},"$1",null,2,0,null,117,[],"call"],
-$isEH:true},
+b.appendChild(z)},
+X1:function(a,b){var z
+A.JP()
+$.ok=b
+for(z=H.VM(new H.a7(a,58,0,null),[H.Kp(a,0)]);z.G();)z.lo.$0()},
+JP:function(){var z,y,x,w,v
+z=J.UQ($.ca(),"Polymer")
+if(z==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; if you do that be sure to include the platform polyfills."))
+y=$.X3
+z.K9("whenPolymerReady",[y.ce(new A.hp())])
+x=J.UQ(P.Oe(document.createElement("polymer-element",null)),"__proto__")
+if(!!J.x(x).$isKV)x=P.Oe(x)
+w=J.U6(x)
+v=w.t(x,"register")
+if(v==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
+w.u(x,"register",P.mt(new A.k2(y,v)))},
 XP:{
-"^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,lk",
-gt5:function(a){return a.zx},
-gP1:function(a){return a.aa},
-goc:function(a){return a.RT},
-gZf:function(a){var z,y
-z=a.querySelector("template")
-if(z!=null)y=J.G6(!!J.x(z).$isTU?z:M.Ky(z))
+"^":"a;FL<,t5>,P1<,oc>,Q7<,NF<,iK<,kK<,of,lD,PS<,Ve",
+gZf:function(){var z,y
+z=J.c1(this.FL,"template")
+if(z!=null)y=J.NQ(!!J.x(z).$isvy?z:M.Ky(z))
 else y=null
 return y},
-yx:function(a){var z,y,x,w,v
-if(this.y0(a,a.RT))return
-z=a.getAttribute("extends")
-if(this.PM(a,z))return
-y=a.RT
-x=$.Ej()
-a.zx=x.t(0,y)
-x=x.t(0,z)
-a.kw=x
-if(x!=null)a.aa=$.cd().t(0,z)
-w=P.re(a.zx)
-this.YU(a,w,a.aa)
-x=a.Q7
-if(x!=null)a.NF=this.qC(a,x)
-this.q1(a,w)
-$.cd().u(0,y,a)
-this.Vk(a)
-this.W3(a,a.Gd)
-this.Mi(a)
-this.f6(a)
-this.yq(a)
-A.ZI(this.J3(a,this.kO(a,"global"),"global"),document.head)
-A.YG(this.gZf(a),y,z)
-w=P.re(a.zx)
-v=w.gYK().nb.t(0,C.c8)
-if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
-this.Ba(a,y)
-A.yV(a.RT)},
-y0:function(a,b){if($.Ej().t(0,b)!=null)return!1
-$.p2().u(0,b,a)
-if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
-return!0},
-PM:function(a,b){if(b!=null&&C.xB.u8(b,"-")>=0)if(!$.cd().x4(b)){J.wT($.xY().to(b,new A.q6()),a)
-return!0}return!1},
-Ba:function(a,b){var z,y,x,w
-for(z=a,y=null;z!=null;){x=J.RE(z)
-y=x.gQg(z).MW.getAttribute("extends")
-z=x.gP1(z)}x=document
-w=a.zx
-W.wi(window,x,b,w,y)},
-YU:function(a,b,c){var z,y,x,w,v,u
-if(c!=null&&J.YP(c)!=null){z=J.YP(c)
+FU:function(){var z,y,x,w
+if($.Nc()!==!0){z=this.gZf()
+if(z==null)return
+for(y=J.MK(z,"shadow"),y=y.gA(y);y.G();){x=y.lo
+w=J.RE(x)
+if(J.FN(w.gUN(x)))w.mx(x,document.createElement("content",null))}}},
+Ba:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+for(z=null,y=this;y!=null;){z=J.Vs(y.gFL()).MW.getAttribute("extends")
+y=y.gP1()}x=document
+w=this.t5
+v=window
+u=J.Dc(w)
+if(u==null)H.vh(P.u(w))
+t=u.prototype
+s=J.Nq(w,"created")
+if(s==null)H.vh(P.u(H.d(w)+" has no constructor called 'created'"))
+J.M3(W.r3("article",null))
+r=u.$nativeSuperclassTag
+if(r==null)H.vh(P.u(w))
+w=z==null
+if(w){if(!J.xC(r,"HTMLElement"))H.vh(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(x.createElement(z) instanceof window[r]))H.vh(P.f("extendsTag does not match base native class"))
+q=v[r]
+p={}
+p.createdCallback={value:function(b){return function(){return b(this)}}(H.tR(W.v8(s,t),1))}
+p.attachedCallback={value:function(b){return function(){return b(this)}}(H.tR(W.B4(),1))}
+p.detachedCallback={value:function(b){return function(){return b(this)}}(H.tR(W.Z6(),1))}
+p.attributeChangedCallback={value:function(b){return function(c,d,e){return b(this,c,d,e)}}(H.tR(W.A6(),4))}
+o=Object.create(q.prototype,p)
+v=H.Va(t)
+Object.defineProperty(o,init.dispatchPropertyName,{value:v,enumerable:false,writable:true,configurable:true})
+n={prototype:o}
+if(!w)n.extends=z
+x.registerElement(a,n)},
+Zw:function(a){var z,y,x,w,v,u,t,s,r
+if(a!=null&&a.gQ7()!=null){z=a.gQ7()
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
-a.Q7=y}a.Q7=A.oF(b,a.Q7)
-x=a.getAttribute("attributes")
-if(x!=null){z=x.split(C.xB.tg(x,",")?",":" ")
-z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
-for(;z.G();){w=J.rr(z.lo)
-if(w!==""){y=a.Q7
-y=y!=null&&y.x4(w)}else y=!1
-if(y)continue
-v=new H.GD(H.u1(w))
-u=A.Oy(b,v)
-if(u==null){window
-y="property for attribute "+w+" of polymer-element name="+H.d(a.RT)+" not found."
-if(typeof console!="undefined")console.warn(y)
-continue}y=a.Q7
-if(y==null){y=P.Fl(null,null)
-a.Q7=y}y.u(0,v,u)}}},
-Vk:function(a){var z,y
-z=P.L5(null,null,null,J.O,P.a)
-a.xX=z
-y=a.aa
-if(y!=null)z.FV(0,J.Ng(y))
-new W.i7(a).aN(0,new A.CK(a))},
-W3:function(a,b){new W.i7(a).aN(0,new A.LJ(b))},
-Mi:function(a){var z=this.Hs(a,"[rel=stylesheet]")
-a.cI=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},
-f6:function(a){var z=this.Hs(a,"style[polymer-scope]")
-a.lD=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},
-yq:function(a){var z,y,x,w,v,u,t
-z=a.cI
+this.Q7=y}z=this.t5
+this.Q7=A.oF(z,this.Q7)
+x=J.Vs(this.FL).MW.getAttribute("attributes")
+if(x!=null)for(y=C.xB.Fr(x,$.zZ()),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
+if(v==="")continue
+u=$.b7().d8.t(0,v)
+t=L.hk([u])
+s=this.Q7
+if(s!=null&&s.x4(t))continue
+r=$.yQ().CV(z,u)
+if(r==null||r.fY===C.it||r.V5){window
+s="property for attribute "+v+" of polymer-element name="+H.d(w)+" not found."
+if(typeof console!="undefined")console.warn(s)
+continue}s=this.Q7
+if(s==null){s=P.Fl(null,null)
+this.Q7=s}s.u(0,t,r)}},
+Vk:function(){var z,y
+z=P.L5(null,null,null,P.qU,P.a)
+this.kK=z
+y=this.P1
+if(y!=null)z.FV(0,y.gkK())
+J.Vs(this.FL).aN(0,new A.HO(this))},
+W3:function(a){J.Vs(this.FL).aN(0,new A.BO(a))},
+Mi:function(){var z=this.Hs("[rel=stylesheet]")
+this.of=z
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.wp(z.lo)},
+f6:function(){var z=this.Hs("style[polymer-scope]")
+this.lD=z
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.wp(z.lo)},
+OL:function(){var z,y,x,w,v,u,t
+z=this.of
 z.toString
 y=H.VM(new H.U5(z,new A.ZG()),[null])
-x=this.gZf(a)
+x=this.gZf()
 if(x!=null){w=P.p9("")
-for(z=H.VM(new H.SO(J.GP(y.l6),y.T6),[H.Kp(y,0)]),v=z.OI;z.G();){u=A.Hl(v.gl())
+for(z=H.VM(new H.SO(J.mY(y.l6),y.T6),[H.Kp(y,0)]),v=z.OI;z.G();){u=A.Hl(v.gl())
 t=w.vM+=typeof u==="string"?u:H.d(u)
 w.vM=t+"\n"}if(w.vM.length>0){z=document.createElement("style",null)
-J.c9(z,H.d(w))
+J.t3(z,H.d(w))
 v=J.RE(x)
-v.mK(x,z,v.gp8(x))}}},
-oP:function(a,b,c){var z,y,x
-z=W.vD(a.querySelectorAll(b),null)
+v.FO(x,z,v.gPZ(x))}}},
+Wz:function(a,b){var z,y,x
+z=J.MK(this.FL,a)
 y=z.br(z)
-x=this.gZf(a)
-if(x!=null)C.Nm.FV(y,J.pe(x,b))
+x=this.gZf()
+if(x!=null)C.Nm.FV(y,J.MK(x,a))
 return y},
-Hs:function(a,b){return this.oP(a,b,null)},
-kO:function(a,b){var z,y,x,w,v,u
+Hs:function(a){return this.Wz(a,null)},
+kO:function(a){var z,y,x,w,v,u
 z=P.p9("")
-y=new A.Oc("[polymer-scope="+b+"]")
-for(x=a.cI,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.SO(J.GP(x.l6),x.T6),[H.Kp(x,0)]),w=x.OI;x.G();){v=A.Hl(w.gl())
+y=new A.ua("[polymer-scope="+a+"]")
+for(x=this.of,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.SO(J.mY(x.l6),x.T6),[H.Kp(x,0)]),w=x.OI;x.G();){v=A.Hl(w.gl())
 u=z.vM+=typeof v==="string"?v:H.d(v)
-z.vM=u+"\n\n"}for(x=a.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.SO(J.GP(y.l6),y.T6),[H.Kp(y,0)]),x=y.OI;y.G();){w=x.gl().ghg()
-w=z.vM+=w
+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.SO(J.mY(y.l6),y.T6),[H.Kp(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},
-J3:function(a,b,c){var z
-if(b==="")return
+J3:function(a,b){var z
+if(a==="")return
 z=document.createElement("style",null)
-J.c9(z,b)
-z.setAttribute("element",H.d(a.RT)+"-"+c)
+J.t3(z,a)
+z.setAttribute("element",H.d(this.oc)+"-"+b)
 return z},
-q1:function(a,b){var z,y,x,w
-if(J.de(b,$.H8()))return
-this.q1(a,b.gAY())
-for(z=b.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
-if(!J.x(y).$isRS||y.gFo()||!y.guU())continue
-x=y.gIf().fN
-w=J.rY(x)
-if(w.Tc(x,"Changed")&&!w.n(x,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
-x=w.Nj(x,0,J.xH(w.gB(x),7))
-a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},
-qC:function(a,b){var z=P.L5(null,null,null,J.O,null)
-b.aN(0,new A.MX(z))
+rH:function(){var z,y,x,w,v
+for(z=$.HN(),z=$.yQ().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+if(this.iK==null)this.iK=P.YM(null,null,null,null,null)
+x=J.RE(y)
+w=x.goc(y)
+v=$.b7().eB.t(0,w)
+w=J.U6(v)
+v=w.Nj(v,0,J.Hn(w.gB(v),7))
+this.iK.u(0,L.hk(v),[x.goc(y)])}},
+I7:function(){var z,y,x
+for(z=$.yQ().Me(0,this.t5,C.Xk),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo.gDv()
+x=new H.a7(y,y.length,0,null)
+x.$builtinTypeInfo=[H.Kp(y,0)]
+for(;x.G();)continue}},
+Yl:function(a){var z=P.L5(null,null,null,P.qU,null)
+a.aN(0,new A.MX(z))
 return z},
-du:function(a){a.RT=a.getAttribute("name")
-this.yx(a)},
-$isXP:true,
-static:{"^":"Rlv",XL:function(a){a.Gd=P.Fl(null,null)
-C.zb.ZL(a)
-C.zb.du(a)
-return a}}},
-q6:{
-"^":"Tp:115;",
-$0:[function(){return[]},"$0",null,0,0,null,"call"],
+$isXP:true},
+HO:{
+"^":"Xs:51;a",
+$2:function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
 $isEH:true},
-CK:{
-"^":"Tp:300;a",
-$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"$2",null,4,0,null,12,[],30,[],"call"],
-$isEH:true},
-LJ:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z,y,x
+BO:{
+"^":"Xs:51;a",
+$2:function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
 x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"$2",null,4,0,null,12,[],30,[],"call"],
+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},
 ZG:{
-"^":"Tp:116;",
-$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"$1",null,2,0,null,94,[],"call"],
+"^":"Xs:10;",
+$1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
-Oc:{
-"^":"Tp:116;a",
-$1:[function(a){return J.Kf(a,this.a)},"$1",null,2,0,null,94,[],"call"],
+ua:{
+"^":"Xs:10;a",
+$1:function(a){return J.RF(a,this.a)},
+$isEH:true},
+ix:{
+"^":"Xs:42;",
+$0:function(){return[]},
 $isEH:true},
 MX:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"$2",null,4,0,null,12,[],30,[],"call"],
+"^":"Xs:123;a",
+$2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
-w12:{
-"^":"Tp:115;",
-$0:[function(){var z=P.L5(null,null,null,J.O,J.O)
-C.FS.aN(0,new A.r3y(z))
-return z},"$0",null,0,0,null,"call"],
+DOe:{
+"^":"Xs:42;",
+$0:function(){var z=P.L5(null,null,null,P.qU,P.qU)
+C.SP.aN(0,new A.LfS(z))
+return z},
 $isEH:true},
-r3y:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,492,[],493,[],"call"],
+LfS:{
+"^":"Xs:51;a",
+$2:function(a,b){this.a.u(0,b,a)},
 $isEH:true},
 yL:{
-"^":"ndx;",
-$isyL:true},
-zs:{
-"^":["a;KM:X0=-306",function(){return[C.Nw]}],
+"^":"ndx;"},
+dM:{
+"^":"a;",
 Pa:function(a){var z
 if(W.Pv(this.gM0(a).defaultView)==null)z=$.Bh>0
 else z=!0
-if(z)this.Ec(a)},
-Ec:function(a){var z,y
+if(z)this.es(a)},
+es:function(a){var z,y
 z=this.gQg(a).MW.getAttribute("is")
 y=z==null||z===""?this.gqn(a):z
-a.dZ=$.cd().t(0,y)
+a.a6=$.RA().t(0,y)
 this.Xl(a)
-this.Z2(a)
+this.oR(a)
 this.fk(a)
 this.Uc(a)
 $.Bh=$.Bh+1
-this.z2(a,a.dZ)
-$.Bh=$.Bh-1},
-i4:function(a){if(a.dZ==null)this.Ec(a)
-this.BT(a,!0)},
-xo:function(a){this.x3(a)},
-z2:function(a,b){if(b!=null){this.z2(a,J.lB(b))
-this.d0(a,b)}},
-d0:function(a,b){var z,y,x,w
+this.Oh(a,a.a6)
+$.Bh=$.Bh-1
+this.I9(a)},
+I9:function(a){},
+q0:function(a){if(a.a6==null)this.es(a)
+this.dH(a,!0)},
+Nz:function(a){this.x3(a)},
+Oh:function(a,b){if(b!=null){this.Oh(a,b.gP1())
+this.aI(a,b.gFL())}},
+aI:function(a,b){var z,y,x,w
 z=J.RE(b)
-y=z.Ja(b,"template")
-if(y!=null)if(J.Vs(a.dZ).MW.hasAttribute("lightdom")===!0){this.Se(a,y)
-x=null}else x=this.Tp(a,y)
+y=z.Wk(b,"template")
+if(y!=null)if(J.Vs(a.a6.gFL()).MW.hasAttribute("lightdom")===!0){this.Se(a,y)
+x=null}else x=this.TH(a,y)
 else x=null
 if(!J.x(x).$isI0)return
 w=z.gQg(b).MW.getAttribute("name")
 if(w==null)return
-a.B7.u(0,w,x)},
+a.BA.u(0,w,x)},
 Se:function(a,b){var z,y
 if(b==null)return
-z=!!J.x(b).$isTU?b:M.Ky(b)
-y=z.ZK(a,a.SO)
-this.jx(a,y)
-this.lj(a,a)
+z=!!J.x(b).$isvy?b:M.Ky(b)
+y=z.ZK(a,a.on)
+this.mx(a,y)
+this.Ec(a,a)
 return y},
-Tp:function(a,b){var z,y
+TH:function(a,b){var z,y
 if(b==null)return
 this.gIW(a)
 z=this.er(a)
-$.od().u(0,z,a)
+$.c7().u(0,z,a)
 z.applyAuthorStyles=!1
 z.resetStyleInheritance=!1
-y=!!J.x(b).$isTU?b:M.Ky(b)
-z.appendChild(y.ZK(a,a.SO))
-this.lj(a,z)
+y=!!J.x(b).$isvy?b:M.Ky(b)
+z.appendChild(y.ZK(a,a.on))
+this.Ec(a,z)
 return z},
-lj:function(a,b){var z,y,x,w
-for(z=J.pe(b,"[id]"),z=z.gA(z),y=a.X0,x=J.w1(y);z.G();){w=z.lo
-x.u(y,J.F8(w),w)}},
-aC:function(a,b,c,d){var z=J.x(b)
+Ec:function(a,b){var z,y,x
+for(z=J.MK(b,"[id]"),z=z.gA(z),y=a.LL;z.G();){x=z.lo
+y.u(0,J.F8(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){J.Ng(a.dZ).aN(0,new A.WC(a))},
-fk:function(a){if(J.ak(a.dZ)==null)return
+oR:function(a){a.a6.gkK().aN(0,new A.Sv(a))},
+fk:function(a){if(a.a6.gNF()==null)return
 this.gQg(a).aN(0,this.ghW(a))},
-D3:[function(a,b,c){var z,y,x,w
+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.kE(c,$.iB())===!0)return
-y=H.vn(a)
-x=y.rN(z.gIf()).gAx()
-w=Z.Zh(c,x,A.al(x,z))
-if(w==null?x!=null:w!==x){y.tu(z.gIf(),2,[w],C.CM)
-H.vn(w)}},"$2","ghW",4,0,494,12,[],30,[]],
-B2:function(a,b){var z=J.ak(a.dZ)
+if(c==null||J.x5(c,$.iB())===!0)return
+y=J.RE(z)
+x=y.goc(z)
+w=$.cp().jD(a,x)
+v=y.gt5(z)
+x=J.x(v)
+u=Z.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.HH))&&w!=null?J.bB(w):v)
+if(u==null?w!=null:u!==w){y=y.goc(z)
+$.cp().Cq(a,y,u)}},"$2","ghW",4,0,124],
+B2:function(a,b){var z=a.a6.gNF()
 if(z==null)return
 return z.t(0,b)},
 TW:function(a,b){if(b==null)return
 if(typeof b==="boolean")return b?"":null
-else if(typeof b==="string"||typeof b==="number"&&Math.floor(b)===b||typeof b==="number")return H.d(b)
+else if(typeof b==="string"||typeof b==="number")return H.d(b)
 return},
-Id:function(a,b){var z,y
-z=H.vn(a).rN(b).gAx()
+QS:function(a,b){var z,y
+if(!J.xC(J.q8(b),1))throw H.b(P.u("path must be length 1"))
+z=b.Tl(a)
 y=this.TW(a,z)
-if(y!=null)this.gQg(a).MW.setAttribute(J.GL(b),y)
-else if(typeof z==="boolean")this.gQg(a).Rz(0,J.GL(b))},
-Z1:function(a,b,c,d){var z,y,x,w,v,u,t
-if(a.dZ==null)this.Ec(a)
+if(y!=null)this.gQg(a).MW.setAttribute(H.d(b),y)
+else if(typeof z==="boolean")this.gQg(a).Rz(0,H.d(b))},
+nR:function(a,b,c,d){var z,y,x,w,v
+if(a.a6==null)this.es(a)
 z=this.B2(a,b)
-if(z==null)return J.Jj(M.Ky(a),b,c,d)
-else{J.MV(M.Ky(a),b)
-y=z.gIf()
-x=$.ZH()
-if(x.Im(C.R5))x.J4("["+H.d(c)+"]: bindProperties: ["+H.d(d)+"] to ["+H.d(this.gqn(a))+"].["+J.AG(y)+"]")
-w=L.Sk(c,d,null)
-if(w.gP(w)==null)w.sP(0,H.vn(a).rN(y).gAx())
-x=H.vn(a)
-v=y.fN
-u=d!=null?d:""
-t=new A.Bf(x,y,null,null,a,c,null,null,v,u)
-t.Og(a,v,c,d)
-t.bw(a,y,c,d)
-this.Id(a,z.gIf())
-J.kW(J.QE(M.Ky(a)),b,t)
-return t}},
+if(z==null)return J.FS(M.Ky(a),b,c,d)
+else{J.SB(M.Ky(a),b)
+y=J.RE(z)
+x=y.goc(z)
+w=$.ZH()
+if(w.Im(C.eI))w.Ny("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gqn(a))+"].[name]")
+w=J.RE(c)
+if(w.gP(c)==null)w.sP(c,$.cp().jD(a,x))
+v=new A.Bf(a,x,c,null,null)
+v.Jq=this.gqh(a).yI(v.gXQ())
+w=J.mu(c,v.gap())
+v.dY=w
+$.cp().Cq(a,x,w)
+this.QS(a,L.hk([y.goc(z)]))
+J.kW(J.QE(M.Ky(a)),b,v)
+return v}},
 gCd:function(a){return J.QE(M.Ky(a))},
-Ih:function(a,b){return J.MV(M.Ky(a),b)},
+Yj:function(a,b){return J.SB(M.Ky(a),b)},
 x3:function(a){var z,y
-if(a.Uk===!0)return
-$.P5().J4("["+H.d(this.gqn(a))+"] asyncUnbindAll")
-z=a.oq
+if(a.q9===!0)return
+$.RI().Ny("["+H.d(this.gqn(a))+"] asyncUnbindAll")
+z=a.YE
 y=this.gJg(a)
 if(z!=null)z.TP(0)
 else z=new A.S0(null,null)
-z.M3=y
-z.ih=P.rT(C.ny,z.gv6(z))
-a.oq=z},
+z.jd=y
+z.ih=P.ww(C.ny,z.gv6(z))
+a.YE=z},
 GB:[function(a){var z,y
-if(a.Uk===!0)return
-z=a.Wz
-if(z!=null){z.ed()
-a.Wz=null}this.C0(a)
-J.AA(M.Ky(a))
+if(a.q9===!0)return
+z=a.JB
+if(z!=null){z.xO(0)
+a.JB=null}this.C0(a)
+J.D9(M.Ky(a))
 y=this.gIW(a)
 for(;y!=null;){A.xv(y)
-y=y.olderShadowRoot}a.Uk=!0},"$0","gJg",0,0,126],
-BT:function(a,b){var z
-if(a.Uk===!0){$.P5().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
-return}$.P5().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
-z=a.oq
+y=y.olderShadowRoot}a.q9=!0},"$0","gJg",0,0,15],
+dH:function(a,b){var z
+if(a.q9===!0){$.RI().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
+return}$.RI().Ny("["+H.d(this.gqn(a))+"] cancelUnbindAll")
+z=a.YE
 if(z!=null){z.TP(0)
-a.oq=null}if(b===!0)return
-A.pb(this.gIW(a),new A.TV())},
-oW:function(a){return this.BT(a,null)},
-Xl:function(a){var z,y,x,w,v
-z=J.xR(a.dZ)
-y=J.YP(a.dZ)
-if(z!=null)for(x=H.VM(new P.i5(z),[H.Kp(z,0)]),w=x.Fb,x=H.VM(new P.N6(w,w.zN,null,null),[H.Kp(x,0)]),x.zq=x.Fb.H9;x.G();){v=x.fD
-this.rJ(a,v,H.vn(a).rN(v),null)}if(z!=null||y!=null)a.Wz=this.gUj(a).yI(this.gnu(a))},
-Pv:[function(a,b){var z,y,x,w,v
-z=J.xR(a.dZ)
-y=J.YP(a.dZ)
-x=P.L5(null,null,null,P.wv,A.bS)
-for(w=J.GP(b);w.G();){v=w.gl()
-if(!J.x(v).$isqI)continue
-J.iF(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,495,496,[]],
+a.YE=null}if(b===!0)return
+A.Cm(this.gIW(a),new A.TV())},
+oW:function(a){return this.dH(a,null)},
+Xl:function(a){var z,y,x,w,v,u,t
+z=a.a6.giK()
+y=a.a6.gQ7()
+x=z==null
+w=!x
+if(!x||y!=null){x=$.ps
+$.ps=x+1
+v=new L.NV(null,[],x,null,null,null)
+v.Hy=[]
+a.JB=v
+if(w)for(x=H.VM(new P.fG(z),[H.Kp(z,0)]),u=x.Fb,x=H.VM(new P.EQ(u,u.Ig(),0,null),[H.Kp(x,0)]);x.G();){t=x.fD
+v.yN(a,t)
+this.rJ(a,t,t.Tl(a),null)}if(y!=null)for(x=y.gvc(),u=x.Fb,x=H.VM(new P.N6(u,u.zN,null,null),[H.Kp(x,0)]),x.zq=x.Fb.H9;x.G();){t=x.fD
+if(!w||!z.x4(t))v.yN(a,t)}L.AR.prototype.TR.call(v,v,this.gnu(a))}},
+FQ:[function(a,b,c,d){J.kH(c,new A.n1(a,b,c,d,a.a6.giK(),a.a6.gQ7(),P.op(null,null,null,null)))},"$3","gnu",6,0,125],
 rJ:function(a,b,c,d){var z,y,x,w,v
-z=J.xR(a.dZ)
+z=a.a6.giK()
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
-if(!!J.x(d).$iswn){x=$.a3()
-if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
-this.l5(a,H.d(J.GL(b))+"__array")}if(!!J.x(c).$iswn){x=$.a3()
-if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
-w=c.gvp().w4(!1)
+if(!!J.x(d).$iswn){x=$.dn()
+if(x.Im(C.eI))x.Ny("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
+this.l5(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.dn()
+if(x.Im(C.eI))x.Ny("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
+w=c.gRT().w4(!1)
 x=w.Lj
-w.pN=x.cR(new A.xf(a,d,y))
-w.o7=P.VH(P.AY(),x)
-w.Bd=x.Al(P.v3())
-x=H.d(J.GL(b))+"__array"
-v=a.Sa
-if(v==null){v=P.L5(null,null,null,J.O,P.MO)
-a.Sa=v}v.u(0,x,w)}},
-l5:function(a,b){var z=a.Sa.Rz(0,b)
+x.toString
+w.pN=new A.V1(a,d,y)
+w.o7=P.VH(P.vD(),x)
+w.Bd=P.v3()
+x=H.d(b)+"__array"
+v=a.nh
+if(v==null){v=P.L5(null,null,null,P.qU,P.MO)
+a.nh=v}v.u(0,x,w)}},
+l5:function(a,b){var z=a.nh.Rz(0,b)
 if(z==null)return!1
 z.ed()
 return!0},
-C0:function(a){var z=a.Sa
+C0:function(a){var z=a.nh
 if(z==null)return
-for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)z.lo.ed()
-a.Sa.V1(0)
-a.Sa=null},
+for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)z.lo.ed()
+a.nh.V1(0)
+a.nh=null},
 Uc:function(a){var z,y
-z=J.yxg(a.dZ)
+z=a.a6.gPS()
 if(z.gl0(z))return
-y=$.SS()
-if(y.Im(C.R5))y.J4("["+H.d(this.gqn(a))+"] addHostListeners: "+z.bu(0))
-this.UH(a,a,z.gvc(),this.gD4(a))},
+y=$.Uk()
+if(y.Im(C.eI))y.Ny("["+H.d(this.gqn(a))+"] addHostListeners: "+z.bu(0))
+this.UH(a,a,z.gvc(),this.gay(a))},
 UH:function(a,b,c,d){var z,y,x,w,v,u,t
 for(z=c.Fb,z=H.VM(new P.N6(z,z.zN,null,null),[H.Kp(c,0)]),z.zq=z.Fb.H9,y=J.RE(b);z.G();){x=z.fD
 w=y.gI(b).t(0,x)
 v=w.Ph
 u=w.Sg
-t=new W.Ov(0,w.uv,v,W.aF(d),u)
+t=new W.fd(0,w.bi,v,W.aF(d),u)
 t.$builtinTypeInfo=[H.Kp(w,0)]
-w=t.u7
-if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},
+w=t.G9
+if(w!=null&&t.VP<=0)J.cZ(t.bi,v,w,u)}},
 iw:[function(a,b){var z,y,x,w,v,u,t
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
-y=$.SS()
-x=y.Im(C.R5)
-if(x)y.J4(">>> ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")
-w=J.yxg(a.dZ)
+y=$.Uk()
+x=y.Im(C.eI)
+if(x)y.Ny(">>> ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")
+w=a.a6.gPS()
 v=z.gt5(b)
-u=J.UQ($.QX(),v)
+u=J.UQ($.pT(),v)
 t=w.t(0,u!=null?u:v)
-if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,497,325,[]],
-ea:function(a,b,c,d){var z,y
-z=$.SS()
-y=z.Im(C.R5)
-if(y)z.J4(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
-if(!!J.x(c).$isEH)H.im(c,d,P.Te(null))
-else if(typeof c==="string")A.HR(b,new H.GD(H.u1(c)),d)
-else z.j2("invalid callback")
+if(t!=null){if(x)y.Ny("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
+this.ea(a,a,t,[b,!!z.$iseC?z.gey(b):null,a])}if(x)y.Ny("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gay",2,0,126,60],
+ea:function(a,b,c,d){var z,y,x,w
+z=$.Uk()
+y=z.Im(C.eI)
+if(y)z.Ny(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
+if(!!J.x(c).$isEH){x=X.aW(c)
+if(x===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
+C.Nm.sB(d,x)
+H.im(c,d,P.Te(null))}else if(typeof c==="string"){w=$.b7().d8.t(0,c)
+$.cp().Ck(b,w,d,!0,null)}else z.j2("invalid callback")
 if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},
-$iszs:true,
-$isTU:true,
+$isdM:true,
+$isvy:true,
 $isd3:true,
-$iscv:true,
-$isD0:true,
+$ish4:true,
+$isPZ:true,
 $isKV:true},
-WC:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z=J.Vs(this.a)
+Sv:{
+"^":"Xs:51;a",
+$2:function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).$0())
-z.t(0,a)},"$2",null,4,0,null,12,[],30,[],"call"],
+z.t(0,a)},
 $isEH:true},
 Xi:{
-"^":"Tp:115;b",
-$0:[function(){return this.b},"$0",null,0,0,null,"call"],
+"^":"Xs:42;b",
+$0:function(){return this.b},
 $isEH:true},
 TV:{
-"^":"Tp:116;",
-$1:[function(a){var z=J.x(a)
-if(!!z.$iszs)z.oW(a)},"$1",null,2,0,null,211,[],"call"],
+"^":"Xs:10;",
+$1:function(a){var z=J.x(a)
+if(!!z.$isdM)z.oW(a)},
 $isEH:true},
-Mq:{
-"^":"Tp:116;",
-$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"$1",null,2,0,null,273,[],"call"],
-$isEH:true},
-Oa:{
-"^":"Tp:115;a",
-$0:[function(){return new A.bS(this.a.jL,null)},"$0",null,0,0,null,"call"],
+YC:{
+"^":"Xs:10;",
+$1:function(a){return J.D9(!!J.x(a).$isvy?a:M.Ky(a))},
 $isEH:true},
 n1:{
-"^":"Tp:300;b,c,d,e",
-$2:[function(a,b){var z,y,x
-z=this.e
-if(z!=null&&z.x4(a))J.Jr(this.b,a)
+"^":"Xs:51;a,b,c,d,e,f,UI",
+$2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.d
-if(z==null)return
-y=z.t(0,a)
-if(y!=null){z=this.b
-x=J.RE(b)
-J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"$2",null,4,0,null,12,[],498,[],"call"],
+if(typeof a!=="number")return H.s(a)
+y=2*a+1
+if(y>>>0!==y||y>=z.length)return H.e(z,y)
+x=z[y]
+y=this.f
+if(y!=null&&y.x4(x))J.Ip(this.a,x)
+y=this.e
+if(y==null)return
+w=y.t(0,x)
+if(w==null)return
+for(y=J.mY(w),v=this.b,u=J.U6(v),t=this.a,s=J.RE(t),r=this.c,q=this.UI;y.G();){p=y.gl()
+if(!q.h(0,p))continue
+o=u.t(v,a)
+s.rJ(t,x,o,b)
+$.cp().Ck(t,p,[b,o,v,r,z],!0,null)}},"$2",null,4,0,null,127,35,"call"],
 $isEH:true},
-xf:{
-"^":"Tp:116;a,b,c",
-$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,496,[],"call"],
+V1:{
+"^":"Xs:10;a,b,c",
+$1:[function(a){var z,y,x,w
+for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
+$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,128,"call"],
 $isEH:true},
 L6:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z,y,x
-z=$.SS()
-if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
+"^":"Xs:132;a,b",
+$3:[function(a,b,c){var z,y,x
+z=$.Uk()
+if(z.Im(C.eI))z.Ny("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
 y=J.ZZ(this.b,3)
-x=C.FS.t(0,y)
+x=C.SP.t(0,y)
 if(x!=null)y=x
-z=J.f5(b).t(0,y)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"$2",null,4,0,null,292,[],273,[],"call"],
-$isEH:true},
-Rs:{
-"^":"Tp:116;c,d,e",
-$1:[function(a){var z,y,x,w,v,u
-z=this.e
-y=A.z9(z)
-x=J.x(y)
-if(!x.$iszs)return
-w=this.c
-if(0>=w.length)return H.e(w,0)
-if(w[0]==="@"){v=this.d
-u=L.Sk(v,C.xB.yn(w,1),null)
-w=u.gP(u)}else v=y
-u=J.x(a)
-x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"$1",null,2,0,null,325,[],"call"],
-$isEH:true},
-uJ:{
-"^":"Tp:116;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,499,[],"call"],
-$isEH:true},
-hm:{
-"^":"Tp:116;",
-$1:[function(a){var z,y,x,w
-z=W.vD(document.querySelectorAll(".polymer-veiled"),null)
-for(y=z.gA(z);y.G();){x=J.pP(y.lo)
-w=J.w1(x)
-w.h(x,"polymer-unveil")
-w.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
-y.gtH(y).ml(new A.Ji(z))}},"$1",null,2,0,null,117,[],"call"],
-$isEH:true},
-Ji:{
-"^":"Tp:116;a",
-$1:[function(a){var z
-for(z=this.a,z=z.gA(z);z.G();)J.V1(J.pP(z.lo),"polymer-unveil")},"$1",null,2,0,null,117,[],"call"],
+return new A.zI(b,y,a,this.a,null)},"$3",null,6,0,null,129,130,131,"call"],
 $isEH:true},
 Bf:{
-"^":"TR;I6,iU,Jq,dY,qP,ZY,xS,PB,eS,ay",
-cO:function(a){if(this.qP==null)return
-this.Jq.ed()
-X.TR.prototype.cO.call(this,this)},
-EC:function(a){this.dY=a
-this.I6.tu(this.iU,2,[a],C.CM)
-H.vn(a)},
-td:[function(a){var z,y,x,w
-for(z=J.GP(a),y=this.iU;z.G();){x=z.gl()
-if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
+"^":"Ap;I6,iU,uv,Jq,dY",
+AB:[function(a){this.dY=a
+$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,17,36],
+ho:[function(a){var z,y,x,w,v
+for(z=J.mY(a),y=this.iU;z.G();){x=z.gl()
+if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
+w=$.cp().Gu.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
-if(z==null?w!=null:z!==w)J.ta(this.xS,w)
-return}}},"$1","giz",2,0,500,265,[]],
-bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
-xc:{
-"^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-oX:function(a){this.Pa(a)},
-static:{G7:function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.Iv.ZL(a)
-C.Iv.oX(a)
+if(z==null?v!=null:z!==v)J.Fc(this.uv,v)
+return}}},"$1","gXQ",2,0,133,122],
+TR:function(a,b){return J.mu(this.uv,b)},
+gP:function(a){return J.Vm(this.uv)},
+sP:function(a,b){J.Fc(this.uv,b)
+return b},
+xO:function(a){var z=this.Jq
+if(z!=null){z.ed()
+this.Jq=null}J.yd(this.uv)}},
+ir:{
+"^":"qo;AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+XI:function(a){this.Pa(a)},
+static:{oaJ:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.Ki.ZL(a)
+C.Ki.XI(a)
 return a}}},
 jpR:{
-"^":["qE+zs;KM:X0=-306",function(){return[C.Nw]}],
-$iszs:true,
-$isTU:true,
+"^":"Bo+dM;",
+$isdM:true,
+$isvy:true,
 $isd3:true,
-$iscv:true,
-$isD0:true,
+$ish4:true,
+$isPZ:true,
 $isKV:true},
-Ot:{
+qo:{
 "^":"jpR+Pi;",
 $isd3:true},
-bS:{
-"^":"a;jL>,zZ*",
-$isbS:true},
-HJ:{
-"^":"e9;nF"},
+N9:{
+"^":"uN;jw",
+pm:function(a,b,c){if(J.co(b,"on-"))return A.pf(a,b,c)
+return T.uN.prototype.pm.call(this,a,b,c)}},
+zI:{
+"^":"Ap;v3,pB,U1,ED,Jq",
+zU:[function(a){var z,y,x,w,v,u
+z=this.v3
+y=A.tT(z)
+x=J.x(y)
+if(!x.$isdM)return
+w=this.ED
+if(C.xB.nC(w,"@")){v=this.U1
+w=L.hk(C.xB.yn(w,1)).Tl(v)}else v=y
+u=J.x(a)
+x.ea(y,v,w,[a,!!u.$iseC?u.gey(a):null,z])},"$1","gwi",2,0,10,60],
+gP:function(a){return},
+TR:function(a,b){var z=J.PB(this.v3).t(0,this.pB)
+z=H.VM(new W.fd(0,z.bi,z.Ph,W.aF(this.gwi()),z.Sg),[H.Kp(z,0)])
+z.Zz()
+this.Jq=z},
+xO:function(a){var z
+if(this.Jq!=null){z=$.Uk()
+if(z.Im(C.eI))z.Ny("event.remove: ["+H.d(this.v3)+"]."+H.d(this.pB)+" => ["+H.d(this.U1)+"]."+this.ED+"())")
+this.Jq.ed()
+this.Jq=null}},
+static:{tT:function(a){var z
+for(;z=J.RE(a),z.gBy(a)!=null;)a=z.gBy(a)
+return $.c7().t(0,a)}}},
 S0:{
-"^":"a;M3,ih",
-Ws:function(){return this.M3.$0()},
+"^":"a;jd,ih",
+Ws:function(){return this.jd.$0()},
 TP:function(a){var z=this.ih
 if(z!=null){z.ed()
 this.ih=null}},
 tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"$0","gv6",0,0,126]},
-V3:{
-"^":"a;ns",
-$isV3:true},
-rD:{
-"^":"Tp:116;",
-$1:[function(a){var z=$.mC().MM
+this.Ws()}},"$0","gv6",0,0,15]},
+hp:{
+"^":"Xs:42;",
+$0:[function(){var z=$.mC().MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(null)
-return},"$1",null,2,0,null,117,[],"call"],
+return},"$0",null,0,0,null,"call"],
 $isEH:true},
-Fn:{
-"^":"Tp:116;",
-$1:[function(a){return!!J.x(a).$isRS},"$1",null,2,0,null,501,[],"call"],
+k2:{
+"^":"Xs:136;a,b",
+$3:[function(a,b,c){var z,y,x
+z=$.Ej().t(0,b)
+if(z!=null){y=$.RA().t(0,c)
+x=this.a
+x.toString
+return P.T8(x,null,x,new A.v4(a,b,z,y))}return this.b.qP([b,c],a)},"$3",null,6,0,null,134,34,135,"call"],
 $isEH:true},
-e3:{
-"^":"Tp:116;",
-$1:[function(a){return!!J.x(a).$isMs},"$1",null,2,0,null,501,[],"call"],
-$isEH:true},
-pM:{
-"^":"Tp:116;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,499,[],"call"],
-$isEH:true},
-Mh:{
-"^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
+v4:{
+"^":"Xs:42;c,d,e,f",
+$0:function(){var z,y,x,w,v,u
+z=this.d
+y=this.e
+x=this.f
+w=P.Fl(null,null)
+v=new A.XP(this.c,y,x,z,null,null,null,null,null,null,w,null)
+v.Zw(x)
+u=v.Q7
+if(u!=null)v.NF=v.Yl(u)
+v.rH()
+v.I7()
+$.RA().u(0,z,v)
+v.Vk()
+v.W3(w)
+v.Mi()
+v.f6()
+v.OL()
+A.h6(v.J3(v.kO("global"),"global"),document.head)
+v.FU()
+w=v.gZf()
+A.YG(w,z,x!=null?J.O6(x):null)
+if($.yQ().n6(y,C.MT))$.cp().Ck(y,C.MT,[v],!1,null)
+v.Ba(z)
+return},
+$isEH:true}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
 "^":"",
-Zh:[function(a,b,c){var z,y,x
-z=J.UQ($.CT(),J.Ba(c))
+Zh:function(a,b,c){var z,y,x
+z=$.QL().t(0,c)
 if(z!=null)return z.$2(a,b)
-try{y=C.xr.kV(J.JA(a,"'","\""))
+try{y=C.zc.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
-return a}},"$3","jo",6,0,null,30,[],284,[],11,[]],
-W6:{
-"^":"Tp:115;",
-$0:[function(){var z=P.L5(null,null,null,null,null)
-z.u(0,C.AZ,new Z.Lf())
-z.u(0,C.ok,new Z.fT())
-z.u(0,C.N4,new Z.pp())
-z.u(0,C.Kc,new Z.nl())
-z.u(0,C.PC,new Z.ik())
-z.u(0,C.md,new Z.LfS())
-return z},"$0",null,0,0,null,"call"],
+return a}},
+Md:{
+"^":"Xs:51;",
+$2:function(a,b){return a},
 $isEH:true},
-Lf:{
-"^":"Tp:300;",
-$2:[function(a,b){return a},"$2",null,4,0,null,28,[],117,[],"call"],
+lP:{
+"^":"Xs:51;",
+$2:function(a,b){return a},
+$isEH:true},
+Uf:{
+"^":"Xs:51;",
+$2:function(a,b){var z,y
+try{z=P.zu(a)
+return z}catch(y){H.Ru(y)
+return b}},
+$isEH:true},
+Ra:{
+"^":"Xs:51;",
+$2:function(a,b){return!J.xC(a,"false")},
+$isEH:true},
+wJY:{
+"^":"Xs:51;",
+$2:function(a,b){return H.BU(a,null,new Z.fT(b))},
 $isEH:true},
 fT:{
-"^":"Tp:300;",
-$2:[function(a,b){return a},"$2",null,4,0,null,28,[],117,[],"call"],
+"^":"Xs:10;a",
+$1:function(a){return this.a},
 $isEH:true},
-pp:{
-"^":"Tp:300;",
-$2:[function(a,b){var z,y
-try{z=P.Gl(a)
-return z}catch(y){H.Ru(y)
-return b}},"$2",null,4,0,null,28,[],502,[],"call"],
+zOQ:{
+"^":"Xs:51;",
+$2:function(a,b){return H.RR(a,new Z.Lf(b))},
 $isEH:true},
-nl:{
-"^":"Tp:300;",
-$2:[function(a,b){return!J.de(a,"false")},"$2",null,4,0,null,28,[],117,[],"call"],
-$isEH:true},
-ik:{
-"^":"Tp:300;",
-$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,28,[],502,[],"call"],
-$isEH:true},
-mf:{
-"^":"Tp:116;a",
-$1:[function(a){return this.a},"$1",null,2,0,null,117,[],"call"],
-$isEH:true},
-LfS:{
-"^":"Tp:300;",
-$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,28,[],502,[],"call"],
-$isEH:true},
-HK:{
-"^":"Tp:116;b",
-$1:[function(a){return this.b},"$1",null,2,0,null,117,[],"call"],
+Lf:{
+"^":"Xs:10;b",
+$1:function(a){return this.b},
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
-ul:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.Vk(a.gvc(),new T.o8(a)).zV(0," ")
-else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","qP",2,0,206,122,[]],
-PX:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.kl(a.gvc(),new T.ex(a)).zV(0,";")
-else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Fx",2,0,206,122,[]],
-o8:{
-"^":"Tp:116;a",
-$1:[function(a){return J.de(this.a.t(0,a),!0)},"$1",null,2,0,null,376,[],"call"],
+dA:[function(a){var z=J.x(a)
+if(!!z.$isZ0)z=J.Vk(a.gvc(),new T.o8f(a)).zV(0," ")
+else z=!!z.$iscX?z.zV(a," "):a
+return z},"$1","T4",2,0,27],
+qN:[function(a){var z=J.x(a)
+if(!!z.$isZ0)z=J.kl(a.gvc(),new T.GL(a)).zV(0,";")
+else z=!!z.$iscX?z.zV(a,";"):a
+return z},"$1","xe",2,0,27],
+o8f:{
+"^":"Xs:10;a",
+$1:function(a){return J.xC(this.a.t(0,a),!0)},
 $isEH:true},
-ex:{
-"^":"Tp:116;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,376,[],"call"],
+GL:{
+"^":"Xs:10;a",
+$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,137,"call"],
 $isEH:true},
-e9:{
-"^":"T4p;",
-op:[function(a,b,c){var z,y,x
-if(a==null)return
-z=new Y.hc(H.VM([],[Y.Pn]),P.p9(""),new P.WU(a,0,0,null),null)
-y=new U.tc()
+uN:{
+"^":"VE;",
+pm:function(a,b,c){var z,y,x
+z=new Y.pa(H.VM([],[Y.qS]),P.p9(""),new P.WU(a,0,0,null),null)
+y=new U.Fs()
 y=new T.FX(y,z,null,null)
-z=z.zl()
-y.qM=z
-y.fL=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
-y.w5()
-x=y.o9()
+z=z.rD()
+y.mV=z
+y.vi=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
+y.Bp()
+x=y.Te()
 if(M.wR(c)){z=J.x(b)
-z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
+z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isWH}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"$3","gca",6,0,503,274,[],12,[],273,[]],
+return new T.H1(this,b,x)},
 CE:function(a){return new T.uK(this)}},
-Xy:{
-"^":"Tp:300;a,b,c",
-$2:[function(a,b){var z
-if(!J.x(a).$isz6){z=this.a.nF
-a=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}z=!!J.x(b).$iscv
-if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
-if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"$2",null,4,0,null,292,[],273,[],"call"],
+H1:{
+"^":"Xs:132;a,b,c",
+$3:[function(a,b,c){var z,y
+if(!J.x(a).$isGK)a=K.xV(a,this.a.jw)
+z=!!J.x(b).$ish4
+y=z&&J.xC(this.b,"class")?T.T4():null
+if(z&&J.xC(this.b,"style"))y=T.xe()
+if(c===!0)return T.rD(this.c,a,y)
+return new T.tI(a,y,this.c,null,null,null)},"$3",null,6,0,null,129,130,131,"call"],
 $isEH:true},
 uK:{
-"^":"Tp:116;a",
-$1:[function(a){var z
-if(!!J.x(a).$isz6)z=a
-else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}return z},"$1",null,2,0,null,292,[],"call"],
+"^":"Xs:10;a",
+$1:[function(a){return!!J.x(a).$isGK?a:K.xV(a,this.a.jw)},"$1",null,2,0,null,129,"call"],
 $isEH:true},
-mY:{
-"^":"Pi;a9,Cu,uI,Y7,AP,fn",
-u0:function(a){return this.uI.$1(a)},
-KX:[function(a){var z,y
-z=this.Y7
-if(!!J.x(a).$isfk){y=J.OS(J.kl(a.bm,new T.mB(this,a)),!1)
-this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"$1","gUG",2,0,116,122,[]],
-gP:[function(a){return this.Y7},null,null,1,0,115,"value",308],
-sP:[function(a,b){var z,y,x
-try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
-if(!!J.x(x).$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,116,122,[],"value",308],
-yB:function(a,b,c){var z,y,x,w
-y=this.Cu
-y.gju().yI(this.gUG()).fm(0,new T.GX(this))
-try{J.UK(y,new K.Ed(this.a9))
-y.gLl()
-this.KX(y.gLl())}catch(x){w=H.Ru(x)
-if(!!J.x(w).$isB0){z=w
-$.eH().j2("Error evaluating expression '"+H.d(y)+"': "+J.z2(z))}else throw x}},
-static:{FL:function(a,b,c){var z=new T.mY(b,a.RR(0,new K.G1(b,P.NZ(null,null))),c,null,null,null)
-z.yB(a,b,c)
-return z}}},
-GX:{
-"^":"Tp:116;a",
-$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"$1",null,2,0,null,21,[],"call"],
+tI:{
+"^":"Ap;a9,uI,lV,Nl,DY,ZR",
+Co:function(a){return this.Nl.$1(a)},
+lY:[function(a){var z,y
+z=this.ZR
+y=T.r6(a,this.a9,this.uI)
+this.ZR=y
+if(this.Nl!=null&&!J.xC(z,y))this.Co(this.ZR)},"$1","gR5",2,0,10,138],
+gP:function(a){if(this.Nl!=null)return this.ZR
+return T.rD(this.lV,this.a9,this.uI)},
+sP:function(a,b){var z,y,x,w,v
+try{w=this.a9
+z=K.jX(this.lV,b,w)
+this.ZR=T.r6(z,w,this.uI)}catch(v){w=H.Ru(v)
+y=w
+x=new H.oP(v,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.lV)+"': "+H.d(y),x)}},
+TR:function(a,b){var z,y,x,w,v,u,t
+if(this.Nl!=null)throw H.b(P.w("already open"))
+this.Nl=b
+w=this.lV
+v=this.a9
+u=H.VM(new P.Sw(null,0,0,0),[null])
+u.Eo(null,null)
+z=J.okV(w,new K.XZ(v,u))
+this.lV=z
+u=z.glr().yI(this.gR5())
+u.fm(0,new T.Tg(z))
+this.DY=u
+try{w=z
+J.okV(w,new K.Ed(v))
+w.gK3()
+this.ZR=T.r6(z.gK3(),v,this.uI)}catch(t){w=H.Ru(t)
+y=w
+x=new H.oP(t,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(z)+"': "+H.d(y),x)}return this.ZR},
+xO:function(a){if(this.Nl==null)return
+this.DY.ed()
+this.DY=null
+this.lV=H.Go(this.lV,"$isdE").KL
+this.Nl=null},
+static:{rD:function(a,b,c){var z,y,x,w
+try{x=T.r6(K.Cw(a,b),b,c)
+return x}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(z),y)}return},r6:function(a,b,c){if(!!J.x(a).$isfk)return J.OS(J.kl(a.bm,new T.bI(a,b)),!1)
+else return c==null?a:c.$1(a)}}},
+bI:{
+"^":"Xs:10;a,b",
+$1:[function(a){var z=this.a.xG
+if(J.xC(z,"this"))H.vh(K.xn("'this' cannot be used as a variable name."))
+return new K.ig(this.b,z,a)},"$1",null,2,0,null,127,"call"],
 $isEH:true},
-mB:{
-"^":"Tp:116;a,b",
-$1:[function(a){var z=P.L5(null,null,null,null,null)
-z.u(0,this.b.F5,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"$1",null,2,0,null,334,[],"call"],
+Tg:{
+"^":"Xs:51;a",
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a)+"': "+H.d(a),b)},"$2",null,4,0,null,1,120,"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
-XF:{
-"^":"xh;vq,L1,AP,fn",
-vb:function(a,b){this.vq.yI(new B.bX(b,this))},
-$asxh:function(a){return[null]},
-static:{z4:function(a,b){var z=H.VM(new B.XF(a,null,null,null),[b])
+De:{
+"^":"Sk;vq,u1,AP,fn",
+vb:function(a,b){this.vq.yI(new B.iH(b,this))},
+$asSk:function(a){return[null]},
+static:{z4:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
-bX:{
-"^":"Tp;a,b",
+iH:{
+"^":"Xs;a,b",
 $1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"$1",null,2,0,null,334,[],"call"],
+z.u1=F.Wi(z,C.YI,z.u1,a)},"$1",null,2,0,null,127,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"CV",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
+$signature:function(){return H.IG(function(a){return{func:"WM",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
-OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
-J.UK(z,new K.Ed(b))
-return z.gLv()},"$2","tk",4,0,null,285,[],278,[]],
-jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+Cw:function(a,b){var z,y
+z=new P.Sw(null,0,0,0)
+z.$builtinTypeInfo=[null]
+z.Eo(null,null)
+y=J.okV(a,new K.XZ(b,z))
+J.okV(y,new K.Ed(b))
+return y.gfC()},
+jX:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
 y=new K.c4(z)
 x=H.VM([],[U.hw])
-for(;w=z.a,v=J.x(w),!!v.$isuk;){if(!J.de(v.gkp(w),"|"))break
+for(;w=z.a,v=J.x(w),!!v.$isMp;){if(!J.xC(v.gxS(w),"|"))break
 x.push(v.gT8(w))
 z.a=v.gBb(w)}w=z.a
 v=J.x(w)
-if(!!v.$isw6){u=v.gP(w)
-t=C.OL
+if(!!v.$iselO){u=v.gP(w)
+t=C.x4
 s=!1}else if(!!v.$iszX){if(!J.x(w.gJn()).$isno)y.$0()
 t=z.a.ghP()
 u=J.Vm(z.a.gJn())
 s=!0}else{if(!!v.$isx9){t=w.ghP()
 u=J.O6(z.a)}else if(!!v.$isJy){t=w.ghP()
-if(J.vF(z.a)!=null){if(z.a.gre()!=null)y.$0()
-u=J.vF(z.a)}else{y.$0()
+if(J.I1(z.a)!=null){if(z.a.gre()!=null)y.$0()
+u=J.I1(z.a)}else{y.$0()
 u=null}}else{y.$0()
 t=null
 u=null}s=!1}for(z=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);z.G();){r=z.lo
-q=J.UK(r,new K.G1(c,P.NZ(null,null)))
-J.UK(q,new K.Ed(c))
-q.gLv()
-throw H.b(K.kG("filter must implement Transformer: "+H.d(r)))}p=K.OH(t,c)
-if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
+y=new P.Sw(null,0,0,0)
+y.$builtinTypeInfo=[null]
+y.Eo(null,null)
+q=J.okV(r,new K.XZ(c,y))
+J.okV(q,new K.Ed(c))
+q.gfC()
+throw H.b(K.xn("filter must implement Transformer: "+H.d(r)))}p=K.Cw(t,c)
+if(p==null)throw H.b(K.xn("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
-else{H.vn(p).tu(new H.GD(H.u1(u)),2,[b],C.CM)
-H.vn(b)}},"$3","wA",6,0,null,285,[],30,[],278,[]],
-ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
-return a},"$1","W1",2,0,null,122,[]],
-Uf:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.WB(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
-wJY:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.xH(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
-zOQ:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.vX(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
-W6o:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.FW(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
-MdQ:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.de(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
-YJG:{
-"^":"Tp:300;",
-$2:[function(a,b){return!J.de(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
-DOe:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.z8(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
+else{z=$.b7().d8.t(0,u)
+$.cp().Cq(p,z,b)}return b},
+xV:function(a,b){var z,y,x
+z=new K.nk(a)
+if(b==null)y=z
+else{y=P.L5(null,null,null,P.qU,P.a)
+y.FV(0,b)
+x=new K.Ph(z,y)
+if(y.x4("this"))H.vh(K.xn("'this' cannot be used as a variable name."))
+y=x}return y},
 lPa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.J5(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
+"^":"Xs:51;",
+$2:function(a,b){return J.ew(a,b)},
 $isEH:true},
 Ufa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.u6(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
+"^":"Xs:51;",
+$2:function(a,b){return J.Hn(a,b)},
 $isEH:true},
 Raa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.Bl(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
+"^":"Xs:51;",
+$2:function(a,b){return J.vX(a,b)},
 $isEH:true},
 w0:{
-"^":"Tp:300;",
-$2:[function(a,b){return a===!0||b===!0},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
-w4:{
-"^":"Tp:300;",
-$2:[function(a,b){return a===!0&&b===!0},"$2",null,4,0,null,118,[],199,[],"call"],
+"^":"Xs:51;",
+$2:function(a,b){return J.L9(a,b)},
 $isEH:true},
 w5:{
-"^":"Tp:300;",
-$2:[function(a,b){var z=H.Og(P.a)
-z=H.KT(z,[z]).BD(b)
-if(z)return b.$1(a)
-throw H.b(K.kG("Filters must be a one-argument function."))},"$2",null,4,0,null,118,[],128,[],"call"],
-$isEH:true},
-w7:{
-"^":"Tp:116;",
-$1:[function(a){return a},"$1",null,2,0,null,118,[],"call"],
+"^":"Xs:51;",
+$2:function(a,b){return J.xC(a,b)},
 $isEH:true},
 w10:{
-"^":"Tp:116;",
-$1:[function(a){return J.Z7(a)},"$1",null,2,0,null,118,[],"call"],
+"^":"Xs:51;",
+$2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
 w11:{
-"^":"Tp:116;",
-$1:[function(a){return a!==!0},"$1",null,2,0,null,118,[],"call"],
+"^":"Xs:51;",
+$2:function(a,b){return J.z8(a,b)},
+$isEH:true},
+w12:{
+"^":"Xs:51;",
+$2:function(a,b){return J.J5(a,b)},
+$isEH:true},
+w13:{
+"^":"Xs:51;",
+$2:function(a,b){return J.u6(a,b)},
+$isEH:true},
+w14:{
+"^":"Xs:51;",
+$2:function(a,b){return J.Bl(a,b)},
+$isEH:true},
+w15:{
+"^":"Xs:51;",
+$2:function(a,b){return a===!0||b===!0},
+$isEH:true},
+w16:{
+"^":"Xs:51;",
+$2:function(a,b){return a===!0&&b===!0},
+$isEH:true},
+w17:{
+"^":"Xs:51;",
+$2:function(a,b){var z=H.Og(P.a)
+z=H.KT(z,[z]).BD(b)
+if(z)return b.$1(a)
+throw H.b(K.xn("Filters must be a one-argument function."))},
+$isEH:true},
+w18:{
+"^":"Xs:10;",
+$1:function(a){return a},
+$isEH:true},
+w19:{
+"^":"Xs:10;",
+$1:function(a){return J.jz(a)},
+$isEH:true},
+w20:{
+"^":"Xs:10;",
+$1:function(a){return a!==!0},
 $isEH:true},
 c4:{
-"^":"Tp:115;a",
-$0:[function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
+"^":"Xs:42;a",
+$0:function(){return H.vh(K.xn("Expression is not assignable: "+H.d(this.a.a)))},
 $isEH:true},
-z6:{
-"^":"a;eT>,k8<,bq,G9",
-gCH:function(){var z=this.G9
-if(z!=null)return z
-z=H.vn(this.k8)
-this.G9=z
-return z},
-t:function(a,b){var z,y,x,w
-if(J.de(b,"this"))return this.k8
-else{z=this.bq.Zp
-if(z.x4(b))return K.ci(z.t(0,b))
-else if(this.k8!=null){y=new H.GD(H.u1(b))
-x=Z.y1(H.jO(J.bB(this.gCH().Ax).LU),y)
-z=J.x(x)
-if(!z.$isRY)w=!!z.$isRS&&x.glT()
-else w=!0
-if(w)return K.ci(this.gCH().rN(y).gAx())
-else if(!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
-if(z!=null)return K.ci(z.t(0,b))
-else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},
-tI:function(a){var z
-if(J.de(a,"this"))return
-else{z=this.bq
-if(z.Zp.x4(a))return z
-else{z=H.u1(a)
-if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return this.k8}}z=this.eT
-if(z!=null)return z.tI(a)},
-tg:function(a,b){var z
-if(this.bq.Zp.x4(b))return!0
-else{z=H.u1(b)
-if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return!0}z=this.eT
-if(z!=null)return z.tg(0,b)
-return!1},
-$isz6:true},
-Ay:{
-"^":"a;bO?,Lv<",
-gju:function(){var z=this.k6
+GK:{
+"^":"a;",
+u:function(a,b,c){throw H.b(P.f("[]= is not supported in Scope."))},
+$isGK:true,
+$isCo:true,
+$asCo:function(){return[P.qU,P.a]}},
+nk:{
+"^":"GK;ku<",
+t:function(a,b){var z,y
+if(J.xC(b,"this"))return this.ku
+z=$.b7().d8.t(0,b)
+y=this.ku
+if(y==null||z==null)throw H.b(K.xn("variable '"+H.d(b)+"' not found"))
+y=$.cp().jD(y,z)
+return!!J.x(y).$iscb?B.z4(y,null):y},
+AC:function(a){return!J.xC(a,"this")}},
+ig:{
+"^":"GK;eT>,Z0,P>",
+gku:function(){return this.eT.gku()},
+t:function(a,b){var z
+if(J.xC(this.Z0,b)){z=this.P
+return!!J.x(z).$iscb?B.z4(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)}},
+Ph:{
+"^":"GK;eT>,Z3<",
+gku:function(){return this.eT.ku},
+t:function(a,b){var z=this.Z3
+if(z.x4(b)){z=z.t(0,b)
+return!!J.x(z).$iscb?B.z4(z,null):z}return this.eT.t(0,b)},
+AC:function(a){if(this.Z3.x4(a))return!1
+return!J.xC(a,"this")}},
+dE:{
+"^":"a;Lf?,fC<",
+glr:function(){var z=this.k6
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gLl:function(){return this.Lv},
-eC:function(a){return this.Qh(a)},
+gK3:function(){return this.fC},
 Qh:function(a){},
-DX:function(a){var z
-this.yc(0,a)
-z=this.bO
-if(z!=null)z.DX(a)},
-yc:function(a,b){var z,y,x
+l8:function(a){var z
+this.OJ(a)
+z=this.Lf
+if(z!=null)z.l8(a)},
+OJ:function(a){var z,y,x
 z=this.tj
 if(z!=null){z.ed()
-this.tj=null}y=this.Lv
-this.Qh(b)
-z=this.Lv
+this.tj=null}y=this.fC
+this.Qh(a)
+z=this.fC
 if(z==null?y!=null:z!==y){x=this.k6
 if(x.Gv>=4)H.vh(x.q7())
 x.Iv(z)}},
 bu:function(a){return this.KL.bu(0)},
+$isdE:true,
 $ishw:true},
 Ed:{
-"^":"d2;Jd",
-xn:function(a){a.yc(0,this.Jd)},
-ky:function(a){J.UK(a.gT8(a),this)
-a.yc(0,this.Jd)}},
-G1:{
-"^":"fr;Jd,ZGj",
-W9:function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},
+"^":"cfS;qu",
+xn:function(a){a.OJ(this.qu)},
+ky:function(a){J.okV(a.gT8(a),this)
+a.OJ(this.qu)}},
+XZ:{
+"^":"Jg;qu,lk",
+W9:function(a){return new K.uD(a,null,null,null,P.bK(null,null,!1,null))},
 LT:function(a){return a.wz.RR(0,this)},
-co:function(a){var z,y
-z=J.UK(a.ghP(),this)
+T7:function(a){var z,y
+z=J.okV(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(y)
+z.sLf(y)
 return y},
 CU:function(a){var z,y,x
-z=J.UK(a.ghP(),this)
-y=J.UK(a.gJn(),this)
+z=J.okV(a.ghP(),this)
+y=J.okV(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(x)
-y.sbO(x)
+z.sLf(x)
+y.sLf(x)
 return x},
-ZR:function(a){var z,y,x,w,v
-z=J.UK(a.ghP(),this)
-y=a.gre()
-if(y==null)x=null
-else{w=this.gnG()
-y.toString
-x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(v)
-if(x!=null)H.bQ(x,new K.Os(v))
+og:function(a){var z,y,x,w,v
+z=J.okV(a.ghP(),this)
+if(a.gre()==null)y=null
+else{x=a.gre()
+w=this.gnG()
+x.toString
+y=H.VM(new H.lJ(x,w),[null,null]).tt(0,!1)}v=new K.xJ(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sLf(v)
+if(y!=null)H.bQ(y,new K.o4(v))
 return v},
-ti:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
+oD:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
+Zh:function(a){var z,y
+z=H.VM(new H.lJ(a.ghL(),this.gnG()),[null,null]).tt(0,!1)
+y=new K.kL(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.gPu(a),this.gnG()),[null,null]).tt(0,!1)
+z=H.VM(new H.lJ(a.gRl(a),this.gnG()),[null,null]).tt(0,!1)
 y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.B8(y))
 return y},
 YV:function(a){var z,y,x
-z=J.UK(a.gG3(a),this)
-y=J.UK(a.gv4(),this)
+z=J.okV(a.gG3(a),this)
+y=J.okV(a.gv4(),this)
 x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(x)
-y.sbO(x)
+z.sLf(x)
+y.sLf(x)
 return x},
 qv:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
-im:function(a){var z,y,x
-z=J.UK(a.gBb(a),this)
-y=J.UK(a.gT8(a),this)
+ex:function(a){var z,y,x
+z=J.okV(a.gBb(a),this)
+y=J.okV(a.gT8(a),this)
 x=new K.iv(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(x)
-y.sbO(x)
+z.sLf(x)
+y.sLf(x)
 return x},
 Hx:function(a){var z,y
-z=J.UK(a.gwz(),this)
+z=J.okV(a.gwz(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(y)
+z.sLf(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)
+w=new K.dD(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
+z.sLf(w)
+y.sLf(w)
+x.sLf(w)
+return w},
 ky:function(a){var z,y,x
-z=J.UK(a.gBb(a),this)
-y=J.UK(a.gT8(a),this)
+z=J.okV(a.gBb(a),this)
+y=J.okV(a.gT8(a),this)
 x=new K.VA(z,y,a,null,null,null,P.bK(null,null,!1,null))
-y.sbO(x)
+y.sLf(x)
 return x}},
-Os:{
-"^":"Tp:116;a",
-$1:[function(a){var z=this.a
-a.sbO(z)
-return z},"$1",null,2,0,null,118,[],"call"],
+o4:{
+"^":"Xs:10;a",
+$1:function(a){var z=this.a
+a.sLf(z)
+return z},
+$isEH:true},
+XV:{
+"^":"Xs:10;a",
+$1:function(a){var z=this.a
+a.sLf(z)
+return z},
 $isEH:true},
 B8:{
-"^":"Tp:116;a",
-$1:[function(a){var z=this.a
-a.sbO(z)
-return z},"$1",null,2,0,null,21,[],"call"],
+"^":"Xs:10;a",
+$1:function(a){var z=this.a
+a.sLf(z)
+return z},
 $isEH:true},
-Wh:{
-"^":"Ay;KL,bO,tj,Lv,k6",
-Qh:function(a){this.Lv=a.gk8()},
+uD:{
+"^":"dE;KL,Lf,tj,fC,k6",
+Qh:function(a){this.fC=a.gku()},
 RR:function(a,b){return b.W9(this)},
-$asAy:function(){return[U.EZ]},
-$isEZ:true,
+$asdE:function(){return[U.WH]},
+$isWH:true,
 $ishw:true},
-x5:{
-"^":"Ay;KL,bO,tj,Lv,k6",
+z0:{
+"^":"dE;KL,Lf,tj,fC,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
 Qh:function(a){var z=this.KL
-this.Lv=z.gP(z)},
-RR:function(a,b){return b.ti(this)},
-$asAy:function(){return[U.no]},
+this.fC=z.gP(z)},
+RR:function(a,b){return b.oD(this)},
+$asdE:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
 $ishw:true},
-ev:{
-"^":"Ay;Pu>,KL,bO,tj,Lv,k6",
-Qh:function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},
-RR:function(a,b){return b.o0(this)},
-$asAy:function(){return[U.kB]},
-$iskB:true,
+kL:{
+"^":"dE;hL<,KL,Lf,tj,fC,k6",
+Qh:function(a){this.fC=H.VM(new H.lJ(this.hL,new K.Hv()),[null,null]).tt(0,!1)},
+RR:function(a,b){return b.Zh(this)},
+$asdE:function(){return[U.c0]},
+$isc0:true,
 $ishw:true},
-ID:{
-"^":"Tp:300;",
-$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"$2",null,4,0,null,202,[],21,[],"call"],
+Hv:{
+"^":"Xs:10;",
+$1:[function(a){return a.gfC()},"$1",null,2,0,null,127,"call"],
+$isEH:true},
+ev:{
+"^":"dE;Rl>,KL,Lf,tj,fC,k6",
+Qh:function(a){this.fC=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Xv())},
+RR:function(a,b){return b.o0(this)},
+$asdE:function(){return[U.Mm]},
+$isMm:true,
+$ishw:true},
+Xv:{
+"^":"Xs:51;",
+$2:function(a,b){J.kW(a,J.Kt(b).gfC(),b.gv4().gfC())
+return a},
 $isEH:true},
 qR:{
-"^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
+"^":"dE;G3>,v4<,KL,Lf,tj,fC,k6",
 RR:function(a,b){return b.YV(this)},
-$asAy:function(){return[U.wk]},
-$iswk:true,
+$asdE:function(){return[U.ae]},
+$isae:true,
 $ishw:true},
 ek:{
-"^":"Ay;KL,bO,tj,Lv,k6",
+"^":"dE;KL,Lf,tj,fC,k6",
 gP:function(a){var z=this.KL
 return z.gP(z)},
-Qh:function(a){var z,y,x
+Qh:function(a){var z,y,x,w
 z=this.KL
-this.Lv=J.UQ(a,z.gP(z))
-y=a.tI(z.gP(z))
+this.fC=a.t(0,z.gP(z))
+if(!a.AC(z.gP(z)))return
+y=a.gku()
 x=J.x(y)
-if(!!x.$isd3){z=H.u1(z.gP(z))
-this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},
+if(!x.$isd3)return
+z=z.gP(z)
+w=$.b7().d8.t(0,z)
+this.tj=x.gqh(y).yI(new K.OC(this,a,w))},
 RR:function(a,b){return b.qv(this)},
-$asAy:function(){return[U.w6]},
-$isw6:true,
+$asdE:function(){return[U.elO]},
+$iselO:true,
 $ishw:true},
-Qv:{
-"^":"Tp:116;a,b,c",
-$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
+OC:{
+"^":"Xs:10;a,b,c",
+$1:[function(a){if(J.pb(a,new K.av(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,128,"call"],
 $isEH:true},
-Xm:{
-"^":"Tp:116;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+av:{
+"^":"Xs:10;d",
+$1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 mv:{
-"^":"Ay;wz<,KL,bO,tj,Lv,k6",
-gkp:function(a){var z=this.KL
-return z.gkp(z)},
+"^":"dE;wz<,KL,Lf,tj,fC,k6",
+gxS:function(a){var z=this.KL
+return z.gxS(z)},
 Qh:function(a){var z,y
 z=this.KL
-y=$.ww().t(0,z.gkp(z))
-if(J.de(z.gkp(z),"!")){z=this.wz.gLv()
-this.Lv=y.$1(z==null?!1:z)}else{z=this.wz
-this.Lv=z.gLv()==null?null:y.$1(z.gLv())}},
+y=$.qL().t(0,z.gxS(z))
+if(J.xC(z.gxS(z),"!")){z=this.wz.gfC()
+this.fC=y.$1(z==null?!1:z)}else{z=this.wz
+this.fC=z.gfC()==null?null:y.$1(z.gfC())}},
 RR:function(a,b){return b.Hx(this)},
-$asAy:function(){return[U.jK]},
-$isjK:true,
+$asdE:function(){return[U.cJ]},
+$iscJ:true,
 $ishw:true},
 iv:{
-"^":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
-gkp:function(a){var z=this.KL
-return z.gkp(z)},
+"^":"dE;Bb>,T8>,KL,Lf,tj,fC,k6",
+gxS:function(a){var z=this.KL
+return z.gxS(z)},
 Qh:function(a){var z,y,x
 z=this.KL
-y=$.Ra().t(0,z.gkp(z))
-if(J.de(z.gkp(z),"&&")||J.de(z.gkp(z),"||")){z=this.Bb.gLv()
+y=$.Jl().t(0,z.gxS(z))
+if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gfC()
 if(z==null)z=!1
-x=this.T8.gLv()
-this.Lv=y.$2(z,x==null?!1:x)}else if(J.de(z.gkp(z),"==")||J.de(z.gkp(z),"!="))this.Lv=y.$2(this.Bb.gLv(),this.T8.gLv())
+x=this.T8.gfC()
+this.fC=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.fC=y.$2(this.Bb.gfC(),this.T8.gfC())
 else{x=this.Bb
-if(x.gLv()==null||this.T8.gLv()==null)this.Lv=null
-else{if(J.de(z.gkp(z),"|")&&!!J.x(x.gLv()).$iswn)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
-this.Lv=y.$2(x.gLv(),this.T8.gLv())}}},
-RR:function(a,b){return b.im(this)},
-$asAy:function(){return[U.uk]},
-$isuk:true,
+if(x.gfC()==null||this.T8.gfC()==null)this.fC=null
+else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gfC()).$iswn)this.tj=H.Go(x.gfC(),"$iswn").gRT().yI(new K.P8(this,a))
+this.fC=y.$2(x.gfC(),this.T8.gfC())}}},
+RR:function(a,b){return b.ex(this)},
+$asdE:function(){return[U.Mp]},
+$isMp:true,
 $ishw:true},
-uA:{
-"^":"Tp:116;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,117,[],"call"],
+P8:{
+"^":"Xs:10;a,b",
+$1:[function(a){return this.a.l8(this.b)},"$1",null,2,0,null,11,"call"],
 $isEH:true},
+dD:{
+"^":"dE;dc<,Sl<,ru<,KL,Lf,tj,fC,k6",
+Qh:function(a){var z=this.dc.gfC()
+this.fC=(z==null?!1:z)===!0?this.Sl.gfC():this.ru.gfC()},
+RR:function(a,b){return b.RD(this)},
+$asdE:function(){return[U.x0]},
+$isx0:true,
+$ishw:true},
 vl:{
-"^":"Ay;hP<,KL,bO,tj,Lv,k6",
+"^":"dE;hP<,KL,Lf,tj,fC,k6",
 goc:function(a){var z=this.KL
 return z.goc(z)},
-Qh:function(a){var z,y,x,w
-z=this.hP.gLv()
-if(z==null){this.Lv=null
-return}y=H.vn(z)
-x=this.KL
-w=new H.GD(H.u1(x.goc(x)))
-this.Lv=y.rN(w).gAx()
-x=J.x(z)
-if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.Li(this,a,w))},
-RR:function(a,b){return b.co(this)},
-$asAy:function(){return[U.x9]},
+Qh:function(a){var z,y,x
+z=this.hP.gfC()
+if(z==null){this.fC=null
+return}y=this.KL
+y=y.goc(y)
+x=$.b7().d8.t(0,y)
+this.fC=$.cp().jD(z,x)
+y=J.x(z)
+if(!!y.$isd3)this.tj=y.gqh(z).yI(new K.Zu(this,a,x))},
+RR:function(a,b){return b.T7(this)},
+$asdE:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
-Li:{
-"^":"Tp:116;a,b,c",
-$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
+Zu:{
+"^":"Xs:10;a,b,c",
+$1:[function(a){if(J.pb(a,new K.WKb(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,128,"call"],
 $isEH:true},
-WK:{
-"^":"Tp:116;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+WKb:{
+"^":"Xs:10;d",
+$1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 iT:{
-"^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
+"^":"dE;hP<,Jn<,KL,Lf,tj,fC,k6",
 Qh:function(a){var z,y,x
-z=this.hP.gLv()
-if(z==null){this.Lv=null
-return}y=this.Jn.gLv()
+z=this.hP.gfC()
+if(z==null){this.fC=null
+return}y=this.Jn.gfC()
 x=J.U6(z)
-this.Lv=x.t(z,y)
-if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},
+this.fC=x.t(z,y)
+if(!!x.$isd3)this.tj=x.gqh(z).yI(new K.tE(this,a,y))},
 RR:function(a,b){return b.CU(this)},
-$asAy:function(){return[U.zX]},
+$asdE:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
 tE:{
-"^":"Tp:116;a,b,c",
-$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
+"^":"Xs:10;a,b,c",
+$1:[function(a){if(J.pb(a,new K.ey(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,128,"call"],
 $isEH:true},
 ey:{
-"^":"Tp:116;d",
-$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Xs:10;d",
+$1:function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.d)},
 $isEH:true},
-fa:{
-"^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
-gbP:function(a){var z=this.KL
-return z.gbP(z)},
-Qh:function(a){var z,y,x,w,v
+xJ:{
+"^":"dE;hP<,re<,KL,Lf,tj,fC,k6",
+gSf:function(a){var z=this.KL
+return z.gSf(z)},
+Qh:function(a){var z,y,x,w
 z=this.re
 z.toString
-y=H.VM(new H.A8(z,new K.WW()),[null,null]).br(0)
-x=this.hP.gLv()
-if(x==null){this.Lv=null
+y=H.VM(new H.lJ(z,new K.WW()),[null,null]).br(0)
+x=this.hP.gfC()
+if(x==null){this.fC=null
 return}z=this.KL
-if(z.gbP(z)==null)this.Lv=K.ci(!!J.x(x).$iswL?x.lR.F2(x.ex,y,null).Ax:H.im(x,y,P.Te(null)))
-else{w=H.vn(x)
-v=new H.GD(H.u1(z.gbP(z)))
-this.Lv=w.F2(v,y,null).Ax
+if(z.gSf(z)==null){z=H.im(x,y,P.Te(null))
+this.fC=!!J.x(z).$iscb?B.z4(z,null):z}else{z=z.gSf(z)
+w=$.b7().d8.t(0,z)
+this.fC=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
-if(!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,v))}},
-RR:function(a,b){return b.ZR(this)},
-$asAy:function(){return[U.Jy]},
+if(!!z.$isd3)this.tj=z.gqh(x).yI(new K.vQ(this,a,w))}},
+RR:function(a,b){return b.og(this)},
+$asdE:function(){return[U.Jy]},
 $isJy:true,
 $ishw:true},
 WW:{
-"^":"Tp:116;",
-$1:[function(a){return a.gLv()},"$1",null,2,0,null,118,[],"call"],
+"^":"Xs:10;",
+$1:[function(a){return a.gfC()},"$1",null,2,0,null,24,"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:491;a,b,c",
-$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
+"^":"Xs:139;a,b,c",
+$1:[function(a){if(J.pb(a,new K.ho(this.c))===!0)this.a.l8(this.b)},"$1",null,2,0,null,128,"call"],
 $isEH:true},
-a9:{
-"^":"Tp:116;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+ho:{
+"^":"Xs:10;d",
+$1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 VA:{
-"^":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
+"^":"dE;Bb>,T8>,KL,Lf,tj,fC,k6",
 Qh:function(a){var z,y,x,w
 z=this.Bb
-y=this.T8.gLv()
+y=this.T8.gfC()
 x=J.x(y)
-if(!x.$isQV&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
-if(!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
+if(!x.$iscX&&y!=null)throw H.b(K.xn("right side of 'in' is not an iterator"))
+if(!!x.$iswn)this.tj=y.gRT().yI(new K.OF(this,a))
 x=J.Vm(z)
 w=y!=null?y:C.xD
-this.Lv=new K.fk(x,w)},
+this.fC=new K.fk(x,w)},
 RR:function(a,b){return b.ky(this)},
-$asAy:function(){return[U.X7]},
-$isX7:true,
+$asdE:function(){return[U.Cu]},
+$isCu:true,
 $ishw:true},
-J1:{
-"^":"Tp:116;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,117,[],"call"],
+OF:{
+"^":"Xs:10;a,b",
+$1:[function(a){return this.a.l8(this.b)},"$1",null,2,0,null,11,"call"],
 $isEH:true},
 fk:{
-"^":"a;F5,bm",
+"^":"a;xG,bm",
 $isfk:true},
-wL:{
-"^":"a:116;lR,ex",
-$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"$1","gKu",2,0,null,504,[]],
-$iswL:true,
-$isEH:true},
-B0:{
+nD:{
 "^":"a;G1>",
 bu:function(a){return"EvalException: "+this.G1},
-$isB0:true,
-static:{kG:function(a){return new K.B0(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
+static:{xn:function(a){return new K.nD(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
 "^":"",
-Pu:[function(a,b){var z,y
+Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
 if(a==null||b==null)return!1
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},"$2","xV",4,0,null,118,[],199,[]],
-au:[function(a){a.toString
-return U.xk(H.n3(a,0,new U.xs()))},"$1","bT",2,0,null,286,[]],
-Zm:[function(a,b){var z=J.WB(a,b)
+if(!J.xC(y,b[z]))return!1}return!0},
+b1:function(a){a.toString
+return U.OT(H.n3(a,0,new U.xs()))},
+Zd:function(a,b){var z=J.ew(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","uN",4,0,null,238,[],30,[]],
-xk:[function(a){if(typeof a!=="number")return H.s(a)
+return a^a>>>6},
+OT:function(a){if(typeof a!=="number")return H.s(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},"$1","Zy",2,0,null,238,[]],
-tc:{
+return 536870911&a+((16383&a)<<15>>>0)},
+Fs:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,505,21,[],118,[]],
-F2:function(a,b,c){return new U.Jy(a,b,c)}},
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,140,1,24]},
 hw:{
 "^":"a;",
 $ishw:true},
-EZ:{
+WH:{
 "^":"hw;",
 RR:function(a,b){return b.W9(this)},
-$isEZ:true},
+$isWH:true},
 no:{
 "^":"hw;P>",
-RR:function(a,b){return b.ti(this)},
+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)},
 n:function(a,b){var z
 if(b==null)return!1
 z=H.RB(b,"$isno",[H.Kp(this,0)],"$asno")
-return z&&J.de(J.Vm(b),this.P)},
+return z&&J.xC(J.Vm(b),this.P)},
 giO:function(a){return J.v1(this.P)},
 $isno:true},
-kB:{
-"^":"hw;Pu>",
+c0:{
+"^":"hw;hL<",
+RR:function(a,b){return b.Zh(this)},
+bu:function(a){return H.d(this.hL)},
+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.b1(this.hL)},
+$isc0:true},
+Mm:{
+"^":"hw;Rl>",
 RR:function(a,b){return b.o0(this)},
-bu:function(a){return"{"+H.d(this.Pu)+"}"},
+bu:function(a){return"{"+H.d(this.Rl)+"}"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},
-giO:function(a){return U.au(this.Pu)},
-$iskB:true},
-wk:{
+return!!z.$isMm&&U.Pu(z.gRl(b),this.Rl)},
+giO:function(a){return U.b1(this.Rl)},
+$isMm:true},
+ae:{
 "^":"hw;G3>,v4<",
 RR:function(a,b){return b.YV(this)},
 bu:function(a){return this.G3.bu(0)+": "+H.d(this.v4)},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$iswk&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},
+return!!z.$isae&&J.xC(z.gG3(b),this.G3)&&J.xC(b.gv4(),this.v4)},
 giO:function(a){var z,y
 z=J.v1(this.G3.P)
 y=J.v1(this.v4)
-return U.xk(U.Zm(U.Zm(0,z),y))},
-$iswk:true},
-XC:{
+return U.OT(U.Zd(U.Zd(0,z),y))},
+$isae:true},
+Iq:{
 "^":"hw;wz",
 RR:function(a,b){return b.LT(this)},
 bu:function(a){return"("+H.d(this.wz)+")"},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isXC&&J.de(b.wz,this.wz)},
+return!!J.x(b).$isIq&&J.xC(b.wz,this.wz)},
 giO:function(a){return J.v1(this.wz)},
-$isXC:true},
-w6:{
+$isIq:true},
+elO:{
 "^":"hw;P>",
 RR:function(a,b){return b.qv(this)},
 bu:function(a){return this.P},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isw6&&J.de(z.gP(b),this.P)},
+return!!z.$iselO&&J.xC(z.gP(b),this.P)},
 giO:function(a){return J.v1(this.P)},
-$isw6:true},
-jK:{
-"^":"hw;kp>,wz<",
+$iselO:true},
+cJ:{
+"^":"hw;xS>,wz<",
 RR:function(a,b){return b.Hx(this)},
-bu:function(a){return H.d(this.kp)+" "+H.d(this.wz)},
+bu:function(a){return H.d(this.xS)+" "+H.d(this.wz)},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},
+return!!z.$iscJ&&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.xk(U.Zm(U.Zm(0,z),y))},
-$isjK:true},
-uk:{
-"^":"hw;kp>,Bb>,T8>",
-RR:function(a,b){return b.im(this)},
-bu:function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},
+return U.OT(U.Zd(U.Zd(0,z),y))},
+$iscJ:true},
+Mp:{
+"^":"hw;xS>,Bb>,T8>",
+RR:function(a,b){return b.ex(this)},
+bu:function(a){return"("+H.d(this.Bb)+" "+H.d(this.xS)+" "+H.d(this.T8)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(z.gBb(b),this.Bb)&&J.de(z.gT8(b),this.T8)},
+return!!z.$isMp&&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.xk(U.Zm(U.Zm(U.Zm(0,z),y),x))},
-$isuk:true},
-X7:{
+return U.OT(U.Zd(U.Zd(U.Zd(0,z),y),x))},
+$isMp:true},
+x0:{
+"^":"hw;dc<,Sl<,ru<",
+RR:function(a,b){return b.RD(this)},
+bu:function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.ru)+")"},
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isx0&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
+giO:function(a){var z,y,x
+z=J.v1(this.dc)
+y=J.v1(this.Sl)
+x=J.v1(this.ru)
+return U.OT(U.Zd(U.Zd(U.Zd(0,z),y),x))},
+$isx0:true},
+Cu:{
 "^":"hw;Bb>,T8>",
 RR:function(a,b){return b.ky(this)},
 bu:function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isX7&&J.de(z.gBb(b),this.Bb)&&J.de(z.gT8(b),this.T8)},
+return!!z.$isCu&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
 giO:function(a){var z,y
 z=this.Bb
 z=z.giO(z)
 y=J.v1(this.T8)
-return U.xk(U.Zm(U.Zm(0,z),y))},
-$isX7:true},
+return U.OT(U.Zd(U.Zd(0,z),y))},
+$isCu:true},
 zX:{
 "^":"hw;hP<,Jn<",
 RR:function(a,b){return b.CU(this)},
 bu:function(a){return H.d(this.hP)+"["+H.d(this.Jn)+"]"},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},
+return!!J.x(b).$iszX&&J.xC(b.ghP(),this.hP)&&J.xC(b.gJn(),this.Jn)},
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.Jn)
-return U.xk(U.Zm(U.Zm(0,z),y))},
+return U.OT(U.Zd(U.Zd(0,z),y))},
 $iszX:true},
 x9:{
 "^":"hw;hP<,oc>",
-RR:function(a,b){return b.co(this)},
+RR:function(a,b){return b.T7(this)},
 bu:function(a){return H.d(this.hP)+"."+H.d(this.oc)},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},
+return!!z.$isx9&&J.xC(b.ghP(),this.hP)&&J.xC(z.goc(b),this.oc)},
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.oc)
-return U.xk(U.Zm(U.Zm(0,z),y))},
+return U.OT(U.Zd(U.Zd(0,z),y))},
 $isx9:true},
 Jy:{
-"^":"hw;hP<,bP>,re<",
-RR:function(a,b){return b.ZR(this)},
-bu:function(a){return H.d(this.hP)+"."+H.d(this.bP)+"("+H.d(this.re)+")"},
+"^":"hw;hP<,Sf>,re<",
+RR:function(a,b){return b.og(this)},
+bu:function(a){return H.d(this.hP)+"."+H.d(this.Sf)+"("+H.d(this.re)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},
+return!!z.$isJy&&J.xC(b.ghP(),this.hP)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
 giO:function(a){var z,y,x
 z=J.v1(this.hP)
-y=J.v1(this.bP)
-x=U.au(this.re)
-return U.xk(U.Zm(U.Zm(U.Zm(0,z),y),x))},
+y=J.v1(this.Sf)
+x=U.b1(this.re)
+return U.OT(U.Zd(U.Zd(U.Zd(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:300;",
-$2:[function(a,b){return U.Zm(a,J.v1(b))},"$2",null,4,0,null,506,[],507,[],"call"],
+"^":"Xs:51;",
+$2:function(a,b){return U.Zd(a,J.v1(b))},
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
-"^":"a;Sk,GP,qM,fL",
-glQ:function(){return this.fL.lo},
-XJ:function(a,b){var z
-if(!(a!=null&&!J.de(J.Iz(this.fL.lo),a)))z=b!=null&&!J.de(J.Vm(this.fL.lo),b)
+"^":"a;rp,AO,mV,vi",
+gQi:function(){return this.vi.lo},
+zM:function(a,b){var z
+if(a!=null){z=this.vi.lo
+z=z==null||!J.xC(J.Iz(z),a)}else z=!1
+if(!z)if(b!=null){z=this.vi.lo
+z=z==null||!J.xC(J.Vm(z),b)}else z=!1
 else z=!0
-if(z)throw H.b(Y.RV("Expected "+H.d(b)+": "+H.d(this.glQ())))
-this.fL.G()},
-w5:function(){return this.XJ(null,null)},
-o9:function(){if(this.fL.lo==null){this.Sk.toString
-return C.OL}var z=this.WT()
-return z==null?null:this.BH(z,0)},
-BH:function(a,b){var z,y,x,w
-for(;z=this.fL.lo,z!=null;)if(J.de(J.Iz(z),9))if(J.de(J.Vm(this.fL.lo),"(")){y=this.qj()
-this.Sk.toString
-a=new U.Jy(a,null,y)}else if(J.de(J.Vm(this.fL.lo),"[")){x=this.eY()
-this.Sk.toString
+if(z)throw H.b(Y.RV("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gQi())))
+this.vi.G()},
+Bp:function(){return this.zM(null,null)},
+GI:function(a){return this.zM(a,null)},
+Te:function(){if(this.vi.lo==null){this.rp.toString
+return C.x4}var z=this.Yq()
+return z==null?null:this.FH(z,0)},
+FH:function(a,b){var z,y,x,w,v,u
+for(;z=this.vi.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.vi.lo),"(")){y=this.GN()
+this.rp.toString
+a=new U.Jy(a,null,y)}else if(J.xC(J.Vm(this.vi.lo),"[")){x=this.Ew()
+this.rp.toString
 a=new U.zX(a,x)}else break
-else if(J.de(J.Iz(this.fL.lo),3)){this.w5()
-a=this.qL(a,this.WT())}else if(J.de(J.Iz(this.fL.lo),10)&&J.de(J.Vm(this.fL.lo),"in")){if(!J.x(a).$isw6)H.vh(Y.RV("in... statements must start with an identifier"))
-this.w5()
-w=this.o9()
-this.Sk.toString
-a=new U.X7(a,w)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
-else break
-return a},
-qL:function(a,b){var z,y
+else if(J.xC(J.Iz(this.vi.lo),3)){this.Bp()
+a=this.j6(a,this.Yq())}else if(J.xC(J.Iz(this.vi.lo),10)&&J.xC(J.Vm(this.vi.lo),"in")){if(!J.x(a).$iselO)H.vh(Y.RV("in... statements must start with an identifier"))
+this.Bp()
+w=this.Te()
+this.rp.toString
+a=new U.Cu(a,w)}else{if(J.xC(J.Iz(this.vi.lo),8)){z=this.vi.lo.gP9()
+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.vi.lo),"?")){this.zM(8,"?")
+v=this.Te()
+this.GI(5)
+u=this.Te()
+this.rp.toString
+a=new U.x0(a,v,u)}else a=this.ZJ(a)
+else break}return a},
+j6:function(a,b){var z,y
 z=J.x(b)
-if(!!z.$isw6){z=z.gP(b)
-this.Sk.toString
-return new U.x9(a,z)}else if(!!z.$isJy&&!!J.x(b.ghP()).$isw6){z=J.Vm(b.ghP())
+if(!!z.$iselO){z=z.gP(b)
+this.rp.toString
+return new U.x9(a,z)}else if(!!z.$isJy&&!!J.x(b.ghP()).$iselO){z=J.Vm(b.ghP())
 y=b.gre()
-this.Sk.toString
+this.rp.toString
 return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
-Tw:function(a){var z,y,x
-z=this.fL.lo
-this.w5()
-y=this.WT()
-while(!0){x=this.fL.lo
-if(x!=null)x=(J.de(J.Iz(x),8)||J.de(J.Iz(this.fL.lo),3)||J.de(J.Iz(this.fL.lo),9))&&J.z8(this.fL.lo.gG8(),z.gG8())
+ZJ:function(a){var z,y,x,w
+z=this.vi.lo
+this.Bp()
+y=this.Yq()
+while(!0){x=this.vi.lo
+if(x!=null)if(J.xC(J.Iz(x),8)||J.xC(J.Iz(this.vi.lo),3)||J.xC(J.Iz(this.vi.lo),9)){x=this.vi.lo.gP9()
+w=z.gP9()
+if(typeof x!=="number")return x.D()
+if(typeof w!=="number")return H.s(w)
+w=x>w
+x=w}else x=!1
 else x=!1
 if(!x)break
-y=this.BH(y,this.fL.lo.gG8())}x=J.Vm(z)
-this.Sk.toString
-return new U.uk(x,a,y)},
-WT:function(){var z,y,x,w
-if(J.de(J.Iz(this.fL.lo),8)){z=J.Vm(this.fL.lo)
+y=this.FH(y,this.vi.lo.gP9())}x=J.Vm(z)
+this.rp.toString
+return new U.Mp(x,a,y)},
+Yq:function(){var z,y,x,w
+if(J.xC(J.Iz(this.vi.lo),8)){z=J.Vm(this.vi.lo)
 y=J.x(z)
-if(y.n(z,"+")||y.n(z,"-")){this.w5()
-if(J.de(J.Iz(this.fL.lo),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.fL.lo)),null,null)
-this.Sk.toString
+if(y.n(z,"+")||y.n(z,"-")){this.Bp()
+if(J.xC(J.Iz(this.vi.lo),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.vi.lo)),null,null)
+this.rp.toString
 z=new U.no(y)
 z.$builtinTypeInfo=[null]
-this.w5()
-return z}else{y=this.Sk
-if(J.de(J.Iz(this.fL.lo),7)){x=H.IH(H.d(z)+H.d(J.Vm(this.fL.lo)),null)
+this.Bp()
+return z}else{y=this.rp
+if(J.xC(J.Iz(this.vi.lo),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.vi.lo)),null)
 y.toString
 z=new U.no(x)
 z.$builtinTypeInfo=[null]
-this.w5()
-return z}else{w=this.BH(this.Ai(),11)
+this.Bp()
+return z}else{w=this.FH(this.yL(),11)
 y.toString
-return new U.jK(z,w)}}}else if(y.n(z,"!")){this.w5()
-w=this.BH(this.Ai(),11)
-this.Sk.toString
-return new U.jK(z,w)}}return this.Ai()},
-Ai:function(){var z,y,x
-switch(J.Iz(this.fL.lo)){case 10:z=J.Vm(this.fL.lo)
+return new U.cJ(z,w)}}}else if(y.n(z,"!")){this.Bp()
+w=this.FH(this.yL(),11)
+this.rp.toString
+return new U.cJ(z,w)}}return this.yL()},
+yL:function(){var z,y,x
+switch(J.Iz(this.vi.lo)){case 10:z=J.Vm(this.vi.lo)
 y=J.x(z)
-if(y.n(z,"this")){this.w5()
-this.Sk.toString
-return new U.w6("this")}else if(y.n(z,"in"))return
+if(y.n(z,"this")){this.Bp()
+this.rp.toString
+return new U.elO("this")}else if(y.n(z,"in"))return
 throw H.b(P.u("unrecognized keyword: "+H.d(z)))
-case 2:return this.Cy()
-case 1:return this.qF()
-case 6:return this.Ud()
-case 7:return this.tw()
-case 9:if(J.de(J.Vm(this.fL.lo),"(")){this.w5()
-x=this.o9()
-this.XJ(9,")")
-this.Sk.toString
-return new U.XC(x)}else if(J.de(J.Vm(this.fL.lo),"{"))return this.Wc()
+case 2:return this.qK()
+case 1:return this.ef()
+case 6:return this.DS()
+case 7:return this.ot()
+case 9:if(J.xC(J.Vm(this.vi.lo),"(")){this.Bp()
+x=this.Te()
+this.zM(9,")")
+this.rp.toString
+return new U.Iq(x)}else if(J.xC(J.Vm(this.vi.lo),"{"))return this.pH()
+else if(J.xC(J.Vm(this.vi.lo),"["))return this.S9()
 return
+case 5:throw H.b(P.u("unexpected token \":\""))
 default:return}},
-Wc:function(){var z,y,x
+S9:function(){var z,y
 z=[]
-do{this.w5()
-if(J.de(J.Iz(this.fL.lo),9)&&J.de(J.Vm(this.fL.lo),"}"))break
-y=J.Vm(this.fL.lo)
-this.Sk.toString
+do{this.Bp()
+if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"]"))break
+z.push(this.Te())
+y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
+this.zM(9,"]")
+return new U.c0(z)},
+pH:function(){var z,y,x
+z=[]
+do{this.Bp()
+if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"}"))break
+y=J.Vm(this.vi.lo)
+this.rp.toString
 x=new U.no(y)
 x.$builtinTypeInfo=[null]
-this.w5()
-this.XJ(5,":")
-z.push(new U.wk(x,this.o9()))
-y=this.fL.lo}while(y!=null&&J.de(J.Vm(y),","))
-this.XJ(9,"}")
-return new U.kB(z)},
-Cy:function(){var z,y,x
-if(J.de(J.Vm(this.fL.lo),"true")){this.w5()
-this.Sk.toString
-return H.VM(new U.no(!0),[null])}if(J.de(J.Vm(this.fL.lo),"false")){this.w5()
-this.Sk.toString
-return H.VM(new U.no(!1),[null])}if(J.de(J.Vm(this.fL.lo),"null")){this.w5()
-this.Sk.toString
-return H.VM(new U.no(null),[null])}if(!J.de(J.Iz(this.fL.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.glQ())+".value"))
-z=J.Vm(this.fL.lo)
-this.w5()
-this.Sk.toString
-y=new U.w6(z)
-x=this.qj()
+this.Bp()
+this.zM(5,":")
+z.push(new U.ae(x,this.Te()))
+y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
+this.zM(9,"}")
+return new U.Mm(z)},
+qK:function(){var z,y,x
+if(J.xC(J.Vm(this.vi.lo),"true")){this.Bp()
+this.rp.toString
+return H.VM(new U.no(!0),[null])}if(J.xC(J.Vm(this.vi.lo),"false")){this.Bp()
+this.rp.toString
+return H.VM(new U.no(!1),[null])}if(J.xC(J.Vm(this.vi.lo),"null")){this.Bp()
+this.rp.toString
+return H.VM(new U.no(null),[null])}if(!J.xC(J.Iz(this.vi.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.gQi())+".value"))
+z=J.Vm(this.vi.lo)
+this.Bp()
+this.rp.toString
+y=new U.elO(z)
+x=this.GN()
 if(x==null)return y
 else return new U.Jy(y,null,x)},
-qj:function(){var z,y
-z=this.fL.lo
-if(z!=null&&J.de(J.Iz(z),9)&&J.de(J.Vm(this.fL.lo),"(")){y=[]
-do{this.w5()
-if(J.de(J.Iz(this.fL.lo),9)&&J.de(J.Vm(this.fL.lo),")"))break
-y.push(this.o9())
-z=this.fL.lo}while(z!=null&&J.de(J.Vm(z),","))
-this.XJ(9,")")
+GN:function(){var z,y
+z=this.vi.lo
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"(")){y=[]
+do{this.Bp()
+if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),")"))break
+y.push(this.Te())
+z=this.vi.lo}while(z!=null&&J.xC(J.Vm(z),","))
+this.zM(9,")")
 return y}return},
-eY:function(){var z,y
-z=this.fL.lo
-if(z!=null&&J.de(J.Iz(z),9)&&J.de(J.Vm(this.fL.lo),"[")){this.w5()
-y=this.o9()
-this.XJ(9,"]")
+Ew:function(){var z,y
+z=this.vi.lo
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"[")){this.Bp()
+y=this.Te()
+this.zM(9,"]")
 return y}return},
-qF:function(){var z,y
-z=J.Vm(this.fL.lo)
-this.Sk.toString
+ef:function(){var z,y
+z=J.Vm(this.vi.lo)
+this.rp.toString
 y=H.VM(new U.no(z),[null])
-this.w5()
+this.Bp()
 return y},
-pT0:function(a){var z,y
-z=H.BU(H.d(a)+H.d(J.Vm(this.fL.lo)),null,null)
-this.Sk.toString
+Nt:function(a){var z,y
+z=H.BU(H.d(a)+H.d(J.Vm(this.vi.lo)),null,null)
+this.rp.toString
 y=H.VM(new U.no(z),[null])
-this.w5()
+this.Bp()
 return y},
-Ud:function(){return this.pT0("")},
-yj:function(a){var z,y
-z=H.IH(H.d(a)+H.d(J.Vm(this.fL.lo)),null)
-this.Sk.toString
+DS:function(){return this.Nt("")},
+u3:function(a){var z,y
+z=H.RR(H.d(a)+H.d(J.Vm(this.vi.lo)),null)
+this.rp.toString
 y=H.VM(new U.no(z),[null])
-this.w5()
+this.Bp()
 return y},
-tw:function(){return this.yj("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+ot:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,287,127,[]],
-Ae:{
-"^":"a;vH>-326,P>-508",
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,116,99,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,487,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,312,"toString"],
-$isAe:true,
-"@":function(){return[C.Nw]},
-"<>":[3],
-static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.bU,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
-"+IndexedValue":[0],
+C7:[function(a){return H.VM(new K.Bt(a),[null])},"$1","yU",2,0,45,46],
+O1:{
+"^":"a;vH>,P>",
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isO1&&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)+")"},
+$isO1:true},
 Bt:{
-"^":"mW;ty",
-gA:function(a){var z=new K.vR(J.GP(this.ty),0,null)
+"^":"mW;F5",
+gA:function(a){var z=new K.kd(J.mY(this.F5),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.ty)},
-gl0:function(a){return J.FN(this.ty)},
+gB:function(a){return J.q8(this.F5)},
+gl0:function(a){return J.FN(this.F5)},
 grZ:function(a){var z,y
-z=this.ty
+z=this.F5
 y=J.U6(z)
-z=new K.Ae(J.xH(y.gB(z),1),y.grZ(z))
+z=new K.O1(J.Hn(y.gB(z),1),y.grZ(z))
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-Zv:function(a,b){var z=new K.Ae(b,J.i4(this.ty,b))
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-$asmW:function(a){return[[K.Ae,a]]},
-$asQV:function(a){return[[K.Ae,a]]}},
-vR:{
-"^":"AC;XY,vk,CK",
-gl:function(){return this.CK},
-G:function(){var z=this.XY
-if(z.G()){this.CK=H.VM(new K.Ae(this.vk++,z.gl()),[null])
-return!0}this.CK=null
+$asmW:function(a){return[[K.O1,a]]},
+$ascX:function(a){return[[K.O1,a]]}},
+kd:{
+"^":"AC;Tr,Mv,Ta",
+gl:function(){return this.Ta},
+G:function(){var z=this.Tr
+if(z.G()){this.Ta=H.VM(new K.O1(this.Mv++,z.gl()),[null])
+return!0}this.Ta=null
 return!1},
-$asAC:function(a){return[[K.Ae,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{
+$asAC:function(a){return[[K.O1,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
-y1:[function(a,b){var z,y,x
-if(a.gYK().nb.x4(b))return a.gYK().nb.t(0,b)
-z=a.gAY()
-if(z!=null&&!J.de(J.Ba(z),C.PU)){y=Z.y1(a.gAY(),b)
-if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return},"$2","rz",4,0,null,288,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
-"^":"",
-wX:[function(a){switch(a){case 102:return 12
+Ox:function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
 case 118:return 11
-default:return a}},"$1","uO",2,0,null,289,[]],
-Pn:{
-"^":"a;fY>,P>,G8<",
+default:return a}},
+qS:{
+"^":"a;fY>,P>,P9<",
 bu:function(a){return"("+this.fY+", '"+this.P+"')"},
-$isPn:true},
-hc:{
-"^":"a;MV,zy,jI,VQ",
-zl:function(){var z,y,x,w,v,u,t,s
+$isqS:true},
+pa:{
+"^":"a;MV,zy,jI,x0",
+rD:function(){var z,y,x,w,v,u,t,s
 z=this.jI
-this.VQ=z.G()?z.Wn:null
-for(y=this.MV;x=this.VQ,x!=null;)if(x===32||x===9||x===160)this.VQ=z.G()?z.Wn:null
-else if(x===34||x===39)this.DS()
+this.x0=z.G()?z.Wn:null
+for(y=this.MV;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()
 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()
 else if(48<=x&&x<=57)this.jj()
 else if(x===46){x=z.G()?z.Wn:null
-this.VQ=x
+this.x0=x
 if(typeof x!=="number")return H.s(x)
 if(48<=x&&x<=57)this.e1()
-else y.push(new Y.Pn(3,".",11))}else if(x===44){this.VQ=z.G()?z.Wn:null
-y.push(new Y.Pn(4,",",0))}else if(x===58){this.VQ=z.G()?z.Wn:null
-y.push(new Y.Pn(5,":",0))}else if(C.Nm.tg(C.xu,x)){v=this.VQ
+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.tg(C.bg,x)){v=this.x0
 x=z.G()?z.Wn:null
-this.VQ=x
-if(C.Nm.tg(C.xu,x)){x=this.VQ
+this.x0=x
+if(C.Nm.tg(C.bg,x)){x=this.x0
 u=H.eT([v,x])
-if(C.Nm.tg(C.u0,u)){this.VQ=z.G()?z.Wn:null
+if(C.Nm.tg(C.G8,u)){this.x0=z.G()?z.Wn:null
 t=u}else t=H.Lw(v)}else t=H.Lw(v)
-y.push(new Y.Pn(8,t,C.dj.t(0,t)))}else if(C.Nm.tg(C.iq,this.VQ)){s=H.Lw(this.VQ)
-y.push(new Y.Pn(9,s,C.dj.t(0,s)))
-this.VQ=z.G()?z.Wn:null}else this.VQ=z.G()?z.Wn:null}return y},
-DS:function(){var z,y,x,w
-z=this.VQ
+y.push(new Y.qS(8,t,C.Mk.t(0,t)))}else if(C.Nm.tg(C.iq,this.x0)){s=H.Lw(this.x0)
+y.push(new Y.qS(9,s,C.Mk.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
+z=this.x0
 y=this.jI
 x=y.G()?y.Wn:null
-this.VQ=x
+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
-this.VQ=x
+this.x0=x
 if(x==null)throw H.b(Y.RV("unterminated string"))
-x=H.Lw(Y.wX(x))
+x=H.Lw(Y.Ox(x))
 w.vM+=x}else{x=H.Lw(x)
 w.vM+=x}x=y.G()?y.Wn:null
-this.VQ=x}this.MV.push(new Y.Pn(1,w.vM,0))
+this.x0=x}this.MV.push(new Y.qS(1,w.vM,0))
 w.vM=""
-this.VQ=y.G()?y.Wn:null},
+this.x0=y.G()?y.Wn:null},
 zI:function(){var z,y,x,w,v
 z=this.jI
 y=this.zy
-while(!0){x=this.VQ
+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
 else w=!0
@@ -14267,372 +13560,367 @@
 if(!w)break
 x=H.Lw(x)
 y.vM+=x
-this.VQ=z.G()?z.Wn:null}v=y.vM
+this.x0=z.G()?z.Wn:null}v=y.vM
 z=this.MV
-if(C.Nm.tg(C.Qy,v))z.push(new Y.Pn(10,v,0))
-else z.push(new Y.Pn(2,v,0))
+if(C.Nm.tg(C.Cd,v))z.push(new Y.qS(10,v,0))
+else z.push(new Y.qS(2,v,0))
 y.vM=""},
 jj:function(){var z,y,x,w
 z=this.jI
 y=this.zy
-while(!0){x=this.VQ
+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.Lw(x)
 y.vM+=x
-this.VQ=z.G()?z.Wn:null}if(x===46){z=z.G()?z.Wn:null
-this.VQ=z
+this.x0=z.G()?z.Wn:null}if(x===46){z=z.G()?z.Wn:null
+this.x0=z
 if(typeof z!=="number")return H.s(z)
 if(48<=z&&z<=57)this.e1()
-else this.MV.push(new Y.Pn(3,".",11))}else{this.MV.push(new Y.Pn(6,y.vM,0))
+else this.MV.push(new Y.qS(3,".",11))}else{this.MV.push(new Y.qS(6,y.vM,0))
 y.vM=""}},
 e1:function(){var z,y,x,w
 z=this.zy
 z.KF(H.Lw(46))
 y=this.jI
-while(!0){x=this.VQ
+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.Lw(x)
 z.vM+=x
-this.VQ=y.G()?y.Wn:null}this.MV.push(new Y.Pn(7,z.vM,0))
+this.x0=y.G()?y.Wn:null}this.MV.push(new Y.qS(7,z.vM,0))
 z.vM=""}},
 hA:{
 "^":"a;G1>",
 bu:function(a){return"ParseException: "+this.G1},
 static:{RV:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
 "^":"",
-fr:{
+Jg:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,509,94,[]]},
-d2:{
-"^":"fr;",
-W9:function(a){return this.xn(a)},
+DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,141,120]},
+cfS:{
+"^":"Jg;",
+xn:function(a){},
+W9:function(a){this.xn(a)},
 LT:function(a){a.wz.RR(0,this)
 this.xn(a)},
-co:function(a){J.UK(a.ghP(),this)
+T7:function(a){J.okV(a.ghP(),this)
 this.xn(a)},
-CU:function(a){J.UK(a.ghP(),this)
-J.UK(a.gJn(),this)
+CU:function(a){J.okV(a.ghP(),this)
+J.okV(a.gJn(),this)
 this.xn(a)},
-ZR:function(a){var z
-J.UK(a.ghP(),this)
-z=a.gre()
-if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
+og:function(a){var z
+J.okV(a.ghP(),this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
-ti:function(a){return 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.Kp(z,0)]);z.G();)J.okV(z.lo,this)
+this.xn(a)},
 o0:function(a){var z
-for(z=a.gPu(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
+for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
-YV:function(a){J.UK(a.gG3(a),this)
-J.UK(a.gv4(),this)
+YV:function(a){J.okV(a.gG3(a),this)
+J.okV(a.gv4(),this)
 this.xn(a)},
-qv:function(a){return this.xn(a)},
-im:function(a){J.UK(a.gBb(a),this)
-J.UK(a.gT8(a),this)
+qv:function(a){this.xn(a)},
+ex:function(a){J.okV(a.gBb(a),this)
+J.okV(a.gT8(a),this)
 this.xn(a)},
-Hx:function(a){J.UK(a.gwz(),this)
+Hx:function(a){J.okV(a.gwz(),this)
 this.xn(a)},
-ky:function(a){J.UK(a.gBb(a),this)
-J.UK(a.gT8(a),this)
+RD:function(a){J.okV(a.gdc(),this)
+J.okV(a.gSl(),this)
+J.okV(a.gru(),this)
+this.xn(a)},
+ky:function(a){J.okV(a.gBb(a),this)
+J.okV(a.gT8(a),this)
 this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
-NQ:{
-"^":["V28;kW%-475,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-guw:[function(a){return a.kW},null,null,1,0,476,"app",308,311],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,477,30,[],"app",308],
-"@":function(){return[C.Is]},
-static:{Zo:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+qZ:{
+"^":"V30;GF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+giJ:function(a){return a.GF},
+siJ:function(a,b){a.GF=this.ct(a,C.j2,a.GF,b)},
+static:{RH:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.Cc.ZL(a)
-C.Cc.oX(a)
-return a},null,null,0,0,115,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[510],
-V28:{
+C.Cc.XI(a)
+return a}}},
+V30:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
 "^":"",
-SM:{
-"^":["V29;QV%-511,t7%-326,hX%-326,FZ%-304,Bs%-512,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.QV},null,null,1,0,513,"script",308,311],
-sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,514,30,[],"script",308],
-gBV:[function(a){return a.t7},null,null,1,0,487,"pos",308,311],
-sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,363,30,[],"pos",308],
-giX:[function(a){return a.hX},null,null,1,0,487,"endPos",308,311],
-siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,363,30,[],"endPos",308],
-gHp:[function(a){return a.FZ},null,null,1,0,307,"coverage",308,311],
-sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,310,30,[],"coverage",308],
-gSw:[function(a){return a.Bs},null,null,1,0,515,"lines",308,309],
-sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,516,30,[],"lines",308],
-rh:[function(a,b){this.VH(a)
-this.ct(a,C.wq,0,1)},"$1","grO",2,0,169,242,[],"scriptChanged"],
-Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,169,242,[],"posChanged"],
-OM:[function(a,b){this.ct(a,C.Cv,0,1)
-this.ct(a,C.wq,0,1)},"$1","gTA",2,0,116,242,[],"coverageChanged"],
-qEQ:[function(a,b){var z,y
-z=a.QV
+Uy:{
+"^":"V31;oX,GR,cI,FZ,Kf,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gIs:function(a){return a.oX},
+sIs:function(a,b){a.oX=this.ct(a,C.PX,a.oX,b)},
+gBV:function(a){return a.GR},
+sBV:function(a,b){a.GR=this.ct(a,C.tW,a.GR,b)},
+gMl:function(a){return a.cI},
+sMl:function(a,b){a.cI=this.ct(a,C.Gr,a.cI,b)},
+gqw:function(a){return a.FZ},
+sqw:function(a,b){a.FZ=this.ct(a,C.WZ,a.FZ,b)},
+gGd:function(a){return a.Kf},
+sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
+rh:[function(a,b){this.Kn(a)
+this.ct(a,C.wq,0,1)},"$1","grO",2,0,17,35],
+fX:[function(a,b){this.Kn(a)},"$1","gXN",2,0,17,35],
+OM:[function(a,b){this.ct(a,C.SA,0,1)
+this.ct(a,C.wq,0,1)},"$1","gTA",2,0,10,35],
+fT:[function(a,b){var z,y
+z=a.oX
 if(z==null||a.FZ!==!0)return"min-width:32px;"
-y=J.UQ(z.gu9(),b.gRd())
+y=z.gu9().Zp.t(0,b.gRd())
 if(y==null)return"min-width:32px;"
-if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"$1","gL0",2,0,517,192,[],"hitStyle",309],
-VH:[function(a){var z,y,x,w,v
-if(J.iS(a.QV)!==!0){J.SK(a.QV).ml(new T.ZJ(a))
-return}this.ct(a,C.Cv,0,1)
-J.U2(a.Bs)
-z=a.QV.q6(a.t7)
-if(z!=null){y=a.hX
-x=a.QV
-if(y==null)J.wT(a.Bs,J.UQ(J.Ew(x),J.xH(z,1)))
+if(J.xC(y,0))return"min-width:32px;background-color:red"
+return"min-width:32px;background-color:green"},"$1","gL0",2,0,142,143],
+Kn:function(a){var z,y,x,w,v
+if(J.iS(a.oX)!==!0){J.SK(a.oX).ml(new T.Wd(a))
+return}this.ct(a,C.SA,0,1)
+J.U2(a.Kf)
+z=a.oX.q6(a.GR)
+if(z!=null){y=a.cI
+x=a.oX
+if(y==null)J.bi(a.Kf,J.UQ(J.de(x),J.Hn(z,1)))
 else{w=x.q6(y)
-for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.wT(a.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}}},"$0","gI2",0,0,126,"_updateProperties"],
-"@":function(){return[C.OLi]},
-static:{"^":"bN<-85,JP<-85,VnP<-85",T5:[function(a){var z,y,x,w,v
-z=R.Jk([])
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
+for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.bi(a.Kf,J.UQ(J.de(a.oX),y.W(v,1)))}}},
+static:{"^":"bN,MRW,VnP",T5:function(a){var z,y,x,w,v
+z=R.tB([])
+y=$.J1()
+x=P.YM(null,null,null,P.qU,W.I0)
+w=P.qU
+v=W.h4
+v=H.VM(new V.qC(P.YM(null,null,null,w,v),null,null),[w,v])
 a.FZ=!1
-a.Bs=z
-a.SO=y
-a.B7=x
-a.X0=v
-C.HD.ZL(a)
-C.HD.oX(a)
-return a},null,null,0,0,115,"new ScriptInsetElement$created"]}},
-"+ScriptInsetElement":[518],
-V29:{
+a.Kf=z
+a.on=y
+a.BA=x
+a.LL=v
+C.oA.ZL(a)
+C.oA.XI(a)
+return a}}},
+V31:{
 "^":"uL+Pi;",
 $isd3:true},
-ZJ:{
-"^":"Tp:116;a-85",
-$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,116,117,[],"call"],
-$isEH:true},
-"+ ZJ":[315]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+Wd:{
+"^":"Xs:10;a",
+$1:[function(a){var z=this.a
+if(J.iS(z.oX)===!0)J.vH(z)},"$1",null,2,0,null,11,"call"],
+$isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
-knI:{
-"^":["x4;jJ%-326,AP,fn,tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gBV:[function(a){return a.jJ},null,null,1,0,487,"pos",308,311],
-sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,363,30,[],"pos",308],
-gD5:[function(a){var z=a.tY
-if(z==null)return Q.xI.prototype.gD5.call(this,a)
-return z.gzz()},null,null,1,0,312,"hoverText"],
-Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,169,242,[],"posChanged"],
+kn:{
+"^":"T53;jJ,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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.gzz()},
+fX:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,17,35],
 r6:[function(a,b){var z=a.tY
 if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,169,117,[],"_updateProperties"],
-goc:[function(a){var z,y
+this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,17,11],
+goc:function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.goc.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
 y=a.tY
 if(z===!0)return H.d(Q.xI.prototype.goc.call(this,a))+":"+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,312,"name"],
-gO3:[function(a){var z,y
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},
+gO3:function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
 if(J.J5(a.jJ,0)){z=J.iS(a.tY)
 y=a.tY
 if(z===!0)return Q.xI.prototype.gO3.call(this,a)+"#line="+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,312,"url"],
-"@":function(){return[C.Ur]},
-static:{Th:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},
+static:{D2:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.jJ=-1
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.c0.ZL(a)
-C.c0.oX(a)
-return a},null,null,0,0,115,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[519],
-x4:{
+a.on=z
+a.BA=y
+a.LL=w
+C.Mh.ZL(a)
+C.Mh.XI(a)
+return a}}},
+T53:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V30;Uz%-511,HJ%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.Uz},null,null,1,0,513,"script",308,311],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,514,30,[],"script",308],
-gjG:[function(a){return a.HJ},null,null,1,0,307,"showCoverage",308,311],
-sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,310,30,[],"showCoverage",308],
-i4:[function(a){var z
-Z.uL.prototype.i4.call(this,a)
+"^":"V32;Uz,HJ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gIs:function(a){return a.Uz},
+sIs:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
+gnN:function(a){return a.HJ},
+snN:function(a,b){a.HJ=this.ct(a,C.XY,a.HJ,b)},
+q0:function(a){var z
+Z.uL.prototype.q0.call(this,a)
 z=a.Uz
 if(z==null)return
-J.SK(z)},"$0","gQd",0,0,126,"enteredView"],
-ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,116,242,[],"showCoverageChanged"],
-pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,169,339,[],"refreshCoverage"],
-"@":function(){return[C.I3]},
-static:{Ry:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+J.SK(z)},
+RB:[function(a,b){J.qA((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gVU",2,0,10,35],
+RF:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gVm",2,0,17,66],
+j9:[function(a,b){J.eg(J.aT(a.Uz)).wM(b)},"$1","gaL",2,0,17,66],
+static:{dI:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.HJ=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.cJ.ZL(a)
-C.cJ.oX(a)
-return a},null,null,0,0,115,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[520],
-V30:{
+a.on=z
+a.BA=y
+a.LL=w
+C.FH.ZL(a)
+C.FH.XI(a)
+return a}}},
+V32:{
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
-ac:function(a,b){var z,y,x,w,v,u,t,s
+hi:function(a,b){var z,y,x,w,v,u,t,s
 if(b==null)return
 z=J.U6(b)
 z=z.t(b,"id")!=null&&z.t(b,"type")!=null
-if(!z)N.Jx("").hh("Malformed service object: "+H.d(b))
+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"Code":z=[]
-z.$builtinTypeInfo=[D.Vi]
+z.$builtinTypeInfo=[D.ta]
 x=[]
-x.$builtinTypeInfo=[D.Vi]
-w=D.Q4
+x.$builtinTypeInfo=[D.ta]
+w=D.DP
 v=[]
 v.$builtinTypeInfo=[w]
 v=new Q.wn(null,null,v,null,null)
 v.$builtinTypeInfo=[w]
-w=J.bU
-u=D.N8
-t=new V.qC(P.Py(null,null,null,w,u),null,null)
+w=P.KN
+u=D.uA
+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)
 break
-case"Error":s=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"Error":s=new D.ft(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"Isolate":z=new V.qC(P.Py(null,null,null,null,null),null,null)
+case"Isolate":z=new V.qC(P.YM(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
-x=P.L5(null,null,null,J.O,D.af)
+x=P.L5(null,null,null,P.qU,D.af)
 w=[]
-w.$builtinTypeInfo=[J.O]
+w.$builtinTypeInfo=[P.qU]
 v=[]
-v.$builtinTypeInfo=[D.e5]
+v.$builtinTypeInfo=[D.ER]
 u=D.U4
 t=[]
 t.$builtinTypeInfo=[u]
 t=new Q.wn(null,null,t,null,null)
 t.$builtinTypeInfo=[u]
-u=P.L5(null,null,null,J.O,J.Pp)
-u=R.Jk(u)
-s=new D.bv(z,null,!1,!1,!0,x,new D.tL(w,v,null,null,20,0),null,t,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+u=P.L5(null,null,null,P.qU,P.CP)
+u=R.tB(u)
+s=new D.bv(z,null,!1,!1,!0,!1,x,new D.tL(w,v,null,null,20,0),null,t,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Library":z=D.U4
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-z=D.rj
+z=D.vx
 w=[]
 w.$builtinTypeInfo=[z]
 w=new Q.wn(null,null,w,null,null)
 w.$builtinTypeInfo=[z]
-z=D.SI
+z=D.vO
 v=[]
 v.$builtinTypeInfo=[z]
 v=new Q.wn(null,null,v,null,null)
 v.$builtinTypeInfo=[z]
-z=D.SI
+z=D.vO
 u=[]
 u.$builtinTypeInfo=[z]
 u=new Q.wn(null,null,u,null,null)
 u.$builtinTypeInfo=[z]
-z=D.SI
+z=D.vO
 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)
 break
-case"ServiceError":s=new D.fJ(null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"ServiceError":s=new D.N7(null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"ServiceException":s=new D.hR(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"ServiceException":s=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]
-z=J.bU
-w=J.bU
-v=new V.qC(P.Py(null,null,null,z,w),null,null)
+z=P.KN
+w=P.KN
+v=new V.qC(P.YM(null,null,null,z,w),null,null)
 v.$builtinTypeInfo=[z,w]
-s=new D.rj(x,v,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.vx(x,v,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-default:z=new V.qC(P.Py(null,null,null,null,null),null,null)
+default:z=new V.qC(P.YM(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
-s=new D.SI(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
+s=new D.vO(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
 return s},
-D5:[function(a){var z
+bF:function(a){var z
 if(a!=null){z=J.U6(a)
 z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
-return z},"$1","SSc",2,0,null,202,[]],
-ES:[function(a,b){var z=J.x(a)
-if(!!z.$isSI)return
+return z},
+tg:function(a,b){var z=J.x(a)
+if(!!z.$isvO)return
 if(!!z.$isqC)D.Gf(a,b)
-else if(!!z.$iswn)D.f3(a,b)},"$2","Ja",4,0,null,290,[],156,[]],
-Gf:[function(a,b){a.aN(0,new D.UZ(a,b))},"$2","nV",4,0,null,162,[],156,[]],
-f3:[function(a,b){var z,y,x,w,v,u
-for(z=a.ao,y=0;y<z.length;++y){x=z[y]
+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.Xk,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
 else u=!1
-if(u)a.u(0,y,b.Zr(x))
+if(u)a.u(0,y,b.Qn(x))
 else if(!!w.$iswn)D.f3(x,b)
-else if(v)D.Gf(x,b)}},"$2","PV",4,0,null,76,[],156,[]],
+else if(v)D.Gf(x,b)}},
 af:{
-"^":"Pi;bN@,GR@",
-gXP:[function(){return this.P3},null,null,1,0,521,"owner",308],
-gzf:[function(a){var z=this.P3
-return z.gzf(z)},null,null,1,0,522,"vm",308],
-gF1:[function(a){var z=this.P3
-return z.gF1(z)},null,null,1,0,318,"isolate",308],
-gjO:[function(a){return this.KG},null,null,1,0,312,"id",308],
-gzS:[function(){return this.mQ},null,null,1,0,312,"serviceType",308],
-gPj:[function(a){var z,y
-z=this.gF1(this)
-y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,312,"link",308],
-gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,312,"hashLink",308],
-sHP:[function(a){},null,null,3,0,116,99,[],"hashLink",308],
+"^":"Pi;NM@,t7@",
+gwv:function(a){var z=this.Jz
+return z.gwv(z)},
+god:function(a){var z=this.Jz
+return z.god(z)},
+gjO:function(a){return this.r0},
+gzS:function(){return this.mQ},
+gPj:function(a){var z,y
+z=this.god(this)
+y=this.r0
+return H.d(z.r0)+"/"+H.d(y)},
+gHP:function(){return"#/"+H.d(this.gPj(this))},
+sHP:function(a){},
 gox:function(a){return this.kT},
 gUm:function(){return!1},
 gM8:function(){return!1},
-goc:[function(a){return this.gbN()},null,null,1,0,312,"name",308,309],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",308],
-gzz:[function(){return this.gGR()},null,null,1,0,312,"vmName",308,309],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",308],
-xW:function(a){if(this.kT)return P.Ab(this,null)
+goc:function(a){return this.gNM()},
+soc:function(a,b){this.sNM(this.ct(this,C.YS,this.gNM(),b))},
+gzz:function(){return this.gt7()},
+szz:function(a){this.st7(this.ct(this,C.Tc,this.gt7(),a))},
+xW:function(a){if(this.kT)return P.PG(this,null)
 return this.VD(0)},
 VD:function(a){var z
-if(J.de(this.KG,""))return P.Ab(this,null)
-if(this.kT&&this.gM8())return P.Ab(this,null)
+if(J.xC(this.r0,""))return P.PG(this,null)
+if(this.kT&&this.gM8())return P.PG(this,null)
 z=this.VR
-if(z==null){z=this.gzf(this).jU(this.gPj(this)).ml(new D.Pa(this)).YM(new D.jI(this))
+if(z==null){z=this.gwv(this).HL(this.gPj(this)).ml(new D.Pa(this)).wM(new D.jI(this))
 this.VR=z}return z},
 eC:function(a){var z,y,x,w
 z=J.U6(a)
@@ -14640,46 +13928,40 @@
 x=z.t(a,"type")
 w=J.rY(x)
 if(w.nC(x,"@"))x=w.yn(x,1)
-w=this.KG
-if(w!=null&&!J.de(w,z.t(a,"id")));this.KG=z.t(a,"id")
+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)},
 $isaf:true},
 Pa:{
-"^":"Tp:454;a",
+"^":"Xs:145;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.de(z,y.mQ))return D.ac(y.P3,a)
+if(!J.xC(z,y.mQ))return D.hi(y.Jz,a)
 y.eC(a)
-return y},"$1",null,2,0,null,162,[],"call"],
+return y},"$1",null,2,0,null,144,"call"],
 $isEH:true},
 jI:{
-"^":"Tp:115;b",
+"^":"Xs:42;b",
 $0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
 $isEH:true},
-u0g:{
+fz:{
 "^":"af;"},
-zM:{
-"^":"O1w;Li<,G2<",
-gzf:[function(a){return this},null,null,1,0,522,"vm",308],
-gF1:[function(a){return},null,null,1,0,318,"isolate",308],
-gi2:[function(){var z=this.z7
-return z.gUQ(z)},null,null,1,0,523,"isolates",308],
-gPj:[function(a){return H.d(this.KG)},null,null,1,0,312,"link",308],
-gYe:[function(a){return this.Ox},null,null,1,0,312,"version",308,309],
-sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,32,30,[],"version",308],
-gF6:[function(){return this.GY},null,null,1,0,312,"architecture",308,309],
-sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,32,30,[],"architecture",308],
-gUn:[function(){return this.Rp},null,null,1,0,524,"uptime",308,309],
-sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,525,30,[],"uptime",308],
-gC3:[function(){return this.Ts},null,null,1,0,307,"assertsEnabled",308,309],
-sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,310,30,[],"assertsEnabled",308],
-gPV:[function(){return this.Va},null,null,1,0,307,"typeChecksEnabled",308,309],
-sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,310,30,[],"typeChecksEnabled",308],
-bZ:function(a){var z,y,x,w
+wv:{
+"^":"O1w;",
+gwv:function(a){return this},
+god:function(a){return},
+gi2:function(){var z=this.z7
+return z.gUQ(z)},
+gPj:function(a){return H.d(this.r0)},
+gYe:function(){return this.Ox},
+gJk:function(){return this.RW},
+gA3:function(){return this.Ts},
+gEy:function(){return this.Va},
+hV:function(a){var z,y,x,w
 z=$.rc().R4(0,a)
 if(z==null)return
 y=z.QK
@@ -14690,7 +13972,7 @@
 if(typeof y!=="number")return H.s(y)
 return C.xB.yn(x,w+y)},
 jz:function(a){var z,y,x
-z=$.PY().R4(0,a)
+z=$.vo().R4(0,a)
 if(z==null)return""
 y=z.QK
 x=y.index
@@ -14698,11 +13980,11 @@
 y=J.q8(y[0])
 if(typeof y!=="number")return H.s(y)
 return J.Nj(a,0,x+y)},
-Zr:function(a){throw H.b(P.SY(null))},
-Tn:function(a){var z
-if(a==="")return P.Ab(null,null)
+Qn:function(a){throw H.b(P.SY(null))},
+dJ:function(a){var z
+if(a==="")return P.PG(null,null)
 z=this.z7.t(0,a)
-if(z!=null)return P.Ab(z,null)
+if(z!=null)return P.PG(z,null)
 return this.VD(0).ml(new D.MZ(this,a))},
 cv:function(a){var z,y,x,w,v
 z={}
@@ -14712,23 +13994,23 @@
 a=y[0]
 z.a=a
 if(J.co(a,"isolates/")){x=this.jz(z.a)
-w=this.bZ(z.a)
-return this.Tn(x).ml(new D.oe(this,w))}v=this.A4.t(0,z.a)
-if(v!=null)return J.am(v)
-return this.jU(z.a).ml(new D.kk(z,this))},
-Nw:[function(a,b){return b},"$2","gS6",4,0,300,49,[],30,[]],
-b2:function(a){var z,y,x
+w=this.hV(z.a)
+return this.dJ(x).ml(new D.K7(this,w))}v=this.Qy.t(0,z.a)
+if(v!=null)return J.LE(v)
+return this.HL(z.a).ml(new D.lb(z,this))},
+Nw:[function(a,b){return b},"$2","gC9",4,0,51],
+ng:function(a){var z,y,x
 z=null
-try{y=new P.Cf(this.gS6())
-z=P.BS(a,y.gN5())}catch(x){H.Ru(x)
-return}return R.Jk(z)},
+try{y=new P.Cf(this.gC9())
+z=P.jc(a,y.gqa())}catch(x){H.Ru(x)
+return}return R.tB(z)},
 N7:function(a){var z
-if(!D.D5(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.ac(this,R.Jk(z)),null,null)}z=J.U6(a)
-if(J.de(z.t(a,"type"),"ServiceError"))return P.Vu(D.ac(this,a),null,null)
-else if(J.de(z.t(a,"type"),"ServiceException"))return P.Vu(D.ac(this,a),null,null)
-return P.Ab(a,null)},
-jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.mR(this),new D.bp())},
+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.hi(this,R.tB(z)),null,null)}z=J.U6(a)
+if(J.xC(z.t(a,"type"),"ServiceError"))return P.Vu(D.hi(this,a),null,null)
+else if(J.xC(z.t(a,"type"),"ServiceException"))return P.Vu(D.hi(this,a),null,null)
+return P.PG(a,null)},
+HL:function(a){return this.z6(0,a).ml(new D.zA(this)).co(new D.tm(this),new D.mR()).co(new D.bp(this),new D.hc())},
 bF:function(a,b,c){var z,y
 if(c)return
 this.kT=!0
@@ -14738,115 +14020,114 @@
 y=z.t(b,"architecture")
 this.GY=F.Wi(this,C.US,this.GY,y)
 y=z.t(b,"uptime")
-this.Rp=F.Wi(this,C.mh,this.Rp,y)
+this.RW=F.Wi(this,C.mh,this.RW,y)
 y=z.t(b,"assertsEnabled")
-this.Ts=F.Wi(this,C.ly,this.Ts,y)
+this.Ts=F.Wi(this,C.ET,this.Ts,y)
 y=z.t(b,"typeChecksEnabled")
 this.Va=F.Wi(this,C.J2,this.Va,y)
-this.xA(z.t(b,"isolates"))},
-xA:function(a){var z,y,x,w,v,u
+this.E4(z.t(b,"isolates"))},
+E4:function(a){var z,y,x,w,v,u
 z=this.z7
-y=P.L5(null,null,null,J.O,D.bv)
-for(x=J.GP(a);x.G();){w=x.gl()
+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")
 u=z.t(0,v)
 if(u!=null)y.u(0,v,u)
-else{u=D.ac(this,w)
+else{u=D.hi(this,w)
 y.u(0,v,u)
-N.Jx("").To("New isolate '"+H.d(u.KG)+"'")}}y.aN(0,new D.Yu())
+N.QM("").To("New isolate '"+H.d(u.r0)+"'")}}y.aN(0,new D.Hq())
 this.z7=y},
-Lw:function(){this.bN=this.ct(this,C.YS,this.bN,"vm")
-this.GR=this.ct(this,C.KS,this.GR,"vm")
-this.A4.u(0,"vm",this)
+Lw:function(){this.NM=this.ct(this,C.YS,this.NM,"vm")
+this.t7=this.ct(this,C.Tc,this.t7,"vm")
+this.Qy.u(0,"vm",this)
 var z=P.EF(["id","vm","type","@VM"],null,null)
-this.eC(R.Jk(z))},
-$iszM:true},
+this.eC(R.tB(z))},
+$iswv:true},
 O1w:{
-"^":"u0g+Pi;",
+"^":"fz+Pi;",
 $isd3:true},
 MZ:{
-"^":"Tp:116;a,b",
-$1:[function(a){if(!J.x(a).$iszM)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,57,[],"call"],
+"^":"Xs:10;a,b",
+$1:[function(a){if(!J.x(a).$iswv)return
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,94,"call"],
 $isEH:true},
-oe:{
-"^":"Tp:116;b,c",
+K7:{
+"^":"Xs:10;b,c",
 $1:[function(a){var z
 if(a==null)return this.b
 z=this.c
-if(z==null)return J.am(a)
-else return a.cv(z)},"$1",null,2,0,null,16,[],"call"],
+if(z==null)return J.LE(a)
+else return a.cv(z)},"$1",null,2,0,null,4,"call"],
 $isEH:true},
-kk:{
-"^":"Tp:454;a,d",
+lb:{
+"^":"Xs:145;a,d",
 $1:[function(a){var z,y
 z=this.d
-y=D.ac(z,a)
-if(y.gUm())z.A4.to(this.a.a,new D.QZ(y))
-return y},"$1",null,2,0,null,162,[],"call"],
+y=D.hi(z,a)
+if(y.gUm())z.Qy.to(this.a.a,new D.QZ(y))
+return y},"$1",null,2,0,null,144,"call"],
 $isEH:true},
 QZ:{
-"^":"Tp:115;e",
-$0:[function(){return this.e},"$0",null,0,0,null,"call"],
+"^":"Xs:42;e",
+$0:function(){return this.e},
 $isEH:true},
-Ey:{
-"^":"Tp:116;a",
+zA:{
+"^":"Xs:10;a",
 $1:[function(a){var z,y,x,w
 z=null
-try{z=this.a.b2(a)}catch(x){w=H.Ru(x)
+try{z=this.a.ng(a)}catch(x){w=H.Ru(x)
 y=w
-P.JS("Hit V8 bug.")
+P.FL("Hit V8 bug.")
 w=P.EF(["type","ServiceException","id","","kind","DecodeException","response","This is likely a result of a known V8 bug. Although the the bug has been fixed the fix may not be in your Chrome version. For more information see dartbug.com/18385. Observatory is still functioning and you should try your action again.","message","Could not decode JSON: "+H.d(y)],null,null)
-w=R.Jk(w)
-return P.Vu(D.ac(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,423,[],"call"],
+w=R.tB(w)
+return P.Vu(D.hi(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,97,"call"],
 $isEH:true},
 tm:{
-"^":"Tp:116;b",
+"^":"Xs:10;b",
 $1:[function(a){var z=this.b.G2
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,171,[],"call"],
-$isEH:true},
-Gk:{
-"^":"Tp:116;",
-$1:[function(a){return!!J.x(a).$isfJ},"$1",null,2,0,null,21,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,21,"call"],
 $isEH:true},
 mR:{
-"^":"Tp:116;c",
+"^":"Xs:10;",
+$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,1,"call"],
+$isEH:true},
+bp:{
+"^":"Xs:10;c",
 $1:[function(a){var z=this.c.Li
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,324,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,59,"call"],
 $isEH:true},
-bp:{
-"^":"Tp:116;",
-$1:[function(a){return!!J.x(a).$ishR},"$1",null,2,0,null,21,[],"call"],
+hc:{
+"^":"Xs:10;",
+$1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
 $isEH:true},
-Yu:{
-"^":"Tp:300;",
-$2:[function(a,b){J.am(b)},"$2",null,4,0,null,526,[],16,[],"call"],
+Hq:{
+"^":"Xs:51;",
+$2:function(a,b){J.LE(b)},
 $isEH:true},
-e5:{
-"^":"a;SP<,hw>,wZ",
-gaQ:function(){return this.wZ},
-Bv:function(a){var z,y,x,w,v
-z=this.hw
-H.ed(z,0,a)
+ER:{
+"^":"a;SP,KE>,wZ",
+eK:function(a){var z,y,x,w,v
+z=this.KE
+H.xr(z,0,a)
 for(y=z.length,x=0;x<y;++x){w=this.wZ
 v=z[x]
 if(typeof v!=="number")return H.s(v)
 this.wZ=w+v}},
-nZ:function(a,b){var z,y,x,w,v,u,t
-for(z=this.hw,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.t(a,v)
+y8:function(a,b){var z,y,x,w,v,u,t
+for(z=this.KE,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.xH(u,b[v])
+u=J.Hn(u,b[v])
 z[v]=u
 t=this.wZ
 if(typeof u!=="number")return H.s(u)
 this.wZ=t+u}},
-wY:function(a,b){var z,y,x,w,v,u
+Vy:function(a,b){var z,y,x,w,v,u
 z=J.U6(b)
-y=this.hw
+y=this.KE
 x=y.length
 w=0
 while(!0){v=z.gB(b)
@@ -14856,13 +14137,13 @@
 if(w>=x)return H.e(y,w)
 y[w]=J.z8(y[w],u)?y[w]:u;++w}},
 CJ:function(){var z,y,x
-for(z=this.hw,y=z.length,x=0;x<y;++x)z[x]=0},
-$ise5:true},
+for(z=this.KE,y=z.length,x=0;x<y;++x)z[x]=0},
+$isER:true},
 tL:{
-"^":"a;af<,lI<,TR,yP,hD,RP",
-gZ0:function(){return this.TR},
+"^":"a;af<,lI<,h7,yP,hD,RP",
+gij:function(){return this.h7},
 xZ:function(a,b){var z,y,x,w,v,u
-this.TR=a
+this.h7=a
 z=J.U6(b)
 y=z.t(b,"counters")
 x=this.af
@@ -14871,118 +14152,104 @@
 for(z=this.hD,x=this.lI,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
 v=Array(v)
 v.fixed$length=init
-v.$builtinTypeInfo=[J.bU]
-u=new D.e5(0,v,0)
+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)
 z.fixed$length=init
-z=new D.e5(0,H.VM(z,[J.bU]),0)
+z=new D.ER(0,H.VM(z,[P.KN]),0)
 this.yP=z
-z.Bv(y)
+z.eK(y)
 return}z=this.RP
 if(typeof z!=="number")return H.s(z)
 z=Array(z)
 z.fixed$length=init
-u=new D.e5(a,H.VM(z,[J.bU]),0)
-u.nZ(y,this.yP.hw)
-this.yP.wY(0,y)
+u=new D.ER(a,H.VM(z,[P.KN]),0)
+u.y8(y,this.yP.KE)
+this.yP.Vy(0,y)
 z=this.lI
 z.push(u)
-if(z.length>this.hD)C.Nm.KI(z,0)}},
+if(z.length>this.hD)C.Nm.W4(z,0)}},
 bv:{
-"^":["uz4;V3,Jr,EY,eU,zG,A4,KJ,v9,DC,zb,bN:KT@,GR:f5@,Er,cL,LE<-527,Cf,W1,p2,Hw,S9,yv,BC@-440,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
-gzf:[function(a){return this.P3},null,null,1,0,522,"vm",308],
-gF1:[function(a){return this},null,null,1,0,318,"isolate",308],
-ghw:[function(a){return this.V3},null,null,1,0,453,"counters",308,309],
-shw:[function(a,b){this.V3=F.Wi(this,C.MR,this.V3,b)},null,null,3,0,454,30,[],"counters",308],
-gPj:function(a){return this.KG},
-gHP:function(){return"#/"+H.d(this.KG)},
-gBP:[function(a){return this.Jr},null,null,1,0,337,"pauseEvent",308,309],
-sBP:[function(a,b){this.Jr=F.Wi(this,C.yG,this.Jr,b)},null,null,3,0,338,30,[],"pauseEvent",308],
-gLd:[function(){return this.EY},null,null,1,0,307,"running",308,309],
-sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,310,30,[],"running",308],
-gaj:[function(){return this.eU},null,null,1,0,307,"idle",308,309],
-saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,310,30,[],"idle",308],
-gMN:[function(){return this.zG},null,null,1,0,307,"loading",308,309],
-sMN:[function(a){this.zG=F.Wi(this,C.jA,this.zG,a)},null,null,3,0,310,30,[],"loading",308],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,528,529,[],"relativeLink",308],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,528,529,[],"relativeHashLink",308],
+"^":"uz4;V3,Jr,EY,eU,zG,XV,Qy,GH,v9,DC,zb,NM:KT@,t7:PB@,Er,cL,Dr,lP,W1,p2,Hw,vJ,yv,BC<,FF,bj,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+gwv:function(a){return this.Jz},
+god:function(a){return this},
+gKE:function(a){return this.V3},
+sKE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
+gPj:function(a){return this.r0},
+gHP:function(){return"#/"+H.d(this.r0)},
+gBP:function(a){return this.Jr},
+gA6:function(){return this.EY},
+gaj:function(){return this.eU},
+gn0:function(){return this.zG},
+gwg:function(){return this.XV},
+xQ:[function(a){return"#/"+(H.d(this.r0)+"/"+H.d(a))},"$1","gw6",2,0,146,147],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
-for(x=J.GP(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
+for(x=J.mY(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
 this.c2()
-this.pl(a,z)
+this.hr(a,z)
 w=y.t(a,"exclusive_trie")
-if(w!=null)this.BC=this.KQ(w,z)},
-c2:function(){var z=this.A4
-z.gUQ(z).aN(0,new D.iz())},
-pl:function(a,b){var z,y,x,w
+if(w!=null)this.BC=this.aU(w,z)},
+c2:function(){var z=this.Qy
+z.gUQ(z).aN(0,new D.Xa())},
+hr: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.GP(y);z.G();){w=z.gl()
+for(z=J.mY(y);z.G();){w=z.gl()
 J.UQ(w,"code").eL(w,b,x)}},
-Ms:function(a){return this.cv("coverage").ml(this.gm6())},
-Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gm6",2,0,530,531,[]],
-Zr:function(a){var z,y,x
+Ms:[function(a){return this.cv("coverage").ml(this.gJJ())},"$0","gaL",0,0,148],
+cNN:[function(a){J.kH(J.UQ(a,"coverage"),new D.Yb(this))},"$1","gJJ",2,0,149,150],
+Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
-y=this.A4
+y=this.Qy
 x=y.t(0,z)
 if(x!=null)return x
-x=D.ac(this,a)
+x=D.hi(this,a)
 if(x.gUm())y.u(0,z,x)
 return x},
-cv:function(a){var z=this.A4.t(0,a)
-if(z!=null)return J.am(z)
-return this.P3.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gVc:[function(){return this.v9},null,null,1,0,462,"rootLib",308,309],
-sVc:[function(a){this.v9=F.Wi(this,C.xe,this.v9,a)},null,null,3,0,463,30,[],"rootLib",308],
-gvU:[function(){return this.DC},null,null,1,0,532,"libraries",308,309],
-svU:[function(a){this.DC=F.Wi(this,C.Ij,this.DC,a)},null,null,3,0,533,30,[],"libraries",308],
-gf4:[function(){return this.zb},null,null,1,0,453,"topFrame",308,309],
-sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,454,30,[],"topFrame",308],
-goc:[function(a){return this.KT},null,null,1,0,312,"name",308,309],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",308],
-gzz:[function(){return this.f5},null,null,1,0,312,"vmName",308,309],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",308],
-gQ9:[function(){return this.Er},null,null,1,0,312,"mainPort",308,309],
-sQ9:[function(a){this.Er=F.Wi(this,C.dH,this.Er,a)},null,null,3,0,32,30,[],"mainPort",308],
-gw2:[function(){return this.cL},null,null,1,0,534,"entry",308,309],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,535,30,[],"entry",308],
-gCi:[function(){return this.Cf},null,null,1,0,487,"newHeapUsed",308,309],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,363,30,[],"newHeapUsed",308],
-gcu:[function(){return this.W1},null,null,1,0,487,"oldHeapUsed",308,309],
-scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,363,30,[],"oldHeapUsed",308],
-gab:[function(){return this.p2},null,null,1,0,487,"newHeapCapacity",308,309],
-sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,363,30,[],"newHeapCapacity",308],
-gQBR:[function(){return this.Hw},null,null,1,0,487,"oldHeapCapacity",308,309],
-sQBR:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,363,30,[],"oldHeapCapacity",308],
-guT:[function(a){return this.S9},null,null,1,0,312,"fileAndLine",308,309],
-at:function(a,b){return this.guT(this).$1(b)},
-suT:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",308],
-gkc:[function(a){return this.yv},null,null,1,0,536,"error",308,309],
-skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,537,30,[],"error",308],
+cv:function(a){var z=this.Qy.t(0,a)
+if(z!=null)return J.LE(z)
+return this.Jz.HL(H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
+gVc:function(){return this.v9},
+sVc:function(a){this.v9=F.Wi(this,C.eN,this.v9,a)},
+gvU:function(){return this.DC},
+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)},
+gzz:function(){return this.PB},
+szz:function(a){this.PB=F.Wi(this,C.Tc,this.PB,a)},
+geH:function(){return this.Er},
+gw2:function(){return this.cL},
+sw2:function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},
+gCi:function(){return this.lP},
+guq:function(){return this.W1},
+gxs:function(){return this.p2},
+gQB:function(){return this.Hw},
+gkc:function(a){return this.yv},
+skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
 bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z=J.U6(b)
 y=z.t(b,"mainPort")
-this.Er=F.Wi(this,C.dH,this.Er,y)
+this.Er=F.Wi(this,C.wT,this.Er,y)
 y=z.t(b,"name")
 this.KT=F.Wi(this,C.YS,this.KT,y)
 y=z.t(b,"name")
-this.f5=F.Wi(this,C.KS,this.f5,y)
+this.PB=F.Wi(this,C.Tc,this.PB,y)
 if(c)return
 this.kT=!0
-this.zG=F.Wi(this,C.jA,this.zG,!1)
-D.ES(b,this)
-if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(b))
+this.zG=F.Wi(this,C.DY,this.zG,!1)
+D.tg(b,this)
+if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.QM("").YX("Malformed 'Isolate' response: "+H.d(b))
 return}y=z.t(b,"rootLib")
-this.v9=F.Wi(this,C.xe,this.v9,y)
+this.v9=F.Wi(this,C.eN,this.v9,y)
 if(z.t(b,"entry")!=null){y=z.t(b,"entry")
 this.cL=F.Wi(this,C.tP,this.cL,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
-this.zb=F.Wi(this,C.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
+this.zb=F.Wi(this,C.bc,this.zb,y)}else this.zb=F.Wi(this,C.bc,this.zb,null)
 x=z.t(b,"tagCounters")
 if(x!=null){y=J.U6(x)
 w=y.t(x,"names")
@@ -14996,8 +14263,8 @@
 s=y.t(v,t)
 if(typeof s!=="number")return H.s(s)
 u+=s;++t}s=P.Fl(null,null)
-s=R.Jk(s)
-this.V3=F.Wi(this,C.MR,this.V3,s)
+s=R.tB(s)
+this.V3=F.Wi(this,C.bJ,this.V3,s)
 if(u===0){y=J.U6(w)
 t=0
 while(!0){s=y.gB(w)
@@ -15008,42 +14275,47 @@
 while(!0){r=s.gB(w)
 if(typeof r!=="number")return H.s(r)
 if(!(t<r))break
-J.kW(this.V3,s.t(w,t),C.CD.yM(J.FW(y.t(v,t),u)*100,2)+"%");++t}}}q=P.Fl(null,null)
+J.kW(this.V3,s.t(w,t),C.CD.Sy(J.L9(y.t(v,t),u)*100,2)+"%");++t}}}q=P.Fl(null,null)
 J.kH(z.t(b,"timers"),new D.Qq(q))
-y=this.LE
+y=this.Dr
 s=J.w1(y)
 s.u(y,"total",q.t(0,"time_total_runtime"))
 s.u(y,"compile",q.t(0,"time_compilation"))
 s.u(y,"gc",0)
-s.u(y,"init",J.WB(J.WB(J.WB(q.t(0,"time_script_loading"),q.t(0,"time_creating_snapshot")),q.t(0,"time_isolate_initialization")),q.t(0,"time_bootstrap")))
+s.u(y,"init",J.ew(J.ew(J.ew(q.t(0,"time_script_loading"),q.t(0,"time_creating_snapshot")),q.t(0,"time_isolate_initialization")),q.t(0,"time_bootstrap")))
 s.u(y,"dart",q.t(0,"time_dart_execution"))
 y=J.UQ(z.t(b,"heap"),"usedNew")
-this.Cf=F.Wi(this,C.IO,this.Cf,y)
+this.lP=F.Wi(this,C.EK,this.lP,y)
 y=J.UQ(z.t(b,"heap"),"usedOld")
-this.W1=F.Wi(this,C.SW,this.W1,y)
+this.W1=F.Wi(this,C.ap,this.W1,y)
 y=J.UQ(z.t(b,"heap"),"capacityNew")
 this.p2=F.Wi(this,C.So,this.p2,y)
 y=J.UQ(z.t(b,"heap"),"capacityOld")
-this.Hw=F.Wi(this,C.Le,this.Hw,y)
-y=z.t(b,"pauseEvent")
+this.Hw=F.Wi(this,C.eH,this.Hw,y)
+p=z.t(b,"features")
+if(p!=null)for(y=J.mY(p);y.G();)if(J.xC(y.gl(),"io")){s=this.XV
+if(this.gnz(this)&&!J.xC(s,!0)){s=new T.qI(this,C.h7,s,!0)
+s.$builtinTypeInfo=[null]
+this.nq(this,s)}this.XV=!0}y=z.t(b,"pauseEvent")
 y=F.Wi(this,C.yG,this.Jr,y)
 this.Jr=y
 y=y==null&&z.t(b,"topFrame")!=null
-this.EY=F.Wi(this,C.X8,this.EY,y)
+this.EY=F.Wi(this,C.L2,this.EY,y)
 y=this.Jr==null&&z.t(b,"topFrame")==null
 this.eU=F.Wi(this,C.q2,this.eU,y)
 y=z.t(b,"error")
-this.yv=F.Wi(this,C.YU,this.yv,y)
-J.U2(this.DC)
-for(z=J.GP(z.t(b,"libraries"));z.G();){p=z.gl()
-J.wT(this.DC,p)}J.LH(this.DC,new D.Yn())},
-m7:function(){return this.P3.jU(H.d(this.KG)+"/profile/tag").ml(new D.AP(this))},
-KQ:function(a,b){this.FF=0
+this.yv=F.Wi(this,C.yh,this.yv,y)
+y=this.DC
+y.V1(y)
+for(z=J.mY(z.t(b,"libraries"));z.G();)y.h(0,z.gl())
+y.XP(y,new D.hU())},
+m7:function(){return this.Jz.HL(H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
+aU:function(a,b){this.FF=0
 this.bj=a
 if(a==null)return
 if(J.u6(J.q8(a),3))return
-return this.AW(b)},
-AW:function(a){var z,y,x,w,v,u,t,s,r,q
+return this.tw(b)},
+tw:function(a){var z,y,x,w,v,u,t,s,r,q
 z=this.bj
 y=this.FF
 if(typeof y!=="number")return y.g()
@@ -15057,8 +14329,8 @@
 this.FF=z+1
 v=J.UQ(y,z)
 z=[]
-z.$builtinTypeInfo=[D.t9]
-u=new D.t9(w,v,z,0)
+z.$builtinTypeInfo=[D.D5]
+u=new D.D5(w,v,z,0)
 y=this.bj
 t=this.FF
 if(typeof t!=="number")return t.g()
@@ -15066,7 +14338,7 @@
 s=J.UQ(y,t)
 if(typeof s!=="number")return H.s(s)
 r=0
-for(;r<s;++r){q=this.AW(a)
+for(;r<s;++r){q=this.tw(a)
 z.push(q)
 y=u.Jv
 t=q.Av
@@ -15075,272 +14347,266 @@
 $isbv:true,
 static:{"^":"ZW"}},
 uz4:{
-"^":"u0g+Pi;",
+"^":"fz+Pi;",
 $isd3:true},
-iz:{
-"^":"Tp:116;",
-$1:[function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
+Xa:{
+"^":"Xs:10;",
+$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.Kj,a.xM,0)
 a.Du=0
 a.fF=0
 a.mM=F.Wi(a,C.eF,a.mM,"")
 a.qH=F.Wi(a,C.uU,a.qH,"")
-J.U2(a.VS)
-J.U2(a.ci)
-J.U2(a.Oo)}},"$1",null,2,0,null,30,[],"call"],
+C.Nm.sB(a.VS,0)
+C.Nm.sB(a.ci,0)
+a.Oo.V1(0)}},
 $isEH:true},
-oa:{
-"^":"Tp:116;a",
+Yb:{
+"^":"Xs:10;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,538,[],"call"],
+z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,151,"call"],
 $isEH:true},
 KQ:{
-"^":"Tp:454;a,b",
+"^":"Xs:145;a,b",
 $1:[function(a){var z,y
 z=this.a
-y=D.ac(z,a)
-if(y.gUm())z.A4.to(this.b,new D.Ai(y))
-return y},"$1",null,2,0,null,162,[],"call"],
+y=D.hi(z,a)
+if(y.gUm())z.Qy.to(this.b,new D.Ea(y))
+return y},"$1",null,2,0,null,144,"call"],
 $isEH:true},
-Ai:{
-"^":"Tp:115;c",
-$0:[function(){return this.c},"$0",null,0,0,null,"call"],
+Ea:{
+"^":"Xs:42;c",
+$0:function(){return this.c},
 $isEH:true},
 Qq:{
-"^":"Tp:116;a",
+"^":"Xs:10;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,539,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,152,"call"],
 $isEH:true},
-Yn:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.oE(J.O6(a),J.O6(b))},"$2",null,4,0,null,118,[],199,[],"call"],
+hU:{
+"^":"Xs:51;",
+$2:function(a,b){return J.oE(J.O6(a),J.O6(b))},
 $isEH:true},
 AP:{
-"^":"Tp:454;a",
+"^":"Xs:145;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
-y=this.a.KJ
+y=this.a.GH
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,202,[],"call"],
+return y},"$1",null,2,0,null,111,"call"],
 $isEH:true},
-SI:{
-"^":"af;RF,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gUm:function(){return(J.de(this.mQ,"Class")||J.de(this.mQ,"Function")||J.de(this.mQ,"Field"))&&!J.co(this.KG,$.VZ)},
+vO:{
+"^":"af;Ce,Jz,r0,mQ,kT,NM,t7,VR,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)},
 gM8:function(){return!1},
-bu:function(a){return P.vW(this.RF)},
+bu:function(a){return P.vW(this.Ce)},
 bF:function(a,b,c){var z,y,x
 this.kT=!c
-z=this.RF
+z=this.Ce
 z.V1(0)
 z.FV(0,b)
 y=z.Zp
 x=y.t(0,"user_name")
-this.bN=this.ct(0,C.YS,this.bN,x)
+this.NM=this.ct(0,C.YS,this.NM,x)
 y=y.t(0,"name")
-this.GR=this.ct(this,C.KS,this.GR,y)
-D.ES(z,this.P3)},
-FV:function(a,b){return this.RF.FV(0,b)},
-V1:function(a){return this.RF.V1(0)},
-di:function(a){return this.RF.Zp.di(a)},
-x4:function(a){return this.RF.Zp.x4(a)},
-aN:function(a,b){return this.RF.Zp.aN(0,b)},
-Rz:function(a,b){return this.RF.Rz(0,b)},
-t:function(a,b){return this.RF.Zp.t(0,b)},
-u:function(a,b,c){this.RF.u(0,b,c)
+this.t7=this.ct(0,C.Tc,this.t7,y)
+D.tg(z,this.Jz)},
+FV:function(a,b){return this.Ce.FV(0,b)},
+V1:function(a){return this.Ce.V1(0)},
+aN:function(a,b){return this.Ce.Zp.aN(0,b)},
+t:function(a,b){return this.Ce.Zp.t(0,b)},
+u:function(a,b,c){this.Ce.u(0,b,c)
 return c},
-gl0:function(a){var z=this.RF.Zp
+gl0:function(a){var z=this.Ce.Zp
 return z.gB(z)===0},
-gor:function(a){var z=this.RF.Zp
+gor:function(a){var z=this.Ce.Zp
 return z.gB(z)!==0},
-gvc:function(){return this.RF.Zp.gvc()},
-gUQ:function(a){var z=this.RF.Zp
+gvc:function(){return this.Ce.Zp.gvc()},
+gUQ:function(a){var z=this.Ce.Zp
 return z.gUQ(z)},
-gB:function(a){var z=this.RF.Zp
+gB:function(a){var z=this.Ce.Zp
 return z.gB(z)},
-BN:[function(a){var z=this.RF
-return z.BN(z)},"$0","gDx",0,0,307],
-nq:function(a,b){var z=this.RF
+BN:[function(a){var z=this.Ce
+return z.BN(z)},"$0","gDx",0,0,78],
+nq:function(a,b){var z=this.Ce
 return z.nq(z,b)},
-ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
-k0:[function(a){return},"$0","gqw",0,0,126],
-ni:[function(a){this.RF.AP=null
-return},"$0","gl1",0,0,126],
-gUj:function(a){var z=this.RF
-return z.gUj(z)},
+ct:function(a,b,c,d){return F.Wi(this.Ce,b,c,d)},
+k0:[function(a){return},"$0","gcm",0,0,15],
+NB:[function(a){this.Ce.AP=null
+return},"$0","gym",0,0,15],
+gqh:function(a){var z=this.Ce
+return z.gqh(z)},
 gnz:function(a){var z,y
-z=this.RF.AP
+z=this.Ce.AP
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-$isSI:true,
+$isvO:true,
 $isqC:true,
 $asqC:function(){return[null,null]},
 $isZ0:true,
 $asZ0:function(){return[null,null]},
 $isd3:true,
-static:{"^":"VZ"}},
-pD:{
-"^":"wVq;J6,LD,jo,Ne,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",308,309],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",308],
-gFA:[function(a){return this.jo},null,null,1,0,337,"exception",308,309],
-sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,338,30,[],"exception",308],
-gK7:[function(){return this.Ne},null,null,1,0,337,"stacktrace",308,309],
-sK7:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,338,30,[],"stacktrace",308],
+static:{"^":"RQ"}},
+ft:{
+"^":"D3;J6,LD,jo,ZG,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+gfY:function(a){return this.J6},
+sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+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
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.fy,this.J6,y)
+this.J6=F.Wi(this,C.Lc,this.J6,y)
 y=z.t(b,"message")
-this.LD=F.Wi(this,C.ch,this.LD,y)
-y=this.P3
-x=D.ac(y,z.t(b,"exception"))
+this.LD=F.Wi(this,C.pX,this.LD,y)
+y=this.Jz
+x=D.hi(y,z.t(b,"exception"))
 this.jo=F.Wi(this,C.ne,this.jo,x)
-z=D.ac(y,z.t(b,"stacktrace"))
-this.Ne=F.Wi(this,C.R3,this.Ne,z)
+z=D.hi(y,z.t(b,"stacktrace"))
+this.ZG=F.Wi(this,C.R3,this.ZG,z)
 z="DartError "+H.d(this.J6)
-z=this.ct(this,C.YS,this.bN,z)
-this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)}},
-wVq:{
+z=this.ct(this,C.YS,this.NM,z)
+this.NM=z
+this.t7=this.ct(this,C.Tc,this.t7,z)}},
+D3:{
 "^":"af+Pi;",
 $isd3:true},
-fJ:{
-"^":"dZL;J6,LD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",308,309],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",308],
+N7:{
+"^":"wVq;J6,LD,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+gfY:function(a){return this.J6},
+sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+gG1:function(a){return this.LD},
 bF:function(a,b,c){var z,y
 this.kT=!0
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.fy,this.J6,y)
+this.J6=F.Wi(this,C.Lc,this.J6,y)
 z=z.t(b,"message")
-this.LD=F.Wi(this,C.ch,this.LD,z)
+this.LD=F.Wi(this,C.pX,this.LD,z)
 z="ServiceError "+H.d(this.J6)
-z=this.ct(this,C.YS,this.bN,z)
-this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},
-$isfJ:true},
-dZL:{
+z=this.ct(this,C.YS,this.NM,z)
+this.NM=z
+this.t7=this.ct(this,C.Tc,this.t7,z)},
+$isN7:true},
+wVq:{
 "^":"af+Pi;",
 $isd3:true},
-hR:{
-"^":"w8F;J6,LD,IV,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",308,309],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",308],
-gvJ:[function(a){return this.IV},null,null,1,0,115,"response",308,309],
-svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,116,30,[],"response",308],
+EP:{
+"^":"dZL;J6,LD,IV,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+gfY:function(a){return this.J6},
+sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+gG1:function(a){return this.LD},
+gbA:function(a){return this.IV},
+sbA:function(a,b){this.IV=F.Wi(this,C.F3,this.IV,b)},
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.fy,this.J6,y)
+this.J6=F.Wi(this,C.Lc,this.J6,y)
 y=z.t(b,"message")
-this.LD=F.Wi(this,C.ch,this.LD,y)
+this.LD=F.Wi(this,C.pX,this.LD,y)
 z=z.t(b,"response")
-this.IV=F.Wi(this,C.mE,this.IV,z)
+this.IV=F.Wi(this,C.F3,this.IV,z)
 z="ServiceException "+H.d(this.J6)
-z=this.ct(this,C.YS,this.bN,z)
-this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},
-$ishR:true},
-w8F:{
+z=this.ct(this,C.YS,this.NM,z)
+this.NM=z
+this.t7=this.ct(this,C.Tc,this.t7,z)},
+$isEP:true},
+dZL:{
 "^":"af+Pi;",
 $isd3:true},
 U4:{
-"^":["V4b;dj,JJ<-85,XR<-85,DD>-85,Z3<-85,mu<-85,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null],
-gO3:[function(a){return this.dj},null,null,1,0,312,"url",308,309],
-sO3:[function(a,b){this.dj=F.Wi(this,C.Fh,this.dj,b)},null,null,3,0,32,30,[],"url",308],
+"^":"w8F;dj,Bm<,hp<,DD>,Z3<,mu<,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+gO3:function(a){return this.dj},
 gUm:function(){return!0},
 gM8:function(){return!1},
-bF:function(a,b,c){var z,y,x,w
+bF: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)
 this.dj=x
 if(J.co(x,"file://")||J.co(this.dj,"http://")){y=this.dj
 w=J.U6(y)
-x=w.yn(y,J.WB(w.cn(y,"/"),1))}y=z.t(b,"user_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)
+v=w.cn(y,"/")
+if(typeof v!=="number")return v.g()
+x=w.yn(y,v+1)}y=z.t(b,"user_name")
+y=this.ct(this,C.YS,this.NM,y)
+this.NM=y
+if(J.FN(y)===!0)this.NM=this.ct(this,C.YS,this.NM,x)
 y=z.t(b,"name")
-this.GR=this.ct(this,C.KS,this.GR,y)
+this.t7=this.ct(this,C.Tc,this.t7,y)
 if(c)return
 this.kT=!0
-y=this.P3
-D.ES(b,y.gF1(y))
-y=this.JJ
-w=J.w1(y)
-w.V1(y)
-w.FV(y,z.t(b,"imports"))
-y=this.XR
-w=J.w1(y)
-w.V1(y)
-w.FV(y,z.t(b,"scripts"))
+y=this.Jz
+D.tg(b,y.god(y))
+y=this.Bm
+y.V1(y)
+y.FV(0,z.t(b,"imports"))
+y=this.hp
+y.V1(y)
+y.FV(0,z.t(b,"scripts"))
 y=this.DD
-w=J.w1(y)
-w.V1(y)
-w.FV(y,z.t(b,"classes"))
+y.V1(y)
+y.FV(0,z.t(b,"classes"))
 y=this.Z3
-w=J.w1(y)
-w.V1(y)
-w.FV(y,z.t(b,"variables"))
+y.V1(y)
+y.FV(0,z.t(b,"variables"))
 y=this.mu
-w=J.w1(y)
-w.V1(y)
-w.FV(y,z.t(b,"functions"))},
+y.V1(y)
+y.FV(0,z.t(b,"functions"))},
 $isU4:true},
-V4b:{
+w8F:{
 "^":"af+Pi;",
 $isd3:true},
 c2:{
-"^":["a;Rd<-326,a4>-305",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":"a;Rd<,a4>",
 $isc2:true},
-rj:{
-"^":["Zqa;Sw>-85,u9<-85,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
-gVB:[function(){return this.wJ},null,null,1,0,487,"firstTokenPos",308,309],
-sVB:[function(a){var z=this.wJ
-if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Gd,z,a)
+vx:{
+"^":"V4b;Gd>,u9<,J6,l9,lx,mB,A1,y6,FB,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+gfY:function(a){return this.J6},
+sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+ghY:function(){return this.l9},
+shY:function(a){var z=this.l9
+if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.Gd,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.wJ=a},null,null,3,0,363,30,[],"firstTokenPos",308],
-gug:[function(){return this.lx},null,null,1,0,487,"lastTokenPos",308,309],
-sug:[function(a){var z=this.lx
-if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.kA,z,a)
+this.nq(this,z)}this.l9=a},
+gSK:function(){return this.lx},
+sSK:function(a){var z=this.lx
+if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.kA,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.lx=a},null,null,3,0,363,30,[],"lastTokenPos",308],
+this.nq(this,z)}this.lx=a},
 gUm:function(){return!0},
 gM8:function(){return!0},
-rK:function(a){return J.UQ(this.Sw,J.xH(a,1))},
+rK:function(a){var z,y
+z=J.Hn(a,1)
+y=this.Gd.Xk
+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
+bF:function(a,b,c){var z,y,x,w
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.fy,this.J6,y)
+this.J6=F.Wi(this,C.Lc,this.J6,y)
 y=z.t(b,"name")
-this.wA=y
+this.A1=y
 x=J.U6(y)
-y=x.yn(y,J.WB(x.cn(y,"/"),1))
-this.mB=y
-this.bN=this.ct(this,C.YS,this.bN,y)
-y=this.wA
-this.GR=this.ct(this,C.KS,this.GR,y)
+w=x.cn(y,"/")
+if(typeof w!=="number")return w.g()
+w=x.yn(y,w+1)
+this.mB=w
+this.NM=this.ct(this,C.YS,this.NM,w)
+w=this.A1
+this.t7=this.ct(this,C.Tc,this.t7,w)
 this.W8(z.t(b,"source"))
-this.up(z.t(b,"tokenPosTable"))},
-up:function(a){var z,y,x,w,v,u,t,s,r
+this.PT(z.t(b,"tokenPosTable"))},
+PT:function(a){var z,y,x,w,v,u,t,s,r
 if(a==null)return
 this.y6=P.Fl(null,null)
 this.FB=P.Fl(null,null)
-this.wJ=F.Wi(this,C.Gd,this.wJ,null)
+this.l9=F.Wi(this,C.Gd,this.l9,null)
 this.lx=F.Wi(this,C.kA,this.lx,null)
-for(z=J.GP(a);z.G();){y=z.gl()
+for(z=J.mY(a);z.G();){y=z.gl()
 x=J.U6(y)
 w=x.t(y,0)
 v=1
@@ -15349,105 +14615,93 @@
 if(!(v<u))break
 t=x.t(y,v)
 s=x.t(y,v+1)
-u=this.wJ
-if(u==null){if(this.gnz(this)&&!J.de(u,t)){u=new T.qI(this,C.Gd,u,t)
+u=this.l9
+if(u==null){if(this.gnz(this)&&!J.xC(u,t)){u=new T.qI(this,C.Gd,u,t)
 u.$builtinTypeInfo=[null]
-this.nq(this,u)}this.wJ=t
+this.nq(this,u)}this.l9=t
 u=this.lx
-if(this.gnz(this)&&!J.de(u,t)){u=new T.qI(this,C.kA,u,t)
+if(this.gnz(this)&&!J.xC(u,t)){u=new T.qI(this,C.kA,u,t)
 u.$builtinTypeInfo=[null]
-this.nq(this,u)}this.lx=t}else{u=J.Bl(u,t)?this.wJ:t
-r=this.wJ
-if(this.gnz(this)&&!J.de(r,u)){r=new T.qI(this,C.Gd,r,u)
+this.nq(this,u)}this.lx=t}else{u=J.Bl(u,t)?this.l9:t
+r=this.l9
+if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.Gd,r,u)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.wJ=u
+this.nq(this,r)}this.l9=u
 u=J.J5(this.lx,t)?this.lx:t
 r=this.lx
-if(this.gnz(this)&&!J.de(r,u)){r=new T.qI(this,C.kA,r,u)
+if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.kA,r,u)
 r.$builtinTypeInfo=[null]
 this.nq(this,r)}this.lx=u}this.y6.u(0,t,w)
 this.FB.u(0,t,s)
 v+=2}}},
-vW:function(a){var z,y,x,w,v
+vW:function(a){var z,y,x,w
 z=J.U6(a)
 y=this.u9
-x=J.w1(y)
-w=0
-while(!0){v=z.gB(a)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-x.u(y,z.t(a,w),z.t(a,w+1))
-w+=2}},
-W8:function(a){var z,y,x,w,v
+x=0
+while(!0){w=z.gB(a)
+if(typeof w!=="number")return H.s(w)
+if(!(x<w))break
+y.u(0,z.t(a,x),z.t(a,x+1))
+x+=2}},
+W8:function(a){var z,y,x,w
 this.kT=!1
 if(a==null)return
 z=J.uH(a,"\n")
 if(z.length===0)return
 this.kT=!0
-y=this.Sw
-x=J.w1(y)
-x.V1(y)
-N.Jx("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
-for(w=0;w<z.length;w=v){v=w+1
-x.h(y,new D.c2(v,z[w]))}},
-$isrj:true},
-Zqa:{
+y=this.Gd
+y.V1(y)
+N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.A1))
+for(x=0;x<z.length;x=w){w=x+1
+y.h(0,new D.c2(w,z[x]))}},
+$isvx:true},
+V4b:{
 "^":"af+Pi;",
 $isd3:true},
-N8:{
+uA:{
 "^":"a;Yu<,Du<,fF<",
-$isN8:true},
-Z9:{
-"^":["Pi;Yu<,LR<-326,VF<-326,KO<-326,fY>-305,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
-gNl:[function(a){return this.ar},null,null,1,0,513,"script",308,309],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,514,30,[],"script",308],
-gUE:[function(){return this.MT},null,null,1,0,312,"formattedLine",308,309],
-sUE:[function(a){this.MT=F.Wi(this,C.Zt,this.MT,a)},null,null,3,0,32,30,[],"formattedLine",308],
-c9s:[function(){var z,y
-z=this.LR
+$isuA:true},
+HJ:{
+"^":"Pi;Yu<,Ix,VF<,Yn,fY>,ar,MT,AP,fn",
+gIs:function(a){return this.ar},
+sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
+gP3:function(){return this.MT},
+JM:[function(){var z,y
+z=this.Ix
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","guV",0,0,312,"formattedDeoptId",308],
-M2Y:[function(){var z,y
-z=this.VF
-y=J.x(z)
-if(y.n(z,-1))return""
-return y.bu(z)},"$0","gZO",0,0,312,"formattedTokenPos",308],
+return y.bu(z)},"$0","gkA",0,0,153],
 bR:function(a){var z,y
-this.ar=F.Wi(this,C.fX,this.ar,null)
+this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
-if(J.de(z,-1))return
+if(J.xC(z,-1))return
 y=a.q6(z)
 if(y==null)return
-this.ar=F.Wi(this,C.fX,this.ar,a)
-z=J.nJ(a.rK(y))
-this.MT=F.Wi(this,C.Zt,this.MT,z)},
-$isZ9:true},
-Q4:{
-"^":["Pi;Yu<-326,Fm<-305,L4<-305,dh,uH@-540,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
-gwi:[function(){return this.dh},null,null,1,0,541,"jumpTarget",308,309],
-swi:[function(a){var z=this.dh
-if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Qn,z,a)
-z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.dh=a},null,null,3,0,542,30,[],"jumpTarget",308],
-gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,307,"isComment",308],
-ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,307,"hasDescriptors",308],
+this.ar=F.Wi(this,C.PX,this.ar,a)
+z=J.dY(a.rK(y))
+this.MT=F.Wi(this,C.oI,this.MT,z)},
+$isHJ:true},
+DP:{
+"^":"Pi;Yu<,Fm,L4<,dh,uH<,AP,fn",
+gEB:function(){return this.dh},
+gUB:function(){return J.xC(this.Yu,0)},
+gGf:function(){return this.uH.Xk.length>0},
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,312,"formattedAddress",308],
-Io:[function(a){var z
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,153],
+io:[function(a){var z
 if(a==null)return""
-z=J.UQ(a.gOo(),this.Yu)
+z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
-if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,543,154,[],"formattedInclusive",308],
+if(J.xC(z.gfF(),z.gDu()))return""
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,154,50],
 HU:[function(a){var z
 if(a==null)return""
-z=J.UQ(a.gOo(),this.Yu)
+z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,543,154,[],"formattedExclusive",308],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,154,50],
 eQ:function(){var z,y,x,w
 y=J.uH(this.L4," ")
 x=y.length
@@ -15458,144 +14712,130 @@
 try{x=H.BU(z,16,null)
 return x}catch(w){H.Ru(w)
 return 0}},
-ZA:function(a){var z,y,x,w,v,u
+Sd:function(a){var z,y,x,w,v
 z=this.L4
 if(!J.co(z,"j"))return
 y=this.eQ()
 x=J.x(y)
-if(x.n(y,0)){P.JS("Could not determine jump address for "+H.d(z))
-return}z=J.U6(a)
-w=0
-while(!0){v=z.gB(a)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-u=z.t(a,w)
-if(J.de(u.gYu(),y)){z=this.dh
-if(this.gnz(this)&&!J.de(z,u)){z=new T.qI(this,C.Qn,z,u)
+if(x.n(y,0)){P.FL("Could not determine jump address for "+H.d(z))
+return}for(z=a.Xk,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=u
-return}++w}P.JS("Could not find instruction at "+x.WZ(y,16))},
-$isQ4:true,
-static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","I9",4,0,null,118,[],119,[]]}},
+this.nq(this,z)}this.dh=v
+return}}P.FL("Could not find instruction at "+x.WZ(y,16))},
+$isDP:true,
+static:{Tn:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
 WAE:{
 "^":"a;uX",
 bu:function(a){return this.uX},
-static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
-if(z.n(a,"Native"))return C.nj
+static:{"^":"Oci,bS,WAg,AA,Z7U",CQ:function(a){var z=J.x(a)
+if(z.n(a,"Native"))return C.Oc
 else if(z.n(a,"Dart"))return C.l8
 else if(z.n(a,"Collected"))return C.WA
 else if(z.n(a,"Reused"))return C.yP
-else if(z.n(a,"Tag"))return C.oA
-N.Jx("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.hS())},"$1","Ma",2,0,null,94,[]]}},
-Vi:{
+else if(z.n(a,"Tag"))return C.Z7
+N.QM("").j2("Unknown code kind "+H.d(a))
+throw H.b(P.a9())}}},
+ta:{
 "^":"a;tT>,Av<",
-$isVi:true},
-t9:{
-"^":"a;tT>,Av<,wd>,Jv",
-$ist9:true},
+$ista:true},
+D5:{
+"^":"a;tT>,Av<,ks>,Jv",
+$isD5:true},
 kx:{
-"^":["D3i;J6,xM,Du@-326,fF@-326,vg@-326,Mb@-326,VS<-85,ci<-85,va<-85,Oo<-85,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,544,"kind",308,309],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,545,30,[],"kind",308],
-glt:[function(){return this.xM},null,null,1,0,487,"totalSamplesInProfile",308,309],
-slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,363,30,[],"totalSamplesInProfile",308],
-gS7:[function(){return this.mM},null,null,1,0,312,"formattedInclusiveTicks",308,309],
-sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",308],
-gN8:[function(){return this.qH},null,null,1,0,312,"formattedExclusiveTicks",308,309],
-sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",308],
-gL1E:[function(){return this.Ni},null,null,1,0,337,"objectPool",308,309],
-sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,338,30,[],"objectPool",308],
-gMj:[function(a){return this.MO},null,null,1,0,337,"function",308,309],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,338,30,[],"function",308],
-gNl:[function(a){return this.ar},null,null,1,0,513,"script",308,309],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,514,30,[],"script",308],
-gur:[function(){return this.MH},null,null,1,0,307,"isOptimized",308,309],
-sur:[function(a){this.MH=F.Wi(this,C.FQ,this.MH,a)},null,null,3,0,310,30,[],"isOptimized",308],
+"^":"Zqa;J6,xM,Du<,fF<,Oj,Mb,VS,ci,va<,Oo<,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+gfY:function(a){return this.J6},
+sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+glt:function(){return this.xM},
+gS7:function(){return this.mM},
+gan:function(){return this.qH},
+gL1:function(){return this.Ni},
+sL1:function(a){this.Ni=F.Wi(this,C.zO,this.Ni,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},
 gM8:function(){return!0},
 tx:[function(a){var z,y
-this.ar=F.Wi(this,C.fX,this.ar,a)
-for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,546,547,[]],
-QW:function(){if(this.ar!=null)return
-if(!J.de(this.J6,C.l8))return
+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","guL",2,0,155,156],
+OF:function(){if(this.ar!=null)return
+if(!J.xC(this.J6,C.l8))return
 var z=this.MO
 if(z==null)return
 if(J.UQ(z,"script")==null){J.SK(this.MO).ml(new D.Em(this))
-return}J.SK(J.UQ(this.MO,"script")).ml(this.gKn())},
-VD:function(a){if(J.de(this.J6,C.l8))return D.af.prototype.VD.call(this,this)
-return P.Ab(this,null)},
-fp:function(a,b,c){var z,y,x,w,v,u
+return}J.SK(J.UQ(this.MO,"script")).ml(this.guL())},
+VD:function(a){if(J.xC(this.J6,C.l8))return D.af.prototype.VD.call(this,this)
+return P.PG(this,null)},
+bd:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
-y=J.w1(a)
-x=0
-while(!0){w=z.gB(b)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-v=H.BU(z.t(b,x),null,null)
-u=H.BU(z.t(b,x+1),null,null)
-if(v>>>0!==v||v>=c.length)return H.e(c,v)
-y.h(a,new D.Vi(c[v],u))
-x+=2}y.GT(a,new D.fx())},
+y=0
+while(!0){x=z.gB(b)
+if(typeof x!=="number")return H.s(x)
+if(!(y<x))break
+w=H.BU(z.t(b,y),null,null)
+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.ta(c[w],v))
+y+=2}H.rd(a,new D.fx())},
 eL:function(a,b,c){var z,y
-this.xM=F.Wi(this,C.QK,this.xM,c)
+this.xM=F.Wi(this,C.Kj,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.fp(this.VS,z.t(a,"callers"),b)
-this.fp(this.ci,z.t(a,"callees"),b)
+this.bd(this.VS,z.t(a,"callers"),b)
+this.bd(this.ci,z.t(a,"callees"),b)
 y=z.t(a,"ticks")
-if(y!=null)this.pd(y)
-z=D.Vb(this.fF,this.xM)+" ("+H.d(this.fF)+")"
+if(y!=null)this.qL(y)
+z=D.Rd(this.fF,this.xM)+" ("+H.d(this.fF)+")"
 this.mM=F.Wi(this,C.eF,this.mM,z)
-z=D.Vb(this.Du,this.xM)+" ("+H.d(this.Du)+")"
+z=D.Rd(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
 z=J.U6(b)
 this.oc=z.t(b,"user_name")
 this.zz=z.t(b,"name")
 y=z.t(b,"isOptimized")!=null&&z.t(b,"isOptimized")
-this.MH=F.Wi(this,C.FQ,this.MH,y)
+this.MH=F.Wi(this,C.pY,this.MH,y)
 y=D.CQ(z.t(b,"kind"))
-this.J6=F.Wi(this,C.fy,this.J6,y)
-this.vg=H.BU(z.t(b,"start"),16,null)
+this.J6=F.Wi(this,C.Lc,this.J6,y)
+this.Oj=H.BU(z.t(b,"start"),16,null)
 this.Mb=H.BU(z.t(b,"end"),16,null)
-y=this.P3
-y=y.gF1(y)
-x=y.Zr(z.t(b,"function"))
+y=this.Jz
+x=y.god(y).Qn(z.t(b,"function"))
 this.MO=F.Wi(this,C.nf,this.MO,x)
-y=y.Zr(z.t(b,"object_pool"))
-this.Ni=F.Wi(this,C.xG,this.Ni,y)
+y=y.god(y).Qn(z.t(b,"object_pool"))
+this.Ni=F.Wi(this,C.zO,this.Ni,y)
 w=z.t(b,"disassembly")
-if(w!=null)this.xs(w)
+if(w!=null)this.zl(w)
 v=z.t(b,"descriptors")
-if(v!=null)this.DZ(J.UQ(v,"members"))
-z=this.va
-y=J.U6(z)
-this.kT=!J.de(y.gB(z),0)||!J.de(this.J6,C.l8)
-z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
+if(v!=null)this.WY(J.UQ(v,"members"))
+z=this.va.Xk
+this.kT=z.length!==0||!J.xC(this.J6,C.l8)
+z=z.length!==0&&J.xC(this.J6,C.l8)
 this.TD=F.Wi(this,C.zS,this.TD,z)},
-gvS:[function(){return this.TD},null,null,1,0,307,"hasDisassembly",308,309],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,310,30,[],"hasDisassembly",308],
-xs:function(a){var z,y,x,w,v,u,t,s,r
+gUa:function(){return this.TD},
+zl:function(a){var z,y,x,w,v,u,t,s
 z=this.va
-y=J.w1(z)
-y.V1(z)
-x=J.U6(a)
-w=0
-while(!0){v=x.gB(a)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-u=x.t(a,w+1)
-t=x.t(a,w+2)
-s=!J.de(x.t(a,w),"")?H.BU(x.t(a,w),null,null):0
-v=D.Z9
-r=[]
-r.$builtinTypeInfo=[v]
-r=new Q.wn(null,null,r,null,null)
-r.$builtinTypeInfo=[v]
-y.h(z,new D.Q4(s,u,t,null,r,null,null))
-w+=3}for(y=y.gA(z);y.G();)y.gl().ZA(z)},
+z.V1(z)
+y=J.U6(a)
+x=0
+while(!0){w=y.gB(a)
+if(typeof w!=="number")return H.s(w)
+if(!(x<w))break
+v=y.t(a,x+1)
+u=y.t(a,x+2)
+t=!J.xC(y.t(a,x),"")?H.BU(y.t(a,x),null,null):0
+w=D.HJ
+s=[]
+s.$builtinTypeInfo=[w]
+s=new Q.wn(null,null,s,null,null)
+s.$builtinTypeInfo=[w]
+z.h(0,new D.DP(t,v,u,null,s,null,null))
+x+=3}for(y=z.gA(z);y.G();)y.lo.Sd(z)},
 Ry:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=H.BU(z.t(a,"pc"),16,null)
@@ -15603,124 +14843,119 @@
 w=z.t(a,"tokenPos")
 v=z.t(a,"tryIndex")
 u=J.rr(z.t(a,"kind"))
-for(z=J.GP(this.va);z.G();){t=z.gl()
-if(J.de(t.gYu(),y)){J.wT(t.guH(),new D.Z9(y,x,w,v,u,null,null,null,null))
-return}}N.Jx("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
-DZ:function(a){var z
-for(z=J.GP(a);z.G();)this.Ry(z.gl())},
-pd:function(a){var z,y,x,w,v,u
+for(z=this.va,z=z.gA(z);z.G();){t=z.lo
+if(J.xC(t.gYu(),y)){t.guH().h(0,new D.HJ(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.Ry(z.gl())},
+qL:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=this.Oo
-x=J.w1(y)
-w=0
-while(!0){v=z.gB(a)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-u=H.BU(z.t(a,w),16,null)
-x.u(y,u,new D.N8(u,H.BU(z.t(a,w+1),null,null),H.BU(z.t(a,w+2),null,null)))
-w+=3}},
-tg:function(a,b){J.J5(b,this.vg)
+x=0
+while(!0){w=z.gB(a)
+if(typeof w!=="number")return H.s(w)
+if(!(x<w))break
+v=H.BU(z.t(a,x),16,null)
+y.u(0,v,new D.uA(v,H.BU(z.t(a,x+1),null,null),H.BU(z.t(a,x+2),null,null)))
+x+=3}},
+tg:function(a,b){J.J5(b,this.Oj)
 return!1},
-gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,307,"isDartCode",308],
+gkU:function(){return J.xC(this.J6,C.l8)},
 $iskx:true,
-static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","Mr",4,0,null,118,[],119,[]]}},
-D3i:{
+static:{Rd:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
+Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 Em:{
-"^":"Tp:116;a",
+"^":"Xs:10;a",
 $1:[function(a){var z,y
 z=this.a
 y=J.UQ(z.MO,"script")
 if(y==null)return
-J.SK(y).ml(z.gKn())},"$1",null,2,0,null,548,[],"call"],
+J.SK(y).ml(z.guL())},"$1",null,2,0,null,157,"call"],
 $isEH:true},
 fx:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,118,[],199,[],"call"],
+"^":"Xs:51;",
+$2:function(a,b){return J.Hn(b.gAv(),a.gAv())},
 $isEH:true},
-UZ:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z,y
+Qf:{
+"^":"Xs:51;a,b",
+$2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
-if(y&&D.D5(b))this.a.u(0,a,this.b.Zr(b))
+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)},"$2",null,4,0,null,376,[],122,[],"call"],
+else if(y)D.Gf(b,this.b)},
 $isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
 "^":"",
-zMr:{
-"^":["V31;jA%-549,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.jA},null,null,1,0,550,"error",308,311],
-skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,551,30,[],"error",308],
-"@":function(){return[C.uvO]},
-static:{hp:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+zM:{
+"^":"V33;MK,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gkc:function(a){return a.MK},
+skc:function(a,b){a.MK=this.ct(a,C.yh,a.MK,b)},
+static:{cE:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.SX.ZL(a)
-C.SX.oX(a)
-return a},null,null,0,0,115,"new ServiceErrorViewElement$created"]}},
-"+ServiceErrorViewElement":[552],
-V31:{
+C.SX.XI(a)
+return a}}},
+V33:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
 "^":"",
-nk:{
-"^":["V32;Xc%-553,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFA:[function(a){return a.Xc},null,null,1,0,554,"exception",308,311],
-sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,555,30,[],"exception",308],
-"@":function(){return[C.vr3]},
-static:{dS:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+Rk:{
+"^":"V34;Xc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gja:function(a){return a.Xc},
+sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
+static:{ma:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.Vd.ZL(a)
-C.Vd.oX(a)
-return a},null,null,0,0,115,"new ServiceExceptionViewElement$created"]}},
-"+ServiceExceptionViewElement":[556],
-V32:{
+C.Vd.XI(a)
+return a}}},
+V34:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
 XK:{
-"^":"zM;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+"^":"wv;Jf,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
 z6:function(a,b){var z
-N.Jx("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
+N.QM("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
 z=this.Jf
 if(typeof z!=="string")return z.g()
-return W.It(J.WB(z,b),null,null).OA(new U.dT())},
+return W.It(J.ew(z,b),null,null).OA(new U.dT())},
 SC:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
 dT:{
-"^":"Tp:116;",
+"^":"Xs:10;",
 $1:[function(a){var z
-N.Jx("").hh("HttpRequest.getString failed.")
+N.QM("").YX("HttpRequest.getString failed.")
 z=J.RE(a)
 z.gN(a)
-return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,171,[],"call"],
+return C.zc.KP(P.EF(["type","ServiceException","id","","response",J.lN(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,21,"call"],
 $isEH:true},
-ho:{
-"^":"zM;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+bl:{
+"^":"wv;ba,yb,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
 q3:[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")
 w=J.UQ(z.gRn(a),"data")
-if(!J.de(x,"observatoryData"))return
-z=this.ja
+if(!J.xC(x,"observatoryData"))return
+z=this.ba
 v=z.t(0,y)
 z.Rz(0,y)
-J.Xf(v,w)},"$1","gVx",2,0,169,22,[]],
+J.KD(v,w)},"$1","gVx",2,0,17,158],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -15728,685 +14963,824 @@
 y.u(0,"method","observatoryQuery")
 y.u(0,"query","/"+H.d(b));++this.yb
 x=H.VM(new P.Zf(P.Dt(null)),[null])
-this.ja.u(0,z,x)
-J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
+this.ba.u(0,z,x)
+J.vI(W.Pv(window.parent),C.zc.KP(y),"*")
 return x.MM},
-PI:function(){var z=C.Ns.aM(window)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
-N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
+PI:function(){var z=H.VM(new W.RO(window,C.ph.Ph,!1),[null])
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
+N.QM("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
-ob:{
-"^":["V33;mC%-341,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gWA:[function(a){return a.mC},null,null,1,0,320,"object",308,311],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,321,30,[],"object",308],
-hu:[function(a){var z
-switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
-J.CJ(z,a.mC)
+Ti:{
+"^":"V35;Ll,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gWA:function(a){return a.Ll},
+sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
+Xq:function(a){var z
+switch(a.Ll.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
+J.CJ(z,a.Ll)
 return z
 case"BreakpointList":z=W.r3("breakpoint-list",null)
-J.oJ(z,a.mC)
+J.oJ(z,a.Ll)
 return z
 case"Class":z=W.r3("class-view",null)
-J.ve(z,a.mC)
+J.o0(z,a.Ll)
 return z
 case"Code":z=W.r3("code-view",null)
-J.fH(z,a.mC)
+J.fH(z,a.Ll)
 return z
 case"Error":z=W.r3("error-view",null)
-J.Qr(z,a.mC)
+J.Qr(z,a.Ll)
 return z
 case"Field":z=W.r3("field-view",null)
-J.JZ(z,a.mC)
+J.JZ(z,a.Ll)
 return z
 case"Function":z=W.r3("function-view",null)
-J.dk(z,a.mC)
+J.Mu(z,a.Ll)
 return z
 case"HeapMap":z=W.r3("heap-map",null)
-J.Nf(z,a.mC)
+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)
-J.ti(z,a.mC)
+J.Qy(z,a.Ll)
+return z
+case"IO":z=W.r3("io-view",null)
+J.mU(z,a.Ll)
+return z
+case"HttpServerList":z=W.r3("io-http-server-list-view",null)
+J.A4(z,a.Ll)
+return z
+case"HttpServer":z=W.r3("io-http-server-view",null)
+J.fb(z,a.Ll)
 return z
 case"Isolate":z=W.r3("isolate-view",null)
-J.kq(z,a.mC)
+J.uM(z,a.Ll)
 return z
 case"Library":z=W.r3("library-view",null)
-J.F6(z,a.mC)
+J.cl(z,a.Ll)
 return z
 case"Profile":z=W.r3("isolate-profile",null)
-J.CJ(z,a.mC)
+J.CJ(z,a.Ll)
 return z
 case"ServiceError":z=W.r3("service-error-view",null)
-J.Qr(z,a.mC)
+J.Qr(z,a.Ll)
 return z
 case"ServiceException":z=W.r3("service-exception-view",null)
-J.cm(z,a.mC)
+J.BC(z,a.Ll)
 return z
 case"Script":z=W.r3("script-view",null)
-J.Tt(z,a.mC)
+J.ZI(z,a.Ll)
 return z
 case"StackTrace":z=W.r3("stack-trace",null)
-J.yO(z,a.mC)
+J.yO(z,a.Ll)
 return z
 case"VM":z=W.r3("vm-view",null)
-J.rK(z,a.mC)
+J.tQ(z,a.Ll)
 return z
 default:z=W.r3("json-view",null)
-J.wD(z,a.mC)
-return z}},"$0","gbs",0,0,557,"_constructElementForObject"],
-xJ:[function(a,b){var z,y,x
+J.wD(z,a.Ll)
+return z}},
+fa:[function(a,b){var z,y,x
 this.pj(a)
-z=a.mC
-if(z==null){N.Jx("").To("Viewing null object.")
+z=a.Ll
+if(z==null){N.QM("").To("Viewing null object.")
 return}y=z.gzS()
-x=this.hu(a)
-if(x==null){N.Jx("").To("Unable to find a view element for '"+H.d(y)+"'")
+x=this.Xq(a)
+if(x==null){N.QM("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,116,242,[],"objectChanged"],
-"@":function(){return[C.Tl]},
-static:{lv:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.ZO.ZL(a)
-C.ZO.oX(a)
-return a},null,null,0,0,115,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[558],
-V33:{
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,10,35],
+static:{lv:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.th.ZL(a)
+C.th.XI(a)
+return a}}},
+V35:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["Vfx;tY%-341,Pe%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gnv:[function(a){return a.tY},null,null,1,0,320,"ref",308,311],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,321,30,[],"ref",308],
-gjT:[function(a){return a.Pe},null,null,1,0,307,"internal",308,311],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,310,30,[],"internal",308],
-P9:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
+"^":"pv;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gnv:function(a){return a.tY},
+snv:function(a,b){a.tY=this.ct(a,C.xP,a.tY,b)},
+gjT:function(a){return a.Pe},
+sjT:function(a,b){a.Pe=this.ct(a,C.uu,a.Pe,b)},
+Qj:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.KG,0,1)
-this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,169,242,[],"refChanged"],
-gO3:[function(a){var z=a.tY
+this.ct(a,C.pu,0,1)
+this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,17,35],
+gO3:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,312,"url"],
-gOL:[function(a){var z=a.tY
+return z.gHP()},
+gJp:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,312,"serviceId"],
-gD5:[function(a){var z=a.tY
+return z.gzz()},
+goc:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,312,"hoverText"],
-goc:[function(a){var z=a.tY
-if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,312,"name"],
-gRw:[function(a){return J.FN(this.goc(a))},null,null,1,0,307,"nameIsEmpty"],
-"@":function(){return[C.JD]},
-static:{lK:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+return J.O6(z)},
+gWw:function(a){return J.FN(this.goc(a))},
+static:{lK:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.wU.ZL(a)
-C.wU.oX(a)
-return a},null,null,0,0,115,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[559],
-Vfx:{
+a.on=z
+a.BA=y
+a.LL=w
+C.HR.ZL(a)
+C.HR.XI(a)
+return a}}},
+pv:{
 "^":"uL+Pi;",
 $isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
 "^":"",
-Uj:{
-"^":["LPc;kF%-304,IK%-305,No%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gTq:[function(a){return a.kF},null,null,1,0,307,"checked",308,311],
-sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,310,30,[],"checked",308],
-gEu:[function(a){return a.IK},null,null,1,0,312,"checkedText",308,311],
-sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",308],
-gRY:[function(a){return a.No},null,null,1,0,312,"uncheckedText",308,311],
-sRY:[function(a,b){a.No=this.ct(a,C.WY,a.No,b)},null,null,3,0,32,30,[],"uncheckedText",308],
-RC:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,350,21,[],560,[],82,[],"change"],
-"@":function(){return[C.mS]},
-static:{Al:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.fA.ZL(a)
-C.fA.oX(a)
-return a},null,null,0,0,115,"new SlidingCheckboxElement$created"]}},
-"+SlidingCheckboxElement":[561],
-LPc:{
-"^":"xc+Pi;",
-$isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
+CY:{
+"^":"Xfs;wG,IK,bP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gd4:function(a){return a.wG},
+sd4:function(a,b){a.wG=this.ct(a,C.bk,a.wG,b)},
+gEu:function(a){return a.IK},
+sEu:function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},
+gRY:function(a){return a.bP},
+sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
+XF:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+a.wG=this.ct(a,C.bk,a.wG,z)},"$3","gQU",6,0,70,1,159,72],
+static:{Al:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.Yo.ZL(a)
+C.Yo.XI(a)
+return a}}},
+Xfs:{
+"^":"ir+Pi;",
+$isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
 "^":"",
-xT:{
-"^":["V34;rd%-451,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.rd},null,null,1,0,453,"frame",308,311],
-sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,454,30,[],"frame",308],
-"@":function(){return[C.Xv]},
-static:{an:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+Wq:{
+"^":"a;c1,BH,Mg,QR,ER,Ja,MR,tu",
+WO:function(a,b){return this.tu.$1(b)},
+bu:function(a){var z=P.p9("")
+z.KF("(options:")
+z.KF(this.c1?"fields ":"")
+z.KF(this.BH?"properties ":"")
+z.KF(this.Ja?"methods ":"")
+z.KF(this.Mg?"inherited ":"_")
+z.KF(this.ER?"no finals ":"")
+z.KF("annotations: "+H.d(this.MR))
+z.KF(this.tu!=null?"with matcher":"")
+z.KF(")")
+return z.vM}},
+ES:{
+"^":"a;oc>,fY>,V5>,t5>,Fo,Dv<",
+gHO:function(){return this.fY===C.nU},
+gUd:function(){return this.fY===C.BM},
+gUA:function(){return this.fY===C.it},
+giO:function(a){var z=this.oc
+return z.giO(z)},
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isES&&this.oc.n(0,b.oc)&&this.fY===b.fY&&this.V5===b.V5&&this.t5.n(0,b.t5)&&this.Fo===b.Fo&&X.W4(this.Dv,b.Dv,!1)},
+bu:function(a){var z=P.p9("")
+z.KF("(declaration ")
+z.KF(this.oc)
+z.KF(this.fY===C.BM?" (property) ":" (method) ")
+z.KF(this.V5?"final ":"")
+z.KF(this.Fo?"static ":"")
+z.KF(this.Dv)
+z.KF(")")
+return z.vM},
+$isES:true},
+iYn:{
+"^":"a;fY>"}}],["smoke.src.common","package:smoke/src/common.dart",,X,{
+"^":"",
+Na:function(a,b,c){var z,y
+z=a.length
+if(z<b){y=Array(b)
+y.fixed$length=init
+H.qG(y,0,z,a,0)
+return y}if(z>c){z=Array(c)
+z.fixed$length=init
+H.qG(z,0,c,a,0)
+return z}return a},
+ZO:function(a,b){var z,y,x,w,v,u
+z=new H.a7(a,a.length,0,null)
+z.$builtinTypeInfo=[H.Kp(a,0)]
+for(;z.G();){y=z.lo
+b.length
+x=new H.a7(b,1,0,null)
+x.$builtinTypeInfo=[H.Kp(b,0)]
+w=J.x(y)
+for(;x.G();){v=x.lo
+if(w.n(y,v))return!0
+if(!!J.x(v).$isuq){u=w.gbx(y)
+u=$.yQ().aG(u,v)}else u=!1
+if(u)return!0}}return!1},
+Lx:function(a){var z,y
+z=H.G3()
+y=H.KT(z).BD(a)
+if(y)return 0
+y=H.KT(z,[z]).BD(a)
+if(y)return 1
+y=H.KT(z,[z,z]).BD(a)
+if(y)return 2
+z=H.KT(z,[z,z,z]).BD(a)
+if(z)return 3
+return 4},
+aW:function(a){var z,y
+z=H.G3()
+y=H.KT(z,[z,z,z]).BD(a)
+if(y)return 3
+y=H.KT(z,[z,z]).BD(a)
+if(y)return 2
+y=H.KT(z,[z]).BD(a)
+if(y)return 1
+z=H.KT(z).BD(a)
+if(z)return 0
+return-1},
+W4:function(a,b,c){var z,y,x,w,v
+z=a.length
+y=b.length
+if(z!==y)return!1
+if(c){x=P.Ls(null,null,null,null)
+x.FV(0,b)
+for(w=0;w<a.length;++w)if(!x.tg(0,a[w]))return!1}else for(w=0;w<z;++w){v=a[w]
+if(w>=y)return H.e(b,w)
+if(v!==b[w])return!1}return!0}}],["smoke.src.implementation","package:smoke/src/implementation.dart",,D,{
+"^":"",
+kP:function(){throw H.b(P.FM("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,{
+"^":"",
+Oj:{
+"^":"a;tO,F8,lk,BJ,fu,af<,yQ"},
+LT:{
+"^":"a;Gu,Gl,N5",
+jD:function(a,b){var z=this.Gu.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.Gl.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
+z=null
+if(!!J.x(a).$isuq){this.N5.t(0,a)
+z=null}else{x=this.Gu.t(0,b)
+z=x==null?null:x.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
+y=null
+if(d){w=X.Lx(z)
+if(w>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,w,P.y(w,J.q8(c)))}else{v=X.aW(z)
+u=v>=0?v:J.q8(c)
+c=X.Na(c,w,u)}}try{u=H.im(z,c,P.Te(null))
+return u}catch(t){if(!!J.x(H.Ru(t)).$ismp){if(y!=null)P.FL(y)
+throw t}else throw t}}},
+bY:{
+"^":"a;Mp,Cu,u4",
+aG:function(a,b){var z,y,x
+if(a.n(0,b)||b.n(0,C.FQ))return!0
+for(z=this.Mp;!J.xC(a,C.FQ);a=y){y=z.t(0,a)
+x=J.x(y)
+if(x.n(y,b))return!0
+if(y==null){if(!this.u4)return!1
+throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+x.bu(y)+")"))}}return!1},
+UK:function(a,b){var z=this.Qk(a,b)
+return z!=null&&z.fY===C.it&&!z.Fo},
+n6:function(a,b){var z,y
+z=this.Cu.t(0,a)
+if(z==null){if(!this.u4)return!1
+throw H.b(O.lA("declarations for "+H.d(a)))}y=z.t(0,b)
+return y!=null&&y.fY===C.it&&y.Fo},
+CV:function(a,b){var z=this.Qk(a,b)
+if(z==null){if(!this.u4)return
+throw H.b(O.lA("declaration for "+H.d(a)+"."+H.d(b)))}return z},
+Me:function(a,b,c){var z,y,x,w,v,u
+z=[]
+if(c.Mg){y=this.Mp.t(0,b)
+if(y==null){if(this.u4)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!y.n(0,c.QR))z=this.Me(0,y,c)}x=this.Cu.t(0,b)
+if(x==null){if(!this.u4)return z
+throw H.b(O.lA("declarations for "+H.d(b)))}for(w=J.mY(x.gUQ(x));w.G();){v=w.gl()
+if(!c.c1&&v.gHO())continue
+if(!c.BH&&v.gUd())continue
+if(c.ER&&J.ql(v)===!0)continue
+if(!c.Ja&&v.gUA())continue
+if(c.tu!=null&&c.WO(0,J.O6(v))!==!0)continue
+u=c.MR
+if(u!=null&&!X.ZO(v.gDv(),u))continue
+z.push(v)}return z},
+Qk:function(a,b){var z,y,x,w,v
+for(z=this.Mp,y=this.Cu;!J.xC(a,C.FQ);a=v){x=y.t(0,a)
+if(x!=null){w=x.t(0,b)
+if(w!=null)return w}v=z.t(0,a)
+if(v==null){if(!this.u4)return
+throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
+ut:{
+"^":"a;eB,d8",
+Ut:function(a){this.eB.aN(0,new O.Fi(this))},
+static:{ty:function(a){var z=new O.ut(a.af,P.Fl(null,null))
+z.Ut(a)
+return z}}},
+Fi:{
+"^":"Xs:51;a",
+$2:function(a,b){this.a.d8.u(0,b,a)},
+$isEH:true},
+tk:{
+"^":"a;uh",
+bu:function(a){return"Missing "+this.uh+". Code generation for the smoke package seems incomplete."},
+static:{lA:function(a){return new O.tk(a)}}}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
+"^":"",
+nm:{
+"^":"V36;xP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gM6:function(a){return a.xP},
+sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
+static:{an:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.dX.ZL(a)
-C.dX.oX(a)
-return a},null,null,0,0,115,"new StackFrameElement$created"]}},
-"+StackFrameElement":[562],
-V34:{
+C.dX.XI(a)
+return a}}},
+V36:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
-uwf:{
-"^":["V35;B3%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtN:[function(a){return a.B3},null,null,1,0,337,"trace",308,311],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,338,30,[],"trace",308],
-pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.js]},
-static:{bV:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.bg.ZL(a)
-C.bg.oX(a)
-return a},null,null,0,0,115,"new StackTraceElement$created"]}},
-"+StackTraceElement":[563],
-V35:{
+uw:{
+"^":"V37;ju,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gtN:function(a){return a.ju},
+stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
+RF:[function(a,b){J.LE(a.ju).wM(b)},"$1","gVm",2,0,17,66],
+static:{bV:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.wB.ZL(a)
+C.wB.XI(a)
+return a}}},
+V37:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
-IP:[function(a){var z=J.x(a)
-if(!!z.$isQl)return C.i3.f0(a)
-switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
-case"radio":case"select-multiple":case"select-one":return z.gi9(a)
-default:return z.gLm(a)}},"$1","tF",2,0,null,142,[]],
-iX:[function(a,b){var z,y,x,w,v,u,t,s
+AD:function(a,b,c,d){var z,y
+if(c){z=null!=d&&!1!==d
+y=J.RE(a)
+if(z)y.gQg(a).MW.setAttribute(b,"")
+else y.gQg(a).Rz(0,b)}else{z=J.Vs(a)
+y=d==null?"":H.d(d)
+z.MW.setAttribute(b,y)}},
+iX:function(a,b){var z,y,x,w,v,u
 z=M.pN(a,b)
-y=J.x(a)
-if(!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
-else x=!0
-else x=!1
-w=x?a:null
-for(v=y.gp8(a),u=null,t=0;v!=null;v=v.nextSibling,++t){s=M.iX(v,b)
-if(s==null)continue
-if(u==null)u=P.Py(null,null,null,null,null)
-u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.K6(z,u,w,t)},"$2","Nc",4,0,null,273,[],291,[]],
-HP:[function(a,b,c,d,e){var z,y,x
-if(b==null)return
-if(b.gN2()!=null){z=b.gN2()
-M.Ky(a).wh(z)
-if(d!=null)M.Ky(a).sxT(d)}z=J.RE(b)
-if(z.gCd(b)!=null)M.Iu(z.gCd(b),a,c,e)
-if(z.gwd(b)==null)return
-y=b.gTe()-a.childNodes.length
-for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"$5","K4",10,0,null,273,[],162,[],292,[],291,[],293,[]],
-bM:[function(a){var z
-for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-if(!!z.$isYN||!!z.$isI0||!!z.$ishy)return a
-return},"$1","ay",2,0,null,273,[]],
-pN:[function(a,b){var z,y
+if(z==null)z=new M.XI([],null,null)
+for(y=J.RE(a),x=y.gPZ(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.iX(x,b)
+if(u==null)continue
+if(w==null){w=Array(y.gUN(a).NL.childNodes.length)
+w.fixed$length=init}if(v>=w.length)return H.e(w,v)
+w[v]=u}z.ks=w
+return z},
+X7:function(a,b,c,d,e,f,g,h){var z,y,x,w
+z=b.appendChild(J.Lh(c,a,!1))
+for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.X7(y,z,c,x?d.JW(w):null,e,f,g,null)
+if(d.ghK()){M.Ky(z).bt(a)
+if(f!=null)M.Ky(z).szH(f)}M.mV(z,d,e,g)
+return z},
+bM:function(a){var z,y,x,w
+for(;!0;){z=J.Tm(a)
+if(z!=null)a=z
+else{y=$.rf()
+y.toString
+x=H.of(a,"expando$values")
+w=x==null?null:H.of(x,y.J4())
+if(w==null)break
+a=w}}y=J.x(a)
+if(!!y.$isQF||!!y.$isI0||!!y.$ishy)return a
+return},
+aU:function(a){var z
+for(;z=J.RE(a),z.gBy(a)!=null;)a=z.gBy(a)
+return $.rf().t(0,a)!=null?a:null},
+H4:function(a,b,c){if(c==null)return
+return new M.aR(a,b,c)},
+pN:function(a,b){var z,y
 z=J.x(a)
-if(!!z.$iscv)return M.F5(a,b)
-if(!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"$2","vw",4,0,null,273,[],291,[]],
-F5:[function(a,b){var z,y,x
+if(!!z.$ish4)return M.F5(a,b)
+if(!!z.$isUn){y=S.iw(a.textContent,M.H4("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.iw(z,M.H4(b,a,c))},
+F5:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=null
-z.b=!1
-z.c=!1
-new W.i7(a).aN(0,new M.NW(z,a,b,M.wR(a)))
-if(z.b&&!z.c){y=z.a
-if(y==null){x=[]
-z.a=x
-y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"$2","OT",4,0,null,142,[],291,[]],
-Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
-for(z=J.U6(a),y=d!=null,x=!!J.x(b).$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
-u=z.t(a,w+1)
-t=u.gEJ()
-if(1>=t.length)return H.e(t,1)
-s=t[1]
-if(u.gqz()){t=u.gEJ()
-if(2>=t.length)return H.e(t,2)
-r=t[2]
-if(r!=null){q=r.$2(c,b)
-if(q!=null){p=q
-s="value"}else p=c}else p=c
-if(!u.gaW()){p=L.Sk(p,s,u.gPf())
-s="value"}}else{t=[]
-o=new Y.J3(t,[],null,u.gPf(),!1,!1,null,null)
-for(n=1;n<u.gEJ().length;n+=3){m=u.gEJ()
-if(n>=m.length)return H.e(m,n)
-l=m[n]
-m=u.gEJ()
-k=n+1
-if(k>=m.length)return H.e(m,k)
-r=m[k]
-q=r!=null?r.$2(c,b):null
-if(q!=null){j=q
-l="value"}else j=c
-if(o.YX)H.vh(P.w("Cannot add more paths once started."))
-t.push(L.Sk(j,l,null))}o.wE(0)
-p=o
-s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},"$4","NJ",6,2,null,85,298,[],273,[],292,[],293,[]],
-F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s
-z=a.length
-if(z===0)return
-for(y=d==null,x=J.U6(a),w=null,v=0;v<z;){u=x.XU(a,"{{",v)
-t=u<0?-1:C.xB.XU(a,"}}",u+2)
-if(t<0){if(w==null)return
-w.push(C.xB.yn(a,v))
-break}if(w==null)w=[]
-w.push(C.xB.Nj(a,v,u))
-s=C.xB.bS(C.xB.Nj(a,u+2,t))
-w.push(s)
-w.push(y?null:A.lJ(s,b,c,T.e9.prototype.gca.call(d)))
-v=t+2}if(v===z)w.push("")
-z=new M.HS(w,null)
-z.Yn(w)
-return z},"$4","jF",8,0,null,94,[],12,[],273,[],291,[]],
-SH:[function(a,b){var z,y
-z=a.firstChild
-if(z==null)return
-y=new M.yp(z,a.lastChild,b)
-for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"$2","St",4,0,null,220,[],292,[]],
-Ky:[function(a){var z,y,x,w
-z=$.rw()
+y=M.wR(a)
+new W.E9(a).aN(0,new M.NW(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.qd=z
+x=M.rJ(a,"bind",b)
+v.DK=x
+u=M.rJ(a,"repeat",b)
+v.wA=u
+if(z!=null&&x==null&&u==null)v.DK=S.iw("{{}}",M.H4("bind",a,b))
+return v}z=z.a
+return z==null?null:new M.XI(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 b.gaW()?y:b.qm(y)}x=J.U6(b)
+w=x.gB(b)
+if(typeof w!=="number")return H.s(w)
+v=Array(w)
+v.fixed$length=init
+w=v.length
+u=0
+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)
+if(u>=w)return H.e(v,u)
+v[u]=t;++u}return b.qm(v)},
+GZ:function(a,b,c,d){var z,y,x,w,v,u,t,s
+if(b.geq())return M.KH(a,b,c,d)
+if(b.gqz()){z=b.HH(0)
+if(z!=null)y=z.$3(d,c,!1)
+else{x=b.Pn(0)
+x=!!J.x(x).$isTv?x:L.hk(x)
+w=$.ps
+$.ps=w+1
+y=new L.WR(x,d,null,w,null,null,null)}return b.gaW()?y:new Y.cc(y,b.gcK(),null,null,null)}x=$.ps
+$.ps=x+1
+y=new L.NV(null,[],x,null,null,null)
+y.Hy=[]
+x=J.U6(b)
+v=0
+while(!0){w=x.gB(b)
+if(typeof w!=="number")return H.s(w)
+if(!(v<w))break
+c$0:{u=b.AX(v)
+z=b.HH(v)
+if(z!=null){t=z.$3(d,c,u)
+if(u===!0)y.ti(t)
+else{if(y.xX!=null||y.Bg==null)H.vh(P.w("Cannot add observers once started."))
+J.mu(t,y.gQ8())
+w=y.Bg
+w.push(C.dV)
+w.push(t)}break c$0}s=b.Pn(v)
+if(u===!0)y.ti(s.Tl(d))
+else y.yN(d,s)}++v}return new Y.cc(y,b.gcK(),null,null,null)},
+mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n
+z=J.RE(b)
+y=z.gCd(b)
+for(x=J.U6(y),w=!!J.x(a).$isvy,v=d!=null,u=0;u<x.gB(y);u+=2){t=x.t(y,u)
+s=x.t(y,u+1)
+r=M.GZ(t,s,a,c)
+q=w?a:M.Ky(a)
+p=J.FS(q,t,r,s.geq())
+if(p!=null&&v)d.push(p)}if(!z.$isqf)return
+o=M.Ky(a)
+o.sQ2(c)
+n=o.oq(b)
+if(n!=null&&v)d.push(n)},
+Ky:function(a){var z,y,x,w
+z=$.cm()
 z.toString
-y=H.VK(a,"expando$values")
-x=y==null?null:H.VK(y,z.Qz())
+y=H.of(a,"expando$values")
+x=y==null?null:H.of(y,z.J4())
 if(x!=null)return x
 w=J.x(a)
-if(!!w.$isMi)x=new M.ee(a,null,null)
-else if(!!w.$islp)x=new M.ug(a,null,null)
+if(!!w.$isJK)x=new M.ee(a,null,null)
+else if(!!w.$isbs)x=new M.ug(a,null,null)
 else if(!!w.$isAE)x=new M.wl(a,null,null)
-else if(!!w.$iscv){if(a.localName!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
+else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
 else w=!0
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
+else w=!0
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$isUn?new M.XT(a,null,null):new M.vy(a,null,null)
 z.u(0,a,x)
-return x},"$1","La",2,0,null,273,[]],
-wR:[function(a){var z=J.x(a)
-if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
+return x},
+wR: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.uE.x4(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},"$1","xS",2,0,null,211,[]],
+return z},
 V2:{
-"^":"TU;N1,mD,Ck",
-Z1:function(a,b,c,d){var z,y,x,w,v
-J.MV(this.glN(),b)
-if(!!J.x(this.gN1()).$isQl&&J.de(b,"value")){z=H.Go(this.gN1(),"$isQl")
+"^":"vy;rF,u2,Vw",
+nR:function(a,b,c,d){var z,y,x,w,v,u
+z={}
+z.a=b
+J.SB(this.gPP(),z.a)
+y=this.grF()
+x=J.x(y)
+w=!!x.$isUC&&J.xC(z.a,"value")
+v=z.a
+if(w){new W.E9(y).Rz(0,v)
+if(d)return this.nD(c)
+x=this.ge2()
+x.$1(J.mu(c,x))}else{u=J.Is(v,"?")
+if(u){x.gQg(y).Rz(0,z.a)
+x=z.a
+w=J.U6(x)
+z.a=w.Nj(x,0,J.Hn(w.gB(x),1))}if(d)return M.AD(this.grF(),z.a,u,c)
+x=new M.BL(z,this,u)
+x.$1(J.mu(c,x))}this.gCd(this).u(0,z.a,c)
+return c},
+nD:[function(a){var z,y,x,w,v,u,t
+z=this.grF()
+y=J.RE(z)
+x=y.gBy(z)
+w=J.x(x)
+if(!!w.$isbs){v=J.UQ(J.QE(M.Ky(x)),"value")
+if(!!J.x(v).$isb2){u=x.value
+t=v}else{u=null
+t=null}}else{u=null
+t=null}y.sP(z,a==null?"":H.d(a))
+if(t!=null&&!J.xC(w.gP(x),u)){y=w.gP(x)
+J.Fc(t.gvt(),y)}},"$1","ge2",2,0,17,36]},
+BL:{
+"^":"Xs:10;a,b,c",
+$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,160,"call"],
+$isEH:true},
+b2:{
+"^":"Ap;rF<,E3,vt<,jS",
+HF:[function(a){return M.pw(this.rF,a,this.jS)},"$1","gfM",2,0,17,36],
+Uh:[function(a){var z,y,x,w,v
+switch(this.jS){case"value":z=J.Vm(this.rF)
+J.Fc(this.vt,z)
+break
+case"checked":z=this.rF
+y=J.RE(z)
+x=y.gd4(z)
+J.Fc(this.vt,x)
+if(!!y.$isJK&&J.xC(y.gt5(z),"radio"))for(z=J.mY(M.pt(z));z.G();){w=z.gl()
+v=J.UQ(J.QE(!!J.x(w).$isvy?w:M.Ky(w)),"checked")
+if(v!=null)J.Fc(v,!1)}break
+case"selectedIndex":z=J.fa(this.rF)
+J.Fc(this.vt,z)
+break}O.N0()},"$1","gCL",2,0,17,1],
+TR:function(a,b){return J.mu(this.vt,b)},
+gP:function(a){return J.Vm(this.vt)},
+sP:function(a,b){J.Fc(this.vt,b)
+return b},
+xO:function(a){var z=this.E3
+if(z!=null){z.ed()
+this.E3=null}z=this.vt
+if(z!=null){J.yd(z)
+this.vt=null}},
+$isb2:true,
+static:{"^":"S8",pw:function(a,b,c){switch(c){case"checked":J.Ae(a,null!=b&&!1!==b)
+return
+case"selectedIndex":J.dk(a,M.bC(b))
+return
+case"value":J.Fc(a,b==null?"":H.d(b))
+return}},IP:function(a){var z=J.x(a)
+if(!!z.$isUC)return H.VM(new W.Cq(a,C.i3.Ph,!1),[null])
+switch(z.gt5(a)){case"checkbox":return $.FF().LX(a)
+case"radio":case"select-multiple":case"select-one":return z.gi9(a)
+default:return z.gLm(a)}},pt:function(a){var z,y,x
+z=J.RE(a)
+if(z.gMB(a)!=null){z=z.gMB(a)
 z.toString
-new W.i7(z).Rz(0,b)
-z=this.gN1()
-y=d!=null?d:""
-x=new M.zP(null,z,c,null,null,"value",y)
-x.Og(z,"value",c,d)
-x.Ca=M.IP(z).yI(x.gqf())}else{z=this.gN1()
-y=J.rY(b)
-w=y.Tc(b,"?")
-if(w){J.Vs(z).Rz(0,b)
-v=y.Nj(b,0,J.xH(y.gB(b),1))}else v=b
-y=d!=null?d:""
-x=new M.D8(w,z,c,null,null,v,y)
-x.Og(z,v,c,d)}this.gCd(this).u(0,b,x)
-return x}},
-D8:{
-"^":"TR;Y0,qP,ZY,xS,PB,eS,ay",
-gH:function(){return X.TR.prototype.gH.call(this)},
-EC:function(a){var z,y
-if(this.Y0){z=null!=a&&!1!==a
-y=this.eS
-if(z)J.Vs(X.TR.prototype.gH.call(this)).MW.setAttribute(y,"")
-else J.Vs(X.TR.prototype.gH.call(this)).Rz(0,y)}else{z=J.Vs(X.TR.prototype.gH.call(this))
-y=a==null?"":H.d(a)
-z.MW.setAttribute(this.eS,y)}}},
-zP:{
-"^":"NP;Ca,qP,ZY,xS,PB,eS,ay",
-gH:function(){return M.NP.prototype.gH.call(this)},
-EC:function(a){var z,y,x,w,v
-z=J.u3(M.NP.prototype.gH.call(this))
-y=J.x(z)
-if(!!y.$islp){x=J.UQ(J.QE(M.Ky(z)),"value")
-if(!!J.x(x).$isSA){w=z.value
-v=x}else{w=null
-v=null}}else{w=null
-v=null}M.NP.prototype.EC.call(this,a)
-if(v!=null&&v.gqP()!=null&&!J.de(y.gP(z),w))v.FC(null)}},
-b2i:{
-"^":"TR;",
-cO:function(a){if(this.qP==null)return
-this.Ca.ed()
-X.TR.prototype.cO.call(this,this)}},
-DO:{
-"^":"Tp:115;",
-$0:[function(){var z,y,x,w,v
+z=new W.wi(z)
+return z.ev(z,new M.WP(a))}else{y=M.bM(a)
+if(y==null)return C.xD
+x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
+return x.ev(x,new M.iA(a))}},bC:function(a){if(typeof a==="string")return H.BU(a,null,new M.fR())
+return typeof a==="number"&&Math.floor(a)===a?a:0}}},
+YJG:{
+"^":"Xs:42;",
+$0:function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
 y.st5(z,"checkbox")
 x=[]
 w=y.gVl(z)
-H.VM(new W.Ov(0,w.uv,w.Ph,W.aF(new M.fTP(x)),w.Sg),[H.Kp(w,0)]).Zz()
+H.VM(new W.fd(0,w.bi,w.Ph,W.aF(new M.pp(x)),w.Sg),[H.Kp(w,0)]).Zz()
 y=y.gi9(z)
-H.VM(new W.Ov(0,y.uv,y.Ph,W.aF(new M.ppY(x)),y.Sg),[H.Kp(y,0)]).Zz()
+H.VM(new W.fd(0,y.bi,y.Ph,W.aF(new M.ik(x)),y.Sg),[H.Kp(y,0)]).Zz()
 y=window
 v=document.createEvent("MouseEvent")
-J.e2(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
+J.Dh(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
 z.dispatchEvent(v)
-return x.length===1?C.mt:C.Nm.gtH(x)},"$0",null,0,0,null,"call"],
+return x.length===1?C.U3:C.Nm.gtH(x)},
 $isEH:true},
-fTP:{
-"^":"Tp:116;a",
-$1:[function(a){this.a.push(C.pi)},"$1",null,2,0,null,21,[],"call"],
+pp:{
+"^":"Xs:10;a",
+$1:[function(a){this.a.push(C.pi)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
-ppY:{
-"^":"Tp:116;b",
-$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,21,[],"call"],
+ik:{
+"^":"Xs:10;b",
+$1:[function(a){this.b.push(C.U3)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
-NP:{
-"^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
-gH:function(){return X.TR.prototype.gH.call(this)},
-EC:function(a){var z=this.gH()
-J.ta(z,a==null?"":H.d(a))},
-FC:[function(a){var z=J.Vm(this.gH())
-J.ta(this.xS,z)
-O.Y3()},"$1","gqf",2,0,169,21,[]]},
-jt:{
-"^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
-gH:function(){return X.TR.prototype.gH.call(this)},
-EC:function(a){var z=X.TR.prototype.gH.call(this)
-J.rP(z,null!=a&&!1!==a)},
-FC:[function(a){var z,y,x
-z=J.Hf(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)
-if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
-x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
-if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,169,21,[]],
-static:{kv:[function(a){var z,y,x
-z=J.RE(a)
-if(z.gMB(a)!=null){z=z.gMB(a)
-z.toString
-z=new W.e7(z)
-return z.ev(z,new M.r0(a))}else{y=M.bM(a)
-if(y==null)return C.xD
-x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.jz(a))}},"$1","VE",2,0,null,142,[]]}},
-r0:{
-"^":"Tp:116;a",
-$1:[function(a){var z,y
+WP:{
+"^":"Xs:10;a",
+$1:function(a){var z,y
 z=this.a
 y=J.x(a)
-if(!y.n(a,z))if(!!y.$isMi)if(a.type==="radio"){y=a.name
+if(!y.n(a,z))if(!!y.$isJK)if(a.type==="radio"){y=a.name
 z=J.O6(z)
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},"$1",null,2,0,null,295,[],"call"],
+return z},
 $isEH:true},
-jz:{
-"^":"Tp:116;b",
-$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"$1",null,2,0,null,295,[],"call"],
+iA:{
+"^":"Xs:10;b",
+$1:function(a){var z=J.x(a)
+return!z.n(a,this.b)&&z.gMB(a)==null},
 $isEH:true},
-SA:{
-"^":"b2i;Dh,Ca,qP,ZY,xS,PB,eS,ay",
-gH:function(){return X.TR.prototype.gH.call(this)},
-EC:function(a){var z
-this.C7()
-if(this.Gh(a)===!0)return
-z=new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.K2(new M.hB(this)),2))
-C.S2.yN(z,X.TR.prototype.gH.call(this),!0,!0)
-this.Dh=z},
-Gh:function(a){var z,y,x
-z=this.eS
-y=J.x(z)
-if(y.n(z,"selectedIndex")){x=M.qb(a)
-J.Mu(X.TR.prototype.gH.call(this),x)
-z=J.m4(X.TR.prototype.gH.call(this))
-return z==null?x==null:z===x}else if(y.n(z,"value")){z=X.TR.prototype.gH.call(this)
-J.ta(z,a==null?"":H.d(a))
-return J.de(J.Vm(X.TR.prototype.gH.call(this)),a)}},
-C7:function(){var z=this.Dh
-if(z!=null){z.disconnect()
-this.Dh=null}},
-FC:[function(a){var z,y
-this.C7()
-z=this.eS
-y=J.x(z)
-if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"$1","gqf",2,0,169,21,[]],
-$isSA:true,
-static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
-return typeof a==="number"&&Math.floor(a)===a?a:0},"$1","v7",2,0,null,30,[]]}},
-hB:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,28,[],564,[],"call"],
-$isEH:true},
-nv:{
-"^":"Tp:116;",
-$1:[function(a){return 0},"$1",null,2,0,null,117,[],"call"],
+fR:{
+"^":"Xs:10;",
+$1:function(a){return 0},
 $isEH:true},
 ee:{
-"^":"V2;N1,mD,Ck",
-gN1:function(){return this.N1},
-Z1:function(a,b,c,d){var z,y,x
+"^":"V2;rF,u2,Vw",
+grF:function(){return this.rF},
+nR:function(a,b,c,d){var z,y,x,w
 z=J.x(b)
-if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-y=this.gN1()
-J.MV(!!J.x(y).$isTU?y:this,b)
-J.Vs(this.N1).Rz(0,b)
-y=this.gCd(this)
-if(z.n(b,"value")){z=this.N1
-x=d!=null?d:""
-x=new M.NP(null,z,c,null,null,"value",x)
-x.Og(z,"value",c,d)
-x.Ca=M.IP(z).yI(x.gqf())
-z=x}else{z=this.N1
-x=d!=null?d:""
-x=new M.jt(null,z,c,null,null,"checked",x)
-x.Og(z,"checked",c,d)
-x.Ca=M.IP(z).yI(x.gqf())
-z=x}y.u(0,b,z)
-return z}},
-K6:{
-"^":"a;Cd>,wd>,N2<,Te<"},
-TU:{
-"^":"a;N1<,mD,Ck?",
-Z1:function(a,b,c,d){var z
-window
-z="Unhandled binding to Node: "+H.a5(this)+" "+H.d(b)+" "+H.d(c)+" "+H.d(d)
-if(typeof console!="undefined")console.error(z)},
-Ih:function(a,b){var z
-if(this.mD==null)return
-z=this.gCd(this).Rz(0,b)
-if(z!=null)J.wC(z)},
-GB:function(a){var z,y
-if(this.mD==null)return
-for(z=this.gCd(this),z=z.gUQ(z),z=P.F(z,!0,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-if(y!=null)J.wC(y)}this.mD=null},
-gCd:function(a){var z=this.mD
-if(z==null){z=P.L5(null,null,null,J.O,X.TR)
-this.mD=z}return z},
-glN:function(){var z=this.gN1()
-return!!J.x(z).$isTU?z:this},
-$isTU:true},
-yp:{
-"^":"a;rg,Ug,k8<"},
-ug:{
-"^":"V2;N1,mD,Ck",
-gN1:function(){return this.N1},
-Z1:function(a,b,c,d){var z,y,x
-if(J.de(b,"selectedindex"))b="selectedIndex"
-z=J.x(b)
-if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-z=this.gN1()
-J.MV(!!J.x(z).$isTU?z:this,b)
-J.Vs(this.N1).Rz(0,b)
+if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.nR.call(this,this,b,c,d)
+J.Vs(this.rF).Rz(0,b)
+if(d){M.pw(this.rF,c,b)
+return}J.SB(!!J.x(this.grF()).$isvy?this.grF():this,b)
 z=this.gCd(this)
-y=this.N1
-x=d!=null?d:""
-x=new M.SA(null,null,y,c,null,null,b,x)
-x.Og(y,b,c,d)
-x.Ca=M.IP(y).yI(x.gqf())
+y=this.rF
+x=new M.b2(y,null,c,b)
+x.E3=M.IP(y).yI(x.gCL())
+w=x.gfM()
+M.pw(y,J.mu(x.vt,w),b)
+z.u(0,b,x)
+return x}},
+XI:{
+"^":"a;Cd>,ks>,jb>",
+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:{
+"^":"XI;qd,DK,wA,Cd,ks,jb",
+ghK:function(){return!0},
+$isqf:true},
+vy:{
+"^":"a;rF<,u2,Vw?",
+nR:function(a,b,c,d){var z
+window
+z="Unhandled binding to Node: "+H.a5(this)+" "+H.d(b)+" "+H.d(c)+" "+d
+if(typeof console!="undefined")console.error(z)
+return},
+Yj:function(a,b){var z
+if(this.u2==null)return
+z=this.gCd(this).Rz(0,b)
+if(z!=null)J.yd(z)},
+GB:function(a){var z,y
+if(this.u2==null)return
+for(z=this.gCd(this),z=z.gUQ(z),z=P.F(z,!0,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+if(y!=null)J.yd(y)}this.u2=null},
+gCd:function(a){var z=this.u2
+if(z==null){z=P.L5(null,null,null,P.qU,A.Ap)
+this.u2=z}return z},
+gPP:function(){return!!J.x(this.grF()).$isvy?this.grF():this},
+$isvy:true},
+bX:{
+"^":"a;ku,EA,Po"},
+ug:{
+"^":"V2;rF,u2,Vw",
+grF:function(){return this.rF},
+nR:function(a,b,c,d){var z,y,x,w
+if(J.xC(b,"selectedindex"))b="selectedIndex"
+z=J.x(b)
+if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
+J.Vs(this.rF).Rz(0,b)
+if(d){M.pw(this.rF,c,b)
+return}J.SB(!!J.x(this.grF()).$isvy?this.grF():this,b)
+z=this.gCd(this)
+y=this.rF
+x=new M.b2(y,null,c,b)
+x.E3=M.IP(y).yI(x.gCL())
+w=x.gfM()
+M.pw(y,J.mu(x.vt,w),b)
 z.u(0,b,x)
 return x}},
 DT:{
-"^":"V2;lr,xT?,kr<,Mf,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
-gN1:function(){return this.N1},
-glN:function(){return!!J.x(this.N1).$isDT?this.N1:this},
-Z1:function(a,b,c,d){var z
-d=d!=null?d:""
-z=this.kr
-if(z==null){z=new M.TG(this,[],null,!1,!1,!1,!1,!1,null,null,null,null,null,null,null,null,!1,null,null)
-this.kr=z}switch(b){case"bind":z.js=!0
-z.d6=c
-z.XV=d
-this.jq()
-z=new M.p8(this,c,b,d)
-this.gCd(this).u(0,b,z)
-return z
-case"repeat":z.A7=!0
-z.JM=c
-z.yO=d
-this.jq()
-z=new M.p8(this,c,b,d)
-this.gCd(this).u(0,b,z)
-return z
-case"if":z.Q3=!0
-z.rV=c
-z.eD=d
-this.jq()
-z=new M.p8(this,c,b,d)
-this.gCd(this).u(0,b,z)
-return z
-default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},
-Ih:function(a,b){var z
-switch(b){case"bind":z=this.kr
-if(z==null)return
-z.js=!1
-z.d6=null
-z.XV=null
-this.jq()
-this.gCd(this).Rz(0,b)
-return
-case"repeat":z=this.kr
-if(z==null)return
-z.A7=!1
-z.JM=null
-z.yO=null
-this.jq()
-this.gCd(this).Rz(0,b)
-return
-case"if":z=this.kr
-if(z==null)return
-z.Q3=!1
-z.rV=null
-z.eD=null
-this.jq()
-this.gCd(this).Rz(0,b)
-return
-default:M.TU.prototype.Ih.call(this,this,b)
-return}},
-jq:function(){var z=this.kr
-if(!z.t9){z.t9=!0
-P.rb(z.gjM())}},
-a5:function(a,b,c){var z,y,x,w,v,u,t
+"^":"V2;Q2?,nF,os<,xU,q4?,Bx?,M5?,AD,VZ,rF,u2,Vw",
+grF:function(){return this.rF},
+gPP:function(){return!!J.x(this.rF).$isDT?this.rF:this},
+oq:function(a){var z,y
+z=this.os
+if(z!=null)z.x5()
+if(a.qd==null&&a.DK==null&&a.wA==null){z=this.os
+if(z!=null){z.xO(0)
+this.os=null
+this.gCd(this).Rz(0,"iterator")}return}if(this.os==null){z=this.gCd(this)
+y=new M.TG(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
+this.os=y
+z.u(0,"iterator",y)}this.os.dE(a,this.Q2)
+return this.os},
+a5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z=this.gnv(this)
-z=!!J.x(z).$isTU?z:M.Ky(z)
-y=J.G6(z)
-x=z.gdv()
-if(x==null){x=M.iX(y,b)
-z.sdv(x)}w=this.IT
-if(w==null){v=J.VN(this.N1)
-w=$.JM()
-u=w.t(0,v)
-if(u==null){u=v.implementation.createHTMLDocument("")
-w.u(0,v,u)}this.IT=u
-w=u}t=M.Fz(y,w)
-M.HP(t,x,a,b,c)
-M.SH(t,a)
-return t},
+y=J.NQ(!!J.x(z).$isvy?z:M.Ky(z))
+x=this.VZ
+if(x!=null){z=x.jb
+z=z==null?y!=null:z!==y}else z=!0
+if(z){x=M.iX(y,b)
+x.jb=y
+this.VZ=x}z=this.AD
+if(z==null){w=J.Do(this.rF)
+z=$.JM()
+v=z.t(0,w)
+if(v==null){v=w.implementation.createHTMLDocument("")
+z.u(0,w,v)}this.AD=v
+z=v}u=J.O2(z)
+$.rf().u(0,u,this.rF)
+t=new M.bX(a,null,null)
+for(s=J.LY(y),z=x!=null,r=0;s!=null;s=s.nextSibling,++r){q=z?x.JW(r):null
+M.Ky(M.X7(s,u,this.AD,q,a,b,c,null)).sVw(t)}t.EA=u.firstChild
+t.Po=u.lastChild
+return u},
 ZK:function(a,b){return this.a5(a,b,null)},
-gk8:function(){return this.lr},
-gzH:function(){return this.xT},
-gnv:function(a){var z,y,x,w
-this.Sy()
-z=J.Vs(this.N1).MW.getAttribute("ref")
-if(z!=null){y=M.bM(this.N1)
-x=y!=null?J.K3(y,z):null}else x=null
-if(x==null){x=this.QO
-if(x==null)return this.N1}w=J.IS(!!J.x(x).$isTU?x:M.Ky(x))
-return w!=null?w:x},
-grz:function(a){var z
-this.Sy()
-z=this.jH
-return z!=null?z:H.Go(this.N1,"$isyY").content},
-wh:function(a){var z,y,x,w,v,u
-if(this.mj===!0)return!1
+gzH:function(){return this.nF},
+szH:function(a){var z
+this.nF=a
+this.VZ=null
+z=this.os
+if(z!=null){z.Wv=!1
+z.eY=null
+z.jq=null}},
+gnv:function(a){var z,y,x,w,v
+this.GC()
+z=J.Vs(this.rF).MW.getAttribute("ref")
+if(z!=null){y=M.bM(this.rF)
+x=y!=null?J.Vr(y,z):null
+if(x==null){w=M.aU(this.rF)
+if(w!=null)x=J.c1(w,"#"+z)}}else x=null
+if(x==null){x=this.q4
+if(x==null)return this.rF}v=J.Gc(!!J.x(x).$isvy?x:M.Ky(x))
+return v!=null?v:x},
+gjb:function(a){var z
+this.GC()
+z=this.Bx
+return z!=null?z:H.Go(this.rF,"$isyY").content},
+bt:function(a){var z,y,x,w,v,u,t
+if(this.M5===!0)return!1
 M.oR()
-this.mj=!0
-z=!!J.x(this.N1).$isyY
+this.M5=!0
+z=!!J.x(this.rF).$isyY
 y=!z
-if(y){x=this.N1
+if(y){x=this.rF
 w=J.RE(x)
-x=w.gQg(x).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(x))===!0}else x=!1
-if(x){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
-v=M.eX(this.N1)
-v=!!J.x(v).$isTU?v:M.Ky(v)
-v.smj(!0)
-z=!!J.x(v.gN1()).$isyY
-u=!0}else{v=this
-u=!1}if(!z)v.sjH(J.bs(M.TA(v.gN1())))
-if(a!=null)v.sQO(a)
-else if(y)M.KE(v,this.N1,u)
-else M.GM(J.G6(v))
+if(w.gQg(x).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
+v=M.iR(this.rF)
+v=!!J.x(v).$isvy?v:M.Ky(v)
+v.sM5(!0)
+z=!!J.x(v.grF()).$isyY
+u=!0}else{x=this.rF
+w=J.RE(x)
+if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.rF
+w=J.RE(x)
+t=w.gM0(x).createElement("template",null)
+w.gBy(x).insertBefore(t,x)
+t.toString
+new W.E9(t).FV(0,w.gQg(x))
+w.gQg(x).V1(0)
+w.zB(x)
+v=!!J.x(t).$isvy?t:M.Ky(t)
+v.sM5(!0)
+z=!!J.x(v.grF()).$isyY}else{v=this
+z=!1}u=!1}}else{v=this
+u=!1}if(!z)v.sBx(J.O2(M.TA(v.grF())))
+if(a!=null)v.sq4(a)
+else if(y)M.KE(v,this.rF,u)
+else M.GM(J.NQ(v))
 return!0},
-Sy:function(){return this.wh(null)},
+GC:function(){return this.bt(null)},
 $isDT:true,
-static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
-z=J.Lh(b,a,!1)
-y=J.x(z)
-if(!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
-else y=!0
-else y=!1
-if(y)return z
-for(x=J.Q8(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"$2","Tkw",4,0,null,273,[],294,[]],TA:[function(a){var z,y,x,w
-z=J.VN(a)
+static:{"^":"mn,EW,Sf,vU",TA:function(a){var z,y,x,w
+z=J.Do(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},"$1","lA",2,0,null,270,[]],eX:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},iR:function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
-z.gKV(a).insertBefore(y,a)
+z.gBy(a).insertBefore(y,a)
 for(x=C.Nm.br(z.gQg(a).gvc()),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=x.lo
 switch(w){case"template":v=z.gQg(a).MW
 v.getAttribute(w)
@@ -16417,996 +15791,1231 @@
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
-break}}return y},"$1","Bw",2,0,null,295,[]],KE:[function(a,b,c){var z,y,x,w
-z=J.G6(a)
-if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},"$3","BZ",6,0,null,270,[],295,[],296,[]],GM:[function(a){var z,y
-z=new M.OB()
+break}}return y},KE:function(a,b,c){var z,y,x,w
+z=J.NQ(a)
+if(c){J.y2(z,b)
+return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.mx(z,w)},GM:function(a){var z,y
+z=new M.CE()
 y=J.MK(a,$.cz())
 if(M.wR(a))z.$1(a)
-y.aN(y,z)},"$1","DR",2,0,null,297,[]],oR:[function(){if($.To===!0)return
-$.To=!0
+y.aN(y,z)},oR:function(){if($.vU===!0)return
+$.vU=!0
 var z=document.createElement("style",null)
-J.c9(z,H.d($.cz())+" { display: none; }")
-document.head.appendChild(z)},"$0","Lv",0,0,null]}},
-OB:{
-"^":"Tp:169;",
-$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},"$1",null,2,0,null,270,[],"call"],
+J.t3(z,H.d($.cz())+" { display: none; }")
+document.head.appendChild(z)}}},
+CE:{
+"^":"Xs:17;",
+$1:function(a){if(!M.Ky(a).bt(null))M.GM(J.NQ(!!J.x(a).$isvy?a:M.Ky(a)))},
 $isEH:true},
-lP:{
-"^":"Tp:116;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,376,[],"call"],
+W6o:{
+"^":"Xs:10;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,137,"call"],
 $isEH:true},
-p8:{
-"^":"a;ud,lr,eS,ay",
-gH:function(){var z=this.ud
-z.toString
-return z.N1},
-gk8:function(){return this.lr},
-gP:function(a){return J.Vm(this.gND())},
-sP:function(a,b){J.ta(this.gND(),b)},
-gND:function(){var z=J.x(this.lr)
-if((!!z.$isWR||!!z.$isJ3)&&J.de(this.ay,"value"))return this.lr
-return L.Sk(this.lr,this.ay,null)},
-cO:function(a){var z=this.ud
-if(z==null)return
-z.Ih(0,this.eS)
-this.lr=null
-this.ud=null},
-$isTR:true},
+aR:{
+"^":"Xs:10;a,b,c",
+$1:function(a){return this.c.pm(a,this.a,this.b)},
+$isEH:true},
 NW:{
-"^":"Tp:300;a,b,c,d",
-$2:[function(a,b){var z,y,x,w
-for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
-if(this.d)if(z.n(a,"if")){this.a.b=!0
-if(b==="")b="{{}}"}else if(z.n(a,"bind")||z.n(a,"repeat")){this.a.c=!0
-if(b==="")b="{{}}"}y=M.F4(b,a,this.b,this.c)
+"^":"Xs:51;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.iw(b,M.H4(a,this.b,this.c))
 if(y!=null){z=this.a
 x=z.a
 if(x==null){w=[]
 z.a=w
 z=w}else z=x
 z.push(a)
-z.push(y)}},"$2",null,4,0,null,12,[],30,[],"call"],
+z.push(y)}},
 $isEH:true},
-HS:{
-"^":"a;EJ<,PU",
-gqz:function(){return this.EJ.length===4},
-gaW:function(){var z,y
-z=this.EJ
-y=z.length
-if(y===4){if(0>=y)return H.e(z,0)
-if(J.de(z[0],"")){if(3>=z.length)return H.e(z,3)
-z=J.de(z[3],"")}else z=!1}else z=!1
-return z},
-gPf:function(){return this.PU},
-JI:[function(a){var z,y
-if(a==null)a=""
-z=this.EJ
-if(0>=z.length)return H.e(z,0)
-y=H.d(z[0])+H.d(a)
-if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"$1","gBg",2,0,565,30,[]],
-DJ:[function(a){var z,y,x,w,v,u,t
-z=this.EJ
-if(0>=z.length)return H.e(z,0)
-y=P.p9(z[0])
-for(x=J.U6(a),w=1;w<z.length;w+=3){v=x.t(a,C.jn.cU(w-1,3))
-if(v!=null)y.vM+=typeof v==="string"?v:H.d(v)
-u=w+2
-if(u>=z.length)return H.e(z,u)
-t=z[u]
-y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,566,567,[]],
-Yn:function(a){this.PU=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
-"^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
-Mv:function(a){return this.DO.$1(a)},
-XS:[function(){var z,y,x,w,v,u
-this.t9=!1
-z=this.FS
-if(z!=null){z.ed()
-this.FS=null}z=this.A7
-if(!z&&!this.js){this.Az(null)
-return}y=z?this.JM:this.d6
-x=z?this.yO:this.XV
-if(!this.Q3)w=L.Sk(y,x,z?null:new M.VU())
-else{v=[]
-w=new Y.J3(v,[],null,new M.Kj(z),!1,!1,null,null)
-v.push(L.Sk(y,x,null))
-z=this.rV
-u=this.eD
-v.push(L.Sk(z,u,null))
-w.wE(0)}this.FS=w.gUj(w).yI(new M.R7(this))
-this.Az(w.gP(w))},"$0","gjM",0,0,115],
-Az:function(a){var z,y,x,w
-z=this.xG
-this.Gb()
-y=J.x(a)
-if(!!y.$isList){this.xG=a
-x=a}else if(!!y.$isQV){x=y.br(a)
-this.xG=x}else{this.xG=null
-x=null}if(x!=null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
-y=z!=null?z:[]
-x=this.xG
-x=x!=null?x:[]
-w=G.jj(x,0,J.q8(x),y,0,J.q8(y))
-if(w.length!==0)this.El(w)},
-wx:function(a){var z,y,x,w
+"^":"Ap;YS,SU,vy,S6,Jh,WI,bn,D2,ts,qe,ur,VC,Wv,eY,jq",
+RV:function(a){return this.eY.$1(a)},
+TR:function(a,b){return H.vh(P.w("binding already opened"))},
+gP:function(a){return this.bn},
+x5:function(){var z,y
+z=this.WI
+y=J.x(z)
+if(!!y.$isAp){y.xO(z)
+this.WI=null}z=this.bn
+y=J.x(z)
+if(!!y.$isAp){y.xO(z)
+this.bn=null}},
+dE:function(a,b){var z,y,x
+this.x5()
+z=this.YS.rF
+y=a.qd
+x=y!=null
+this.D2=x
+this.ts=a.wA!=null
+if(x){this.qe=y.eq
+y=M.GZ("if",y,z,b)
+this.WI=y
+if(this.qe===!0){if(!(null!=y&&!1!==y)){this.vr(null)
+return}}else H.Go(y,"$isAp").TR(0,this.goo())}if(this.ts===!0){y=a.wA
+this.ur=y.eq
+y=M.GZ("repeat",y,z,b)
+this.bn=y}else{y=a.DK
+this.ur=y.eq
+y=M.GZ("bind",y,z,b)
+this.bn=y}if(this.ur!==!0)J.mu(y,this.goo())
+this.vr(null)},
+vr:[function(a){var z,y
+if(this.D2===!0){z=this.WI
+if(this.qe!==!0){H.Go(z,"$isAp")
+z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Io([])
+return}}y=this.bn
+if(this.ur!==!0){H.Go(y,"$isAp")
+y=y.gP(y)}this.Io(this.ts!==!0?[y]:y)},"$1","goo",2,0,17,11],
+Io:function(a){var z,y
 z=J.x(a)
-if(z.n(a,-1))return this.e9.N1
-y=this.YC
+if(!z.$isWO)a=!!z.$iscX?z.br(a):[]
+z=this.vy
+if(a===z)return
+this.Ke()
+this.S6=a
+if(!!J.x(a).$iswn&&this.ts===!0&&this.ur!==!0){if(a.gID()!=null)a.sID([])
+this.VC=a.gRT().yI(this.gk8())}y=this.S6
+y=y!=null?y:[]
+this.cJ(G.jj(y,0,J.q8(y),z,0,z.length))},
+F1:function(a){var z,y,x,w
+z=J.x(a)
+if(z.n(a,-1))return this.YS.rF
+y=this.SU
 z=z.U(a,2)
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 x=y[z]
-if(M.wR(x)){z=this.e9.N1
+if(M.wR(x)){z=this.YS.rF
 z=x==null?z==null:x===z}else z=!0
 if(z)return x
-w=M.Ky(x).gkr()
+w=M.Ky(x).gos()
 if(w==null)return x
-return w.wx(C.jn.cU(w.YC.length,2)-1)},
-lP:function(a,b,c,d){var z,y,x,w,v,u
+return w.F1(C.jn.cU(w.SU.length,2)-1)},
+uy:function(a,b,c,d){var z,y,x,w,v,u
 z=J.Wx(a)
-y=this.wx(z.W(a,1))
+y=this.F1(z.W(a,1))
 x=b!=null
 if(x)w=b.lastChild
-else w=c!=null&&J.pO(c)?J.MQ(c):null
+else w=c!=null&&J.yx(c)?J.MQ(c):null
 if(w==null)w=y
 z=z.U(a,2)
-H.IC(this.YC,z,[w,d])
-v=J.TZ(this.e9.N1)
+H.IC(this.SU,z,[w,d])
+v=J.Tm(this.YS.rF)
 u=J.tx(y)
 if(x)v.insertBefore(b,u)
-else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},
-MC:function(a){var z,y,x,w,v,u,t,s
+else if(c!=null)for(z=J.mY(c);z.G();)v.insertBefore(z.gl(),u)},
+ne:function(a){var z,y,x,w,v,u,t,s
 z=[]
 z.$builtinTypeInfo=[W.KV]
 y=J.Wx(a)
-x=this.wx(y.W(a,1))
-w=this.wx(a)
-v=this.YC
-u=J.WB(y.U(a,2),1)
+x=this.F1(y.W(a,1))
+w=this.F1(a)
+v=this.SU
+u=J.ew(y.U(a,2),1)
 if(u>>>0!==u||u>=v.length)return H.e(v,u)
 t=v[u]
-C.Nm.UZ(v,y.U(a,2),J.WB(y.U(a,2),2))
-J.TZ(this.e9.N1)
-for(y=J.RE(x);!J.de(w,x);){s=y.guD(x)
+C.Nm.UZ(v,y.U(a,2),J.ew(y.U(a,2),2))
+J.Tm(this.YS.rF)
+for(y=J.RE(x);!J.xC(w,x);){s=y.guD(x)
 if(s==null?w==null:s===w)w=x
 v=s.parentNode
 if(v!=null)v.removeChild(s)
-z.push(s)}return new M.Ya(z,t)},
-El:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-if(this.pq)return
-z=this.e9
-y=z.N1
-x=(!!J.x(z.N1).$isDT?z.N1:z).gzH()
-w=J.RE(y)
-if(w.gKV(y)==null||W.Pv(w.gM0(y).defaultView)==null){this.cO(0)
-return}if(!this.U9){this.U9=!0
-if(x!=null){this.DO=x.CE(y)
-this.Fy=null}}v=P.Py(P.N3(),null,null,P.a,M.Ya)
-for(w=J.w1(a),u=w.gA(a),t=0;u.G();){s=u.gl()
-for(r=s.gRt(),r=r.gA(r),q=J.RE(s);r.G();)v.u(0,r.lo,this.MC(J.WB(q.gvH(s),t)))
-r=s.gNg()
-if(typeof r!=="number")return H.s(r)
-t-=r}for(w=w.gA(a);w.G();){s=w.gl()
-for(u=J.RE(s),p=u.gvH(s);r=J.Wx(p),r.C(p,J.WB(u.gvH(s),s.gNg()));p=r.g(p,1)){o=J.UQ(this.xG,p)
-n=v.Rz(0,o)
-if(n!=null&&J.pO(J.Y5(n))){q=J.RE(n)
-m=q.gkU(n)
-l=q.gyT(n)
-k=null}else{m=[]
-if(this.DO!=null)o=this.Mv(o)
-k=o!=null?z.a5(o,x,m):null
-l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,568,264,[]],
-uS:function(a){var z
-for(z=J.GP(a);z.G();)J.wC(z.gl())},
-Gb:function(){var z=this.IY
+z.push(s)}return new M.wS(z,t)},
+cJ:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f
+if(this.Jh||J.FN(a)===!0)return
+t=this.YS
+s=t.rF
+if(J.Tm(s)==null){this.xO(0)
+return}r=this.vy
+Q.Y5(r,this.S6,a)
+z=t.nF
+if(!this.Wv){this.Wv=!0
+q=(!!J.x(t.rF).$isDT?t.rF:t).gzH()
+if(q!=null){this.eY=q.CE(s)
+this.jq=null}}p=P.YM(P.N3(),null,null,P.a,M.wS)
+for(o=J.w1(a),n=o.gA(a),m=0;n.G();){l=n.gl()
+for(k=l.gRt(),k=k.gA(k),j=J.RE(l);k.G();)p.u(0,k.lo,this.ne(J.ew(j.gvH(l),m)))
+k=l.gNg()
+if(typeof k!=="number")return H.s(k)
+m-=k}for(o=o.gA(a);o.G();){l=o.gl()
+for(n=J.RE(l),i=n.gvH(l);J.u6(i,J.ew(n.gvH(l),l.gNg()));++i){if(i>>>0!==i||i>=r.length)return H.e(r,i)
+y=r[i]
+x=null
+h=p.Rz(0,y)
+w=null
+if(h!=null&&J.yx(J.Bq(h))){w=h.gWf()
+g=J.Bq(h)}else{try{w=[]
+if(this.eY!=null)y=this.RV(y)
+if(y!=null)x=t.a5(y,z,w)}catch(f){k=H.Ru(f)
+v=k
+u=new H.oP(f,null)
+k=new P.vs(0,$.X3,null,null,null,null,null,null)
+k.$builtinTypeInfo=[null]
+new P.Zf(k).$builtinTypeInfo=[null]
+j=v
+if(j==null)H.vh(P.u("Error must not be null"))
+if(k.Gv!==0)H.vh(P.w("Future already completed"))
+k.CG(j,u)}g=null}this.uy(i,x,g,w)}}for(t=p.gUQ(p),t=H.VM(new H.MH(null,J.mY(t.l6),t.T6),[H.Kp(t,0),H.Kp(t,1)]);t.G();)this.Ep(t.lo.gWf())},"$1","gk8",2,0,161,162],
+Ep:function(a){var z
+for(z=J.mY(a);z.G();)J.yd(z.gl())},
+Ke:function(){var z=this.VC
 if(z==null)return
 z.ed()
-this.IY=null},
-cO:function(a){var z,y
-if(this.pq)return
-this.Gb()
-for(z=this.YC,y=1;y<z.length;y+=2)this.uS(z[y])
+this.VC=null},
+xO:function(a){var z,y
+if(this.Jh)return
+this.Ke()
+for(z=this.SU,y=1;y<z.length;y+=2)this.Ep(z[y])
 C.Nm.sB(z,0)
-z=this.FS
-if(z!=null){z.ed()
-this.FS=null}this.e9.kr=null
-this.pq=!0}},
-VU:{
-"^":"Tp:116;",
-$1:[function(a){return[a]},"$1",null,2,0,null,28,[],"call"],
-$isEH:true},
-Kj:{
-"^":"Tp:569;a",
-$1:[function(a){var z,y,x
-z=J.U6(a)
-y=z.t(a,0)
-x=z.t(a,1)
-if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"$1",null,2,0,null,567,[],"call"],
-$isEH:true},
-R7:{
-"^":"Tp:116;b",
-$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,353,[],"call"],
-$isEH:true},
-Ya:{
-"^":"a;yT>,kU>",
-$isYa:true},
+this.x5()
+this.YS.os=null
+this.Jh=!0}},
+wS:{
+"^":"a;UN>,Wf<",
+$iswS:true},
 XT:{
-"^":"TU;N1,mD,Ck",
-Z1:function(a,b,c,d){var z,y,x
-if(!J.de(b,"text"))return M.TU.prototype.Z1.call(this,this,b,c,d)
-this.Ih(0,b)
-z=this.gCd(this)
-y=this.N1
-x=d!=null?d:""
-x=new M.ic(y,c,null,null,"text",x)
-x.Og(y,"text",c,d)
-z.u(0,b,x)
-return x}},
-ic:{
-"^":"TR;qP,ZY,xS,PB,eS,ay",
-EC:function(a){var z=this.qP
-J.c9(z,a==null?"":H.d(a))}},
+"^":"vy;rF,u2,Vw",
+nR:function(a,b,c,d){var z
+if(!J.xC(b,"text"))return M.vy.prototype.nR.call(this,this,b,c,d)
+if(d){z=c==null?"":H.d(c)
+J.t3(this.rF,z)
+return}this.Yj(0,b)
+z=this.gMm()
+z.$1(J.mu(c,z))
+this.gCd(this).u(0,b,c)
+return c},
+ux:[function(a){var z=a==null?"":H.d(a)
+J.t3(this.rF,z)},"$1","gMm",2,0,10,18]},
 wl:{
-"^":"V2;N1,mD,Ck",
-gN1:function(){return this.N1},
-Z1:function(a,b,c,d){var z,y,x
-if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-z=this.gN1()
-J.MV(!!J.x(z).$isTU?z:this,b)
-J.Vs(this.N1).Rz(0,b)
+"^":"V2;rF,u2,Vw",
+grF:function(){return this.rF},
+nR:function(a,b,c,d){var z,y,x,w
+if(!J.xC(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
+if(d){M.pw(this.rF,c,b)
+return}J.SB(!!J.x(this.grF()).$isvy?this.grF():this,b)
+J.Vs(this.rF).Rz(0,b)
 z=this.gCd(this)
-y=this.N1
-x=d!=null?d:""
-x=new M.NP(null,y,c,null,null,"value",x)
-x.Og(y,"value",c,d)
-x.Ca=M.IP(y).yI(x.gqf())
+y=this.rF
+x=new M.b2(y,null,c,b)
+x.E3=M.IP(y).yI(x.gCL())
+w=x.gfM()
+M.pw(y,J.mu(x.vt,w),b)
 z.u(0,b,x)
 return x}}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
 "^":"",
-T4p:{
-"^":"a;"}}],["template_binding.src.node_binding","package:template_binding/src/node_binding.dart",,X,{
+VE:{
+"^":"a;"}}],["template_binding.src.mustache_tokens","package:template_binding/src/mustache_tokens.dart",,S,{
 "^":"",
-TR:{
-"^":"a;qP<",
-gH:function(){return this.qP},
-gk8:function(){return this.ZY},
-gP:function(a){return J.Vm(this.xS)},
-sP:function(a,b){J.ta(this.xS,b)},
-cO:function(a){var z
-if(this.qP==null)return
-z=this.PB
-if(z!=null)z.ed()
-this.PB=null
-this.xS=null
-this.qP=null
-this.ZY=null},
-Og:function(a,b,c,d){var z,y
-z=J.x(this.ZY)
-z=(!!z.$isWR||!!z.$isJ3)&&J.de(d,"value")
-y=this.ZY
-if(z){this.xS=y
-z=y}else{z=L.Sk(y,this.ay,null)
-this.xS=z}this.PB=J.xq(z).yI(new X.VD(this))
-this.EC(J.Vm(this.xS))},
-$isTR:true},
-VD:{
-"^":"Tp:116;a",
-$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,353,[],"call"],
-$isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
+ab:{
+"^":"a;jU,eq<,V6",
+gqz:function(){return this.jU.length===5},
+gaW:function(){var z,y
+z=this.jU
+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},
+gcK:function(){return this.V6},
+qm:function(a){return this.gcK().$1(a)},
+gB:function(a){return C.jn.cU(this.jU.length,4)},
+AX:function(a){var z,y
+z=this.jU
+y=a*4+1
+if(y>=z.length)return H.e(z,y)
+return z[y]},
+Pn:function(a){var z,y
+z=this.jU
+y=a*4+2
+if(y>=z.length)return H.e(z,y)
+return z[y]},
+HH:function(a){var z,y
+z=this.jU
+y=a*4+3
+if(y>=z.length)return H.e(z,y)
+return z[y]},
+pu:[function(a){var z,y,x,w
+if(a==null)a=""
+z=this.jU
+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
+if(w>=x)return H.e(z,w)
+return y+H.d(z[w])},"$1","gzf",2,0,163,18],
+cH:[function(a){var z,y,x,w,v,u,t,s
+z=this.jU
+if(0>=z.length)return H.e(z,0)
+y=P.p9(z[0])
+x=C.jn.cU(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
+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","gB5",2,0,164,165],
+l3:function(a,b){this.V6=this.jU.length===5?this.gzf():this.gB5()},
+static:{"^":"rz5,jO,t3a,epG,UO,Ftg",iw: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
+for(y=b==null,x=J.U6(a),w=null,v=0,u=!0;v<z;){t=x.XU(a,"{{",v)
+s=C.xB.XU(a,"[[",v)
+if(s>=0)r=t<0||s<t
+else r=!1
+if(r){t=s
+q=!0
+p="]]"}else{q=!1
+p="}}"}o=t>=0?C.xB.XU(a,p,t+2):-1
+if(o<0){if(w==null)return
+w.push(C.xB.yn(a,v))
+break}if(w==null)w=[]
+w.push(C.xB.Nj(a,v,t))
+n=C.xB.bS(C.xB.Nj(a,t+2,o))
+w.push(q)
+u=u&&q
+m=y?null:b.$1(n)
+if(m==null)w.push(L.hk(n))
+else w.push(null)
+w.push(m)
+v=o+2}if(v===z)w.push("")
+y=new S.ab(w,u,null)
+y.l3(w,u)
+return y}}}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
 "^":"",
 I5:{
-"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.Ye]},
-static:{cF:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{vC:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.V8.ZL(a)
-C.V8.oX(a)
-return a},null,null,0,0,115,"new VMRefElement$created"]}},
-"+VMRefElement":[342]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
+a.on=z
+a.BA=y
+a.LL=w
+C.u2.ZL(a)
+C.u2.XI(a)
+return a}}}}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
 "^":"",
-en:{
-"^":["V36;ID%-317,lc%-570,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzf:[function(a){return a.ID},null,null,1,0,522,"vm",308,311],
-szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,571,30,[],"vm",308],
-gkc:[function(a){return a.lc},null,null,1,0,536,"error",308,311],
-skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,537,30,[],"error",308],
-pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.Hk]},
-static:{oH:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+el:{
+"^":"V38;uB,lc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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)},
+RF:[function(a,b){J.LE(a.uB).wM(b)},"$1","gVm",2,0,17,66],
+static:{oH:function(a){var z,y,x,w
+z=$.J1()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.nt.ZL(a)
-C.nt.oX(a)
-return a},null,null,0,0,115,"new VMViewElement$created"]}},
-"+VMViewElement":[572],
-V36:{
+C.nt.XI(a)
+return a}}},
+V38:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
-J.O.$isString=true
-J.O.$isTx=true
-J.O.$asTx=[J.O]
-J.O.$isa=true
-J.P.$isTx=true
-J.P.$asTx=[J.P]
-J.P.$isa=true
-J.bU.$isint=true
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isa=true
-J.Pp.$isdouble=true
-J.Pp.$isTx=true
-J.Pp.$asTx=[J.P]
-J.Pp.$isTx=true
-J.Pp.$asTx=[J.P]
-J.Pp.$isa=true
+P.KN.$isKN=true
+P.KN.$isRz=true
+P.KN.$asRz=[P.FK]
+P.KN.$isa=true
+P.CP.$isCP=true
+P.CP.$isRz=true
+P.CP.$asRz=[P.FK]
+P.CP.$isa=true
 W.KV.$isKV=true
-W.KV.$isD0=true
 W.KV.$isa=true
-W.nX.$isa=true
+W.my.$isa=true
 W.yg.$isa=true
-W.uj.$isa=true
-N.qV.$isTx=true
-N.qV.$asTx=[N.qV]
+W.M5.$isa=true
+P.qU.$isqU=true
+P.qU.$isRz=true
+P.qU.$asRz=[P.qU]
+P.qU.$isa=true
+P.FK.$isRz=true
+P.FK.$asRz=[P.FK]
+P.FK.$isa=true
+N.qV.$isRz=true
+N.qV.$asRz=[N.qV]
 N.qV.$isa=true
 P.a6.$isa6=true
-P.a6.$isTx=true
-P.a6.$asTx=[P.a6]
+P.a6.$isRz=true
+P.a6.$asRz=[P.a6]
 P.a6.$isa=true
-J.Q.$isList=true
-J.Q.$isQV=true
-J.Q.$isa=true
-P.Od.$isa=true
-P.a.$isa=true
-W.cv.$iscv=true
-W.cv.$isKV=true
-W.cv.$isD0=true
-W.cv.$isD0=true
-W.cv.$isa=true
 P.qv.$isa=true
-U.EZ.$ishw=true
-U.EZ.$isa=true
+P.WO.$isWO=true
+P.WO.$iscX=true
+P.WO.$isa=true
+W.h4.$ish4=true
+W.h4.$isKV=true
+W.h4.$isa=true
+P.a.$isa=true
+P.Od.$isa=true
+K.O1.$isO1=true
+K.O1.$isa=true
+U.WH.$ishw=true
+U.WH.$isa=true
 U.Jy.$ishw=true
 U.Jy.$isa=true
 U.zX.$iszX=true
 U.zX.$ishw=true
 U.zX.$isa=true
-U.X7.$ishw=true
-U.X7.$isa=true
-U.uk.$ishw=true
-U.uk.$isa=true
+U.Cu.$ishw=true
+U.Cu.$isa=true
+U.x0.$ishw=true
+U.x0.$isa=true
+U.Mp.$ishw=true
+U.Mp.$isa=true
 U.x9.$ishw=true
 U.x9.$isa=true
 U.no.$ishw=true
 U.no.$isa=true
-U.jK.$ishw=true
-U.jK.$isa=true
-U.w6.$isw6=true
-U.w6.$ishw=true
-U.w6.$isa=true
-U.wk.$ishw=true
-U.wk.$isa=true
-U.kB.$ishw=true
-U.kB.$isa=true
-K.Ae.$isAe=true
-K.Ae.$isa=true
-N.TJ.$isa=true
-P.wv.$iswv=true
-P.wv.$isa=true
+U.cJ.$ishw=true
+U.cJ.$isa=true
+U.elO.$iselO=true
+U.elO.$ishw=true
+U.elO.$isa=true
+U.c0.$ishw=true
+U.c0.$isa=true
+U.ae.$ishw=true
+U.ae.$isa=true
+U.Mm.$ishw=true
+U.Mm.$isa=true
 T.yj.$isyj=true
 T.yj.$isa=true
-J.kn.$isbool=true
-J.kn.$isa=true
-W.OJ.$isea=true
-W.OJ.$isa=true
-A.XP.$isXP=true
-A.XP.$iscv=true
-A.XP.$isKV=true
-A.XP.$isD0=true
-A.XP.$isD0=true
+P.IN.$isIN=true
+P.IN.$isa=true
+P.uq.$isa=true
+N.Rw.$isa=true
+G.DA.$isDA=true
+G.DA.$isa=true
+G.Y2.$isY2=true
+G.Y2.$isa=true
+W.tV.$ish4=true
+W.tV.$isKV=true
+W.tV.$isa=true
+N.HV.$isHV=true
+N.HV.$isa=true
+P.a2.$isa2=true
+P.a2.$isa=true
 A.XP.$isa=true
-P.RS.$isQF=true
-P.RS.$isa=true
-H.Zk.$isQF=true
-H.Zk.$isQF=true
-H.Zk.$isQF=true
-H.Zk.$isa=true
-P.D4.$isD4=true
-P.D4.$isQF=true
-P.D4.$isQF=true
-P.D4.$isa=true
-P.vr.$isvr=true
-P.vr.$isQF=true
-P.vr.$isa=true
-P.NL.$isQF=true
-P.NL.$isa=true
-P.QF.$isQF=true
-P.QF.$isa=true
-P.RY.$isQF=true
-P.RY.$isa=true
-P.tg.$isX9=true
-P.tg.$isQF=true
-P.tg.$isa=true
-P.X9.$isX9=true
-P.X9.$isQF=true
-P.X9.$isa=true
-P.Ms.$isMs=true
-P.Ms.$isX9=true
-P.Ms.$isQF=true
-P.Ms.$isQF=true
-P.Ms.$isa=true
-P.Ys.$isQF=true
-P.Ys.$isa=true
-X.TR.$isa=true
-P.MO.$isMO=true
-P.MO.$isa=true
+A.Ap.$isa=true
+L.Tv.$isTv=true
+L.Tv.$isa=true
+M.wS.$isa=true
 F.d3.$isa=true
 W.ea.$isea=true
 W.ea.$isa=true
-P.qh.$isqh=true
-P.qh.$isa=true
-W.Wp.$isWp=true
-W.Wp.$isea=true
-W.Wp.$isa=true
-G.DA.$isDA=true
-G.DA.$isa=true
-M.Ya.$isa=true
-Y.Pn.$isa=true
-U.hw.$ishw=true
-U.hw.$isa=true
-A.zs.$iscv=true
-A.zs.$isKV=true
-A.zs.$isD0=true
-A.zs.$isD0=true
-A.zs.$isa=true
-A.bS.$isa=true
-G.Y2.$isa=true
-P.uq.$isa=true
-P.iD.$isiD=true
-P.iD.$isa=true
-W.YN.$isKV=true
-W.YN.$isD0=true
-W.YN.$isa=true
-N.HV.$isHV=true
-N.HV.$isa=true
-H.yo.$isa=true
-H.IY.$isa=true
-H.aX.$isa=true
-W.I0.$isKV=true
-W.I0.$isD0=true
-W.I0.$isa=true
+P.cb.$iscb=true
+P.cb.$isa=true
+P.MO.$isMO=true
+P.MO.$isa=true
+W.Oq.$isOq=true
+W.Oq.$isea=true
+W.Oq.$isa=true
+A.dM.$ish4=true
+A.dM.$isKV=true
+A.dM.$isa=true
 D.af.$isaf=true
 D.af.$isa=true
 D.bv.$isaf=true
 D.bv.$isa=true
-W.cx.$isea=true
-W.cx.$isa=true
-D.Vi.$isa=true
-D.e5.$isa=true
-D.Q4.$isa=true
-D.N8.$isa=true
+D.ta.$isa=true
+D.ER.$isa=true
+D.DP.$isa=true
+D.uA.$isa=true
 D.U4.$isaf=true
 D.U4.$isa=true
-D.rj.$isrj=true
-D.rj.$isaf=true
-D.rj.$isa=true
-D.SI.$isSI=true
-D.SI.$isaf=true
-D.SI.$isqC=true
-D.SI.$asqC=[null,null]
-D.SI.$isZ0=true
-D.SI.$asZ0=[null,null]
-D.SI.$isa=true
+D.vx.$isvx=true
+D.vx.$isaf=true
+D.vx.$isa=true
+D.vO.$isvO=true
+D.vO.$isaf=true
+D.vO.$isqC=true
+D.vO.$asqC=[null,null]
+D.vO.$isZ0=true
+D.vO.$asZ0=[null,null]
+D.vO.$isa=true
+D.c2.$isc2=true
 D.c2.$isa=true
-W.zU.$isD0=true
-W.zU.$isa=true
-W.ew.$isea=true
-W.ew.$isa=true
-D.Z9.$isa=true
-G.Ni.$isa=true
+W.fJ.$isa=true
+W.kQ.$isea=true
+W.kQ.$isa=true
 D.kx.$iskx=true
 D.kx.$isaf=true
 D.kx.$isa=true
-D.t9.$isa=true
-W.qp.$iscv=true
-W.qp.$isKV=true
-W.qp.$isD0=true
-W.qp.$isD0=true
-W.qp.$isa=true
+D.D5.$isa=true
+D.HJ.$isa=true
+W.AW.$isea=true
+W.AW.$isa=true
+H.zL.$isa=true
+H.IY.$isa=true
+H.aX.$isa=true
+W.I0.$isKV=true
+W.I0.$isa=true
+Y.qS.$isa=true
+U.hw.$ishw=true
+U.hw.$isa=true
+G.Ni.$isa=true
 P.MN.$isMN=true
 P.MN.$isa=true
 P.KA.$isKA=true
-P.KA.$isnP=true
+P.KA.$isoK=true
 P.KA.$isMO=true
 P.KA.$isa=true
-P.JI.$isJI=true
-P.JI.$isKA=true
-P.JI.$isnP=true
-P.JI.$isMO=true
-P.JI.$isa=true
-H.Uz.$isUz=true
-H.Uz.$isD4=true
-H.Uz.$isQF=true
-H.Uz.$isQF=true
-H.Uz.$isQF=true
-H.Uz.$isQF=true
-H.Uz.$isQF=true
-H.Uz.$isa=true
-P.e4y.$ise4y=true
-P.e4y.$isa=true
-P.dl.$isdl=true
-P.dl.$isa=true
+P.f6.$isf6=true
+P.f6.$isKA=true
+P.f6.$isoK=true
+P.f6.$isMO=true
+P.f6.$isa=true
 V.qC.$isqC=true
 V.qC.$isZ0=true
 V.qC.$isa=true
-P.jp.$isjp=true
-P.jp.$isa=true
-P.Tx.$isTx=true
-P.Tx.$isa=true
-W.D0.$isD0=true
-W.D0.$isa=true
-P.aY.$isaY=true
-P.aY.$isa=true
-P.Z0.$isZ0=true
-P.Z0.$isa=true
-P.tU.$istU=true
-P.tU.$isa=true
-P.QV.$isQV=true
-P.QV.$isa=true
-P.nP.$isnP=true
-P.nP.$isa=true
+P.Rz.$isRz=true
+P.Rz.$isa=true
+P.cX.$iscX=true
+P.cX.$isa=true
 P.b8.$isb8=true
 P.b8.$isa=true
-P.iP.$isiP=true
-P.iP.$isTx=true
-P.iP.$asTx=[null]
-P.iP.$isa=true
-P.fIm.$isfIm=true
-P.fIm.$isa=true
-O.Qb.$isQb=true
-O.Qb.$isa=true
-D.fJ.$isfJ=true
-D.fJ.$isaf=true
-D.fJ.$isa=true
-D.hR.$ishR=true
-D.hR.$isaf=true
-D.hR.$isa=true
 P.EH.$isEH=true
 P.EH.$isa=true
+P.oK.$isoK=true
+P.oK.$isa=true
+P.fIm.$isfIm=true
+P.fIm.$isa=true
+P.iP.$isiP=true
+P.iP.$isRz=true
+P.iP.$asRz=[null]
+P.iP.$isa=true
+O.Hz.$isHz=true
+O.Hz.$isa=true
+L.AR.$isAR=true
+L.AR.$isa=true
+P.Z0.$isZ0=true
+P.Z0.$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
 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
-if(!(a instanceof P.a))return J.is.prototype
+if(!(a instanceof P.a))return J.kdQ.prototype
 return a}
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.ks(a)}
+return J.M3(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.ks(a)}
+return J.M3(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.is.prototype
+if(!(a instanceof P.a))return J.kdQ.prototype
 return a}
 J.rY=function(a){if(typeof a=="string")return J.O.prototype
 if(a==null)return a
-if(!(a instanceof P.a))return J.is.prototype
+if(!(a instanceof P.a))return J.kdQ.prototype
 return a}
 J.w1=function(a){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.ks(a)}
-J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.bU.prototype
+return J.M3(a)}
+J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.L7.prototype
 return J.Pp.prototype}if(typeof a=="string")return J.O.prototype
-if(a==null)return J.Jh.prototype
-if(typeof a=="boolean")return J.kn.prototype
+if(a==null)return J.we.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.ks(a)}
-J.AA=function(a){return J.RE(a).GB(a)}
-J.AB=function(a){return J.RE(a).gkU(a)}
+return J.M3(a)}
+J.A4=function(a,b){return J.RE(a).sjx(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.AK=function(a){return J.RE(a).Zi(a)}
-J.Ag=function(a){return J.RE(a).goY(a)}
-J.Aw=function(a,b){return J.RE(a).sHp(a,b)}
-J.BM=function(a,b,c){return J.w1(a).xe(a,b,c)}
-J.Ba=function(a){return J.RE(a).gUx(a)}
+J.AL=function(a){return J.RE(a).gW6(a)}
+J.Ae=function(a,b){return J.RE(a).sd4(a,b)}
+J.Ak=function(a){return J.RE(a).ghy(a)}
+J.Aw=function(a){return J.RE(a).gb6(a)}
+J.B9=function(a,b){return J.RE(a).shN(a,b)}
+J.BC=function(a,b){return J.RE(a).sja(a,b)}
+J.BT=function(a){return J.RE(a).gNG(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.Bx=function(a){return J.RE(a).gRH(a)}
+J.Bq=function(a){return J.RE(a).gUN(a)}
+J.By=function(a,b){return J.RE(a).sLW(a,b)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
-J.Cl=function(a,b,c){return J.w1(a).Mu(a,b,c)}
+J.CN=function(a){return J.RE(a).gd0(a)}
+J.D9=function(a){return J.RE(a).GB(a)}
+J.DF=function(a,b){return J.RE(a).soc(a,b)}
+J.DL=function(a){return J.RE(a).gK4(a)}
+J.DO=function(a){return J.RE(a).gR(a)}
+J.Dd=function(a){return J.RE(a).gLe(a)}
+J.Dh=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
+J.Dn=function(a,b){return J.w1(a).zV(a,b)}
+J.Do=function(a){return J.RE(a).gM0(a)}
+J.Dq=function(a,b){return J.w1(a).Rz(a,b)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
+J.Dz=function(a,b){return J.RE(a).sDX(a,b)}
+J.E3=function(a){return J.RE(a).gRu(a)}
 J.EC=function(a){return J.RE(a).giC(a)}
-J.EY=function(a,b){return J.RE(a).od(a,b)}
-J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
+J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
+J.EO=function(a){return J.RE(a).gks(a)}
 J.Eh=function(a,b){return J.Wx(a).O(a,b)}
-J.Ew=function(a){return J.RE(a).gSw(a)}
-J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
-J.F6=function(a,b){return J.RE(a).stD(a,b)}
+J.El=function(a,b){return J.RE(a).sU4(a,b)}
+J.Er=function(a,b){return J.RE(a).sfY(a,b)}
+J.Ew=function(a){return J.RE(a).gkm(a)}
+J.Ex=function(a,b){return J.RE(a).sjl(a,b)}
 J.F8=function(a){return J.RE(a).gjO(a)}
+J.FI=function(a){return J.RE(a).gig(a)}
 J.FN=function(a){return J.U6(a).gl0(a)}
-J.FW=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
-return J.Wx(a).V(a,b)}
-J.G6=function(a){return J.RE(a).grz(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.GP=function(a){return J.w1(a).gA(a)}
+J.FS=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
+J.FW=function(a,b){return J.rY(a).j(a,b)}
+J.Fc=function(a,b){return J.RE(a).sP(a,b)}
+J.Ff=function(a){return J.RE(a).gXN(a)}
+J.Fg=function(a,b){return J.RE(a).sKE(a,b)}
+J.GT=function(a,b){return J.RE(a).sQl(a,b)}
 J.GW=function(a){return J.RE(a).gVY(a)}
-J.H2=function(a,b){return J.RE(a).sDD(a,b)}
+J.Gc=function(a){return J.RE(a).gnv(a)}
+J.H3=function(a,b){return J.RE(a).sZA(a,b)}
 J.HF=function(a){return J.RE(a).gD7(a)}
-J.Hf=function(a){return J.RE(a).gTq(a)}
-J.IQ=function(a){return J.RE(a).Ms(a)}
-J.IS=function(a){return J.RE(a).gnv(a)}
-J.Ih=function(a,b,c){return J.RE(a).X6(a,b,c)}
+J.Hn=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
+return J.Wx(a).W(a,b)}
+J.Hr=function(a){return J.RE(a).gL0(a)}
+J.I1=function(a){return J.RE(a).gSf(a)}
+J.I2=function(a){return J.RE(a).gwv(a)}
+J.II=function(a){return J.w1(a).Jd(a)}
+J.IJ=function(a){return J.RE(a).gHt(a)}
+J.IO=function(a){return J.RE(a).gRH(a)}
+J.IX=function(a,b){return J.RE(a).sEu(a,b)}
+J.Ip=function(a,b){return J.RE(a).QS(a,b)}
+J.Is=function(a,b){return J.rY(a).Tc(a,b)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
-J.J4=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
 J.J5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>=b
 return J.Wx(a).F(a,b)}
 J.JA=function(a,b,c){return J.rY(a).h8(a,b,c)}
+J.JD=function(a){return J.RE(a).gSs(a)}
+J.JG=function(a){return J.RE(a).gHn(a)}
 J.JZ=function(a,b){return J.RE(a).st0(a,b)}
-J.Jj=function(a,b,c,d){return J.RE(a).Z1(a,b,c,d)}
+J.Ja=function(a){return J.RE(a).gr9(a)}
+J.Jb=function(a,b){return J.RE(a).sdu(a,b)}
+J.Jj=function(a){return J.RE(a).gWA(a)}
+J.Jp=function(a){return J.RE(a).gjl(a)}
 J.Jr=function(a,b){return J.RE(a).Id(a,b)}
-J.K3=function(a,b){return J.RE(a).Kb(a,b)}
-J.KM=function(a,b){return J.U6(a).sB(a,b)}
-J.Kf=function(a,b){return J.RE(a).WO(a,b)}
-J.Kv=function(a,b){return J.RE(a).jx(a,b)}
-J.Kz=function(a){return J.RE(a).gph(a)}
-J.L0=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
-J.LH=function(a,b){return J.w1(a).GT(a,b)}
+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.Kd=function(a){return J.RE(a).gRY(a)}
+J.Kl=function(a){return J.RE(a).gBP(a)}
+J.Kn=function(a){return J.Wx(a).yu(a)}
+J.Kt=function(a){return J.RE(a).gG3(a)}
+J.L9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
+return J.Wx(a).V(a,b)}
+J.LB=function(a){return J.RE(a).gX0(a)}
+J.LE=function(a){return J.RE(a).VD(a)}
+J.LI=function(a,b){return J.RE(a).sGq(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.LY=function(a){return J.RE(a).gPZ(a)}
 J.Ld=function(a,b){return J.w1(a).eR(a,b)}
 J.Lh=function(a,b,c){return J.RE(a).ek(a,b,c)}
-J.Lp=function(a,b){return J.RE(a).st5(a,b)}
-J.MI=function(a,b){return J.RE(a).PN(a,b)}
+J.Ln=function(a){return J.RE(a).gdU(a)}
+J.Lp=function(a){return J.RE(a).geT(a)}
+J.M4=function(a){return J.RE(a).gJN(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.MQ=function(a){return J.w1(a).grZ(a)}
-J.MV=function(a,b){return J.RE(a).Ih(a,b)}
+J.Mb=function(a){return J.RE(a).gSY(a)}
+J.Mi=function(a,b){return J.RE(a).sWA(a,b)}
+J.Mo=function(a){return J.RE(a).gx6(a)}
 J.Mu=function(a,b){return J.RE(a).sig(a,b)}
-J.Mv=function(a){return J.RE(a).ghw(a)}
-J.Mz=function(a){return J.rY(a).hc(a)}
-J.NI=function(a){return J.RE(a).gBb(a)}
+J.Mx=function(a,b,c){return J.w1(a).aP(a,b,c)}
+J.Mz=function(a){return J.RE(a).goE(a)}
+J.N1=function(a){return J.RE(a).Es(a)}
+J.ND=function(a,b){return J.RE(a).sDQ(a,b)}
+J.NO=function(a,b){return J.RE(a).soE(a,b)}
+J.NQ=function(a){return J.RE(a).gjb(a)}
+J.NT=function(a,b,c){return J.U6(a).eM(a,b,c)}
+J.Nd=function(a){return J.w1(a).br(a)}
 J.Nf=function(a,b){return J.RE(a).syw(a,b)}
-J.Ng=function(a){return J.RE(a).gxX(a)}
 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.O2=function(a,b){return J.RE(a).Ch(a,b)}
+J.Nl=function(a){return J.RE(a).gO3(a)}
+J.O2=function(a){return J.RE(a).JP(a)}
 J.O6=function(a){return J.RE(a).goc(a)}
-J.OBt=function(a){return J.RE(a).gfg(a)}
+J.OB=function(a){return J.RE(a).gfg(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
+J.OL=function(a){return J.RE(a).gQl(a)}
+J.OP=function(a){return J.RE(a).gVm(a)}
 J.OS=function(a,b){return J.w1(a).tt(a,b)}
-J.Or=function(a){return J.RE(a).yx(a)}
+J.Ok=function(a){return J.RE(a).ghU(a)}
+J.P5=function(a){return J.RE(a).gHo(a)}
+J.PB=function(a){return J.RE(a).gI(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.PY=function(a){return J.RE(a).goN(a)}
+J.Pk=function(a,b){return J.RE(a).svu(a,b)}
+J.Pl=function(a,b){return J.RE(a).sM6(a,b)}
+J.Pr=function(a){return J.RE(a).gU4(a)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
-J.Q5=function(a){return J.RE(a).gwl(a)}
-J.Q8=function(a){return J.RE(a).gp8(a)}
-J.QC=function(a){return J.w1(a).wg(a)}
+J.Q4=function(a){return J.RE(a).gph(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){return J.RE(a).gdB(a)}
 J.QE=function(a){return J.RE(a).gCd(a)}
-J.QM=function(a,b){return J.RE(a).Rg(a,b)}
-J.QP=function(a){return J.RE(a).gF1(a)}
+J.QT=function(a,b){return J.RE(a).vV(a,b)}
+J.QX=function(a){return J.RE(a).gUo(a)}
 J.Qd=function(a){return J.RE(a).gRn(a)}
+J.Qk=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.Qr=function(a,b){return J.RE(a).skc(a,b)}
+J.Qv=function(a,b){return J.RE(a).sX0(a,b)}
+J.Qy=function(a,b){return J.RE(a).shf(a,b)}
+J.RC=function(a){return J.RE(a).gTA(a)}
+J.RF=function(a,b){return J.RE(a).WO(a,b)}
+J.Rx=function(a,b){return J.RE(a).sEl(a,b)}
+J.Ry=function(a){return J.RE(a).gLW(a)}
+J.S2=function(a,b){return J.RE(a).jn(a,b)}
+J.S5=function(a,b){return J.RE(a).sbA(a,b)}
+J.S9=function(a){return J.RE(a).gyX(a)}
+J.SB=function(a,b){return J.RE(a).Yj(a,b)}
+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.Sq=function(a,b){return J.RE(a).zY(a,b)}
-J.TD=function(a){return J.RE(a).i4(a)}
-J.TZ=function(a){return J.RE(a).gKV(a)}
-J.Tr=function(a){return J.RE(a).gCj(a)}
+J.SM=function(a){return J.RE(a).gbw(a)}
+J.SS=function(a,b){return J.RE(a).sIt(a,b)}
+J.SZ=function(a){return J.RE(a).gSO(a)}
+J.Sl=function(a){return J.RE(a).gxb(a)}
+J.Sz=function(a){return J.RE(a).gUx(a)}
+J.T1=function(a,b){return J.x(a).T(a,b)}
+J.T3=function(a,b){return J.RE(a).sni(a,b)}
+J.TR=function(a,b){return J.RE(a).saL(a,b)}
+J.Td=function(a){return J.RE(a).gpf(a)}
+J.Tm=function(a){return J.RE(a).gBy(a)}
+J.To=function(a){return J.RE(a).gni(a)}
 J.Ts=function(a,b){return J.Wx(a).Z(a,b)}
-J.Tt=function(a,b){return J.RE(a).sNl(a,b)}
+J.Tx=function(a,b){return J.RE(a).spf(a,b)}
 J.U2=function(a){return J.w1(a).V1(a)}
-J.U8=function(a){return J.RE(a).gUQ(a)}
-J.UK=function(a,b){return J.RE(a).RR(a,b)}
+J.U8o=function(a){return J.RE(a).gUQ(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.UQ=function(a,b){if(a.constructor==Array||typeof a=="string"||H.wV(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return 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.UT=function(a){return J.RE(a).gDQ(a)}
 J.UU=function(a,b){return J.U6(a).u8(a,b)}
-J.Ut=function(a,b,c,d){return J.RE(a).rJ(a,b,c,d)}
-J.V1=function(a,b){return J.w1(a).Rz(a,b)}
-J.VN=function(a){return J.RE(a).gM0(a)}
-J.Vf=function(a){return J.RE(a).gVE(a)}
+J.VJ=function(a,b){return J.w1(a).sit(a,b)}
+J.VL=function(a){return J.RE(a).gR2(a)}
+J.VZ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
+J.Vi=function(a){return J.RE(a).grO(a)}
 J.Vk=function(a,b){return J.w1(a).ev(a,b)}
+J.Vl=function(a){return J.RE(a).gja(a)}
 J.Vm=function(a){return J.RE(a).gP(a)}
-J.Vq=function(a){return J.RE(a).xo(a)}
+J.Vr=function(a,b){return J.RE(a).Kb(a,b)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
-J.Vw=function(a,b,c){return J.U6(a).Is(a,b,c)}
-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){return J.RE(a).gG3(a)}
-J.XH=function(a){return J.Wx(a).yu(a)}
-J.XS=function(a,b){return J.w1(a).zV(a,b)}
-J.Xf=function(a,b){return J.RE(a).oo(a,b)}
-J.Y5=function(a){return J.RE(a).gyT(a)}
-J.Y8=function(a,b,c){return J.w1(a).UZ(a,b,c)}
-J.YD=function(a){return J.RE(a).gR(a)}
-J.YP=function(a){return J.RE(a).gQ7(a)}
-J.YV=function(a){return J.RE(a).goE(a)}
-J.Yl=function(a){return J.w1(a).np(a)}
+J.Vw=function(a,b){return J.U6(a).sB(a,b)}
+J.W2=function(a){return J.RE(a).gCf(a)}
+J.WB=function(a,b){return J.RE(a).skZ(a,b)}
+J.WI=function(a,b){return J.RE(a).sLF(a,b)}
+J.WT=function(a){return J.RE(a).gFR(a)}
+J.WX=function(a){return J.RE(a).gbJ(a)}
+J.WY=function(a){return J.RE(a).gnp(a)}
+J.Wp=function(a){return J.RE(a).gQU(a)}
+J.XF=function(a,b){return J.RE(a).siC(a,b)}
+J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
+J.Yf=function(a){return J.w1(a).gIr(a)}
 J.Yq=function(a){return J.RE(a).gSR(a)}
-J.Z7=function(a){if(typeof a=="number")return-a
-return J.Wx(a).J(a)}
-J.ZP=function(a,b){return J.RE(a).Tk(a,b)}
+J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
+J.ZI=function(a,b){return J.RE(a).sIs(a,b)}
+J.ZL=function(a){return J.RE(a).gAF(a)}
+J.ZN=function(a){return J.RE(a).gqN(a)}
+J.ZU=function(a,b){return J.RE(a).sRY(a,b)}
 J.ZZ=function(a,b){return J.rY(a).yn(a,b)}
-J.aK=function(a,b,c){return J.U6(a).XU(a,b,c)}
-J.ak=function(a){return J.RE(a).gNF(a)}
-J.am=function(a){return J.RE(a).VD(a)}
+J.Zv=function(a){return J.RE(a).grs(a)}
+J.a8=function(a,b){return J.RE(a).sdU(a,b)}
+J.aA=function(a){return J.RE(a).gzY(a)}
+J.aT=function(a){return J.RE(a).god(a)}
 J.bB=function(a){return J.x(a).gbx(a)}
-J.bY=function(a,b){return J.Wx(a).Y(a,b)}
-J.bd=function(a,b){return J.RE(a).sBu(a,b)}
+J.ba=function(a){return J.RE(a).gKJ(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.c9=function(a,b){return J.RE(a).sa4(a,b)}
+J.br=function(a,b){return J.w1(a).XP(a,b)}
+J.bu=function(a){return J.RE(a).gyw(a)}
+J.c1=function(a,b){return J.RE(a).Wk(a,b)}
 J.cG=function(a){return J.RE(a).Ki(a)}
-J.cR=function(a,b){return J.Wx(a).WZ(a,b)}
+J.cO=function(a){return J.RE(a).gjx(a)}
+J.cU=function(a){return J.RE(a).gHh(a)}
 J.cZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
-J.cm=function(a,b){return J.RE(a).sFA(a,b)}
+J.cd=function(a){return J.RE(a).gql(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.de=function(a,b){if(a==null)return b==null
-if(typeof a!="object")return b!=null&&a===b
-return J.x(a).n(a,b)}
+J.dY=function(a){return J.RE(a).ga4(a)}
+J.de=function(a){return J.RE(a).gGd(a)}
+J.df=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
 J.dk=function(a,b){return J.RE(a).sMj(a,b)}
-J.e2=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
-J.eI=function(a,b){return J.RE(a).bA(a,b)}
-J.f5=function(a){return J.RE(a).gI(a)}
+J.eU=function(a){return J.RE(a).gY9(a)}
+J.eg=function(a){return J.RE(a).Ms(a)}
+J.ew=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
+return J.Qc(a).g(a,b)}
+J.fA=function(a){return J.RE(a).gJp(a)}
+J.fD=function(a){return J.RE(a).e6(a)}
 J.fH=function(a,b){return J.RE(a).stT(a,b)}
+J.fa=function(a){return J.RE(a).gMj(a)}
+J.fb=function(a,b){return J.RE(a).sql(a,b)}
+J.fc=function(a,b){return J.RE(a).sR(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.fi=function(a,b){return J.RE(a).ps(a,b)}
-J.i4=function(a,b){return J.w1(a).Zv(a,b)}
-J.iF=function(a,b){return J.RE(a).szZ(a,b)}
+J.fv=function(a,b){return J.RE(a).sUx(a,b)}
+J.fw=function(a){return J.RE(a).gEl(a)}
+J.hQ=function(a,b){return J.RE(a).sjT(a,b)}
+J.hS=function(a,b){return J.w1(a).srZ(a,b)}
+J.hb=function(a){return J.RE(a).gQ1(a)}
+J.hn=function(a){return J.RE(a).gEu(a)}
+J.i9=function(a,b){return J.w1(a).Zv(a,b)}
+J.iL=function(a){return J.RE(a).gNb(a)}
+J.iM=function(a,b){return J.RE(a).st5(a,b)}
 J.iS=function(a){return J.RE(a).gox(a)}
-J.iZ=function(a){return J.RE(a).gzZ(a)}
-J.ja=function(a,b){return J.w1(a).Vr(a,b)}
-J.jf=function(a,b){return J.x(a).T(a,b)}
-J.kE=function(a,b){return J.U6(a).tg(a,b)}
+J.iY=function(a){return J.RE(a).gnN(a)}
+J.io=function(a){return J.RE(a).gBV(a)}
+J.is=function(a){return J.RE(a).gZm(a)}
+J.iz=function(a,b){return J.RE(a).GE(a,b)}
+J.j1=function(a){return J.RE(a).gZA(a)}
+J.jH=function(a){return J.RE(a).ghN(a)}
+J.jM=function(a,b){return J.RE(a).sPj(a,b)}
+J.jP=function(a){return J.RE(a).gbA(a)}
+J.jd=function(a,b){return J.RE(a).snZ(a,b)}
+J.jo=function(a){return J.RE(a).gCI(a)}
+J.jz=function(a){if(typeof a=="number")return-a
+return J.Wx(a).J(a)}
+J.k7=function(a,b){return J.RE(a).sGd(a,b)}
+J.kB=function(a,b){return J.RE(a).sFR(a,b)}
+J.kE=function(a){return J.w1(a).git(a)}
 J.kH=function(a,b){return J.w1(a).aN(a,b)}
-J.kW=function(a,b,c){if((a.constructor==Array||H.wV(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
+J.kS=function(a){return J.RE(a).gVU(a)}
+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.kl=function(a,b){return J.w1(a).ez(a,b)}
-J.kq=function(a,b){return J.RE(a).sF1(a,b)}
+J.ks=function(a){return J.RE(a).gB1(a)}
+J.kv=function(a){return J.RE(a).glp(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.lB=function(a){return J.RE(a).gP1(a)}
-J.lE=function(a,b){return J.rY(a).j(a,b)}
-J.m4=function(a){return J.RE(a).gig(a)}
-J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
-return J.Wx(a).i(a,b)}
-J.nJ=function(a){return J.RE(a).ga4(a)}
+J.l7=function(a,b){return J.RE(a).sv8(a,b)}
+J.lN=function(a){return J.RE(a).gil(a)}
+J.lT=function(a){return J.RE(a).gOd(a)}
+J.ls=function(a){return J.RE(a).gt3(a)}
+J.m9=function(a,b){return J.RE(a).wR(a,b)}
+J.mP=function(a){return J.RE(a).gzj(a)}
+J.mU=function(a,b){return J.RE(a).skm(a,b)}
+J.mY=function(a){return J.w1(a).gA(a)}
+J.mu=function(a,b){return J.RE(a).TR(a,b)}
+J.n9=function(a){return J.RE(a).gQq(a)}
+J.nG=function(a){return J.RE(a).gv8(a)}
+J.ns=function(a){return J.RE(a).gjT(a)}
+J.o0=function(a,b){return J.RE(a).sRu(a,b)}
+J.o2=function(a,b){return J.RE(a).sSY(a,b)}
 J.oE=function(a,b){return J.Qc(a).iM(a,b)}
 J.oJ=function(a,b){return J.RE(a).srs(a,b)}
-J.oL=function(a){return J.RE(a).gE8(a)}
+J.oL=function(a){return J.RE(a).gWT(a)}
+J.oO=function(a,b){return J.RE(a).siJ(a,b)}
+J.okV=function(a,b){return J.RE(a).RR(a,b)}
 J.on=function(a){return J.RE(a).gtT(a)}
-J.pO=function(a){return J.U6(a).gor(a)}
+J.pB=function(a){return J.RE(a).gDX(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
-J.pe=function(a,b){return J.RE(a).pr(a,b)}
+J.pW=function(a,b,c,d){return J.RE(a).Si(a,b,c,d)}
+J.pb=function(a,b){return J.w1(a).Vr(a,b)}
+J.pm=function(a){return J.RE(a).gt0(a)}
+J.q0=function(a,b){return J.RE(a).syG(a,b)}
+J.q6=function(a,b,c){return J.U6(a).XU(a,b,c)}
 J.q8=function(a){return J.U6(a).gB(a)}
-J.qA=function(a){return J.w1(a).br(a)}
-J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
-J.qK=function(a,b){return J.RE(a).aJ(a,b)}
-J.qd=function(a,b,c,d){return J.RE(a).aC(a,b,c,d)}
-J.qz=function(a){return J.RE(a).gPw(a)}
+J.qA=function(a,b){return J.RE(a).sqw(a,b)}
+J.ql=function(a){return J.RE(a).gV5(a)}
+J.qq=function(a,b){return J.RE(a).sNG(a,b)}
+J.r0=function(a,b){return J.Wx(a).Sy(a,b)}
 J.r4=function(a){return J.RE(a).pj(a)}
-J.rK=function(a,b){return J.RE(a).szf(a,b)}
-J.rP=function(a,b){return J.RE(a).sTq(a,b)}
+J.rl=function(a){return J.RE(a).gEV(a)}
 J.rr=function(a){return J.rY(a).bS(a)}
-J.t8=function(a,b){return J.RE(a).FL(a,b)}
-J.ta=function(a,b){return J.RE(a).sP(a,b)}
-J.td=function(a){return J.RE(a).gng(a)}
-J.ti=function(a,b){return J.RE(a).sQr(a,b)}
+J.rw=function(a){return J.RE(a).gMl(a)}
+J.t3=function(a,b){return J.RE(a).sa4(a,b)}
+J.t8=function(a){return J.RE(a).gYQ(a)}
+J.tF=function(a){return J.RE(a).gyW(a)}
+J.tQ=function(a,b){return J.RE(a).swv(a,b)}
 J.tx=function(a){return J.RE(a).guD(a)}
-J.u3=function(a){return J.RE(a).geT(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.rY(a).Fr(a,b)}
+J.uM=function(a,b){return J.RE(a).sod(a,b)}
+J.uP=function(a){return J.RE(a).gVE(a)}
+J.uW=function(a){return J.RE(a).gyG(a)}
+J.uX=function(a,b){return J.RE(a).sph(a,b)}
 J.uf=function(a){return J.RE(a).gxr(a)}
-J.uw=function(a){return J.RE(a).gwd(a)}
+J.ul=function(a,b,c){return J.w1(a).UZ(a,b,c)}
+J.un=function(a){return J.RE(a).giJ(a)}
+J.uy=function(a){return J.RE(a).gHm(a)}
 J.v1=function(a){return J.x(a).giO(a)}
-J.vF=function(a){return J.RE(a).gbP(a)}
+J.vH=function(a){return J.RE(a).Kn(a)}
+J.vI=function(a,b,c){return J.RE(a).D9(a,b,c)}
 J.vP=function(a){return J.RE(a).My(a)}
 J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
 return J.Qc(a).U(a,b)}
-J.ve=function(a,b){return J.RE(a).sdG(a,b)}
+J.vi=function(a){return J.RE(a).gNa(a)}
+J.vr=function(a){return J.RE(a).dQ(a)}
+J.w7=function(a,b){return J.RE(a).syW(a,b)}
 J.w8=function(a){return J.RE(a).gkc(a)}
-J.wC=function(a){return J.RE(a).cO(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
-J.wT=function(a,b){return J.w1(a).h(a,b)}
-J.wp=function(a,b,c,d){return J.w1(a).zB(a,b,c,d)}
-J.xH=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
-return J.Wx(a).W(a,b)}
-J.xP=function(a){return J.RE(a).gT8(a)}
+J.wJ=function(a,b){return J.RE(a).slp(a,b)}
+J.wO=function(a){return J.RE(a).gE7(a)}
+J.wd=function(a){return J.RE(a).gqw(a)}
+J.wg=function(a,b){return J.RE(a).snN(a,b)}
+J.wp=function(a){return J.w1(a).zB(a)}
+J.wz=function(a){return J.RE(a).gzx(a)}
+J.x5=function(a,b){return J.U6(a).tg(a,b)}
+J.xC=function(a,b){if(a==null)return b==null
+if(typeof a!="object")return b!=null&&a===b
+return J.x(a).n(a,b)}
+J.xH=function(a,b){return J.RE(a).sE7(a,b)}
 J.xR=function(a){return J.RE(a).ghf(a)}
-J.xq=function(a){return J.RE(a).gUj(a)}
+J.xW=function(a,b){return J.RE(a).sZm(a,b)}
+J.xa=function(a){return J.RE(a).geS(a)}
+J.y2=function(a,b){return J.RE(a).mx(a,b)}
+J.yA=function(a){return J.RE(a).gvu(a)}
+J.yK=function(a){return J.RE(a).gWw(a)}
 J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yn=function(a,b){return J.RE(a).vV(a,b)}
-J.yxg=function(a){return J.RE(a).gGd(a)}
+J.yZ=function(a){return J.RE(a).gGq(a)}
+J.yd=function(a){return J.RE(a).xO(a)}
+J.yi=function(a){return J.RE(a).gbN(a)}
+J.yk=function(a,b){return J.RE(a).sVm(a,b)}
+J.yn=function(a){return J.RE(a).gkZ(a)}
+J.yo=function(a){return J.RE(a).gPW(a)}
+J.yq=function(a){return J.RE(a).gNs(a)}
+J.yx=function(a){return J.U6(a).gor(a)}
+J.yz=function(a){return J.RE(a).gLF(a)}
 J.z2=function(a){return J.RE(a).gG1(a)}
+J.z3=function(a){return J.RE(a).gu6(a)}
 J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
 return J.Wx(a).D(a,b)}
-J.zH=function(a){return J.RE(a).gt5(a)}
-J.zJ=function(a){return J.RE(a).aA(a)}
+J.zD=function(a){return J.RE(a).gKE(a)}
+J.zH=function(a){return J.RE(a).gIs(a)}
+J.zN=function(a){return J.RE(a).gM6(a)}
+J.zY=function(a){return J.RE(a).gdu(a)}
 J.zj=function(a){return J.RE(a).gvH(a)}
-C.Uy=X.hV.prototype
-C.J0=B.pz.prototype
-C.ae=A.iL.prototype
-C.oq=Q.Tg.prototype
-C.ka=Z.Jc.prototype
-C.IK=O.CN.prototype
+J.zv=function(a){return J.RE(a).gaL(a)}
+C.Gx=X.hV.prototype
+C.J0=B.G6.prototype
+C.z5=A.wM.prototype
+C.YZz=Q.eW.prototype
+C.ka=Z.aC.prototype
+C.tA=O.VY.prototype
 C.ux=F.Be.prototype
-C.j8=R.i6.prototype
-C.O0=R.lw.prototype
-C.OD=F.Ir.prototype
-C.Gh=L.rm.prototype
-C.UF=R.Lt.prototype
-C.MC=D.UL.prototype
-C.LT=A.jM.prototype
-C.Xo=U.qW.prototype
-C.h4=N.mk.prototype
-C.pJ=O.pL.prototype
-C.Vc=K.jY.prototype
-C.W3=W.zU.prototype
-C.cp=B.pR.prototype
-C.pU=Z.hx.prototype
-C.wQ=D.YA.prototype
-C.rC=D.Yj.prototype
-C.RR=A.flR.prototype
-C.kS=X.E7.prototype
-C.LN=N.oO.prototype
-C.F2=D.IWF.prototype
-C.kd=D.Oz.prototype
-C.Qt=D.Stq.prototype
-C.Xe=L.qkb.prototype
+C.T0=R.i6.prototype
+C.O0=R.JI.prototype
+C.wI=F.ZP.prototype
+C.Gh=L.nJ.prototype
+C.UF=R.Eg.prototype
+C.MC=D.i7.prototype
+C.by=A.Gk.prototype
+C.Xo=U.DK.prototype
+C.p0=N.BS.prototype
+C.pJ=O.Vb.prototype
+C.Vc=K.Ly.prototype
+C.W3=W.fJ.prototype
+C.Ie=E.mO.prototype
+C.Ig=E.DE.prototype
+C.NK=E.U1.prototype
+C.za=E.L4.prototype
+C.EL=B.pR.prototype
+C.ry=Z.hx.prototype
+C.wQ=D.Mc.prototype
+C.rC=D.Qh.prototype
+C.cF=A.fl.prototype
+C.bb=X.kK.prototype
+C.LN=N.oa.prototype
+C.F2=D.IW.prototype
+C.Ji=D.Oz.prototype
+C.nM=D.St.prototype
+C.Xe=L.qk.prototype
 C.Nm=J.Q.prototype
 C.ON=J.Pp.prototype
-C.jn=J.bU.prototype
-C.jN=J.Jh.prototype
+C.jn=J.L7.prototype
+C.jN=J.we.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
 C.Yt=Z.vj.prototype
-C.ct=A.oM.prototype
+C.ct=A.UK.prototype
 C.Z3=R.LU.prototype
-C.MG=M.KL.prototype
-C.S2=W.H9.prototype
-C.kD=A.F1.prototype
-C.SU=A.aQ.prototype
-C.nn=A.Qa.prototype
+C.MG=M.CX.prototype
+C.yp=H.eEV.prototype
+C.kD=A.md.prototype
+C.SU=A.Bm.prototype
+C.nn=A.Ya.prototype
 C.J7=A.Ww.prototype
-C.t5=W.yk.prototype
-C.k0=V.F1i.prototype
+C.t5=W.BH.prototype
+C.k0=V.F1.prototype
 C.Pf=Z.uL.prototype
-C.ZQ=J.FP.prototype
-C.zb=A.XP.prototype
-C.Iv=A.xc.prototype
-C.Cc=Q.NQ.prototype
-C.HD=T.SM.prototype
-C.c0=A.knI.prototype
-C.cJ=U.fI.prototype
-C.SX=R.zMr.prototype
-C.Vd=D.nk.prototype
-C.ZO=U.ob.prototype
-C.wU=Q.xI.prototype
-C.fA=Q.Uj.prototype
-C.dX=K.xT.prototype
-C.bg=X.uwf.prototype
-C.lx=A.tz.prototype
-C.vB=J.is.prototype
-C.V8=X.I5.prototype
-C.nt=U.en.prototype
-C.ol=W.u9.prototype
+C.Sx=J.iC.prototype
+C.Ki=A.ir.prototype
+C.Cc=Q.qZ.prototype
+C.oA=T.Uy.prototype
+C.Mh=A.kn.prototype
+C.FH=U.fI.prototype
+C.SX=R.zM.prototype
+C.Vd=D.Rk.prototype
+C.th=U.Ti.prototype
+C.HR=Q.xI.prototype
+C.Yo=Q.CY.prototype
+C.dX=K.nm.prototype
+C.wB=X.uw.prototype
+C.lx=A.G1.prototype
+C.vB=J.kdQ.prototype
+C.u2=X.I5.prototype
+C.nt=U.el.prototype
 C.KZ=new H.hJ()
-C.OL=new U.EZ()
-C.Gw=new H.yq()
-C.E3=new J.Q()
-C.Fm=new J.kn()
-C.yX=new J.Pp()
-C.c1=new J.bU()
-C.x0=new J.Jh()
-C.oD=new J.P()
-C.Kn=new J.O()
-C.J19=new K.ndx()
-C.IU=new P.TO()
-C.Us=new A.yL()
-C.Nw=new K.vly()
+C.x4=new U.WH()
+C.Gw=new H.Xc()
+C.Eq=new P.vG()
 C.Wj=new P.JF()
-C.xd=new A.Mh()
-C.OY=new P.mg()
-C.NU=new P.R8()
-C.v8=new P.AHi()
+C.pr=new P.mgb()
+C.dV=new L.iNc()
+C.NU=new P.R81()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
-C.nj=new D.WAE("Native")
+C.Oc=new D.WAE("Native")
 C.yP=new D.WAE("Reused")
-C.oA=new D.WAE("Tag")
-C.F9=new A.V3("action-link")
-C.vr3=new A.V3("service-exception-view")
-C.Ux=new A.V3("isolate-location")
-C.Br=new A.V3("observatory-element")
-C.dA=new A.V3("heap-profile")
-C.I3=new A.V3("script-view")
-C.XG=new A.V3("nav-refresh")
-C.Bd=new A.V3("isolate-counter-chart")
-C.E6=new A.V3("field-ref")
-C.aM=new A.V3("isolate-summary")
-C.Is=new A.V3("response-viewer")
-C.OLi=new A.V3("script-inset")
-C.qT=new A.V3("nav-menu-item")
-C.KI=new A.V3("library-nav-menu")
-C.Tl=new A.V3("service-view")
-C.Cu=new A.V3("heap-map")
-C.nu=new A.V3("function-view")
-C.jR=new A.V3("isolate-profile")
-C.xW=new A.V3("code-view")
-C.aQx=new A.V3("class-view")
-C.NG=new A.V3("isolate-view")
-C.Vn=new A.V3("eval-link")
-C.mS=new A.V3("sliding-checkbox")
-C.Hk=new A.V3("vm-view")
-C.Oyb=new A.V3("library-view")
-C.H3=new A.V3("code-ref")
-C.NT=new A.V3("top-nav-menu")
-C.js=new A.V3("stack-trace")
-C.Ur=new A.V3("script-ref")
-C.tSc=new A.V3("class-ref")
-C.Po=new A.V3("isolate-shared-summary")
-C.jy=new A.V3("breakpoint-list")
-C.VW=new A.V3("instance-ref")
-C.Ye=new A.V3("vm-ref")
-C.Gu=new A.V3("collapsible-content")
-C.Xv=new A.V3("stack-frame")
-C.kR=new A.V3("observatory-application")
-C.uvO=new A.V3("service-error-view")
-C.Qz=new A.V3("eval-box")
-C.zaS=new A.V3("isolate-nav-menu")
-C.qJ=new A.V3("class-nav-menu")
-C.uW=new A.V3("error-view")
-C.u7=new A.V3("nav-menu")
-C.Xuf=new A.V3("isolate-run-state")
-C.KH=new A.V3("json-view")
-C.j6=new A.V3("isolate-ref")
-C.o3=new A.V3("function-ref")
-C.uy=new A.V3("library-ref")
-C.vc=new A.V3("field-view")
-C.JD=new A.V3("service-ref")
-C.nW=new A.V3("nav-bar")
-C.DKS=new A.V3("curly-block")
-C.qlk=new A.V3("instance-view")
+C.Z7=new D.WAE("Tag")
+C.nU=new A.iYn(0)
+C.BM=new A.iYn(1)
+C.it=new A.iYn(2)
+C.YT=new H.GD("expr")
+C.HH=H.IL('dynamic')
+C.NS=new K.vly()
+C.px=new A.yL()
+I.ko=function(a){a.immutable$list=init
+a.fixed$length=init
+return a}
+C.XVh=I.ko([C.NS,C.px])
+C.V0=new A.ES(C.YT,C.BM,!1,C.HH,!1,C.XVh)
+C.rB=new H.GD("isolate")
+C.Ug=H.IL('bv')
+C.ZQ=new A.ES(C.rB,C.BM,!1,C.Ug,!1,C.XVh)
+C.Ms=new H.GD("iconClass")
+C.Db=H.IL('qU')
+C.mI=new K.ndx()
+C.y0=I.ko([C.NS,C.mI])
+C.Gl=new A.ES(C.Ms,C.BM,!1,C.Db,!1,C.y0)
+C.VK=new H.GD("devtools")
+C.BQ=H.IL('a2')
+C.m8=new A.ES(C.VK,C.BM,!1,C.BQ,!1,C.XVh)
+C.EV=new H.GD("library")
+C.Jny=H.IL('U4')
+C.Ei=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.XVh)
+C.zU=new H.GD("uncheckedText")
+C.IK=new A.ES(C.zU,C.BM,!1,C.Db,!1,C.XVh)
+C.UL=new H.GD("profileChanged")
+C.dg=H.IL('EH')
+C.xD=I.ko([])
+C.mM=new A.ES(C.UL,C.it,!1,C.dg,!1,C.xD)
+C.Ql=new H.GD("hasClass")
+C.TJ=new A.ES(C.Ql,C.BM,!1,C.BQ,!1,C.y0)
+C.B0=new H.GD("expand")
+C.Rf=new A.ES(C.B0,C.BM,!1,C.BQ,!1,C.XVh)
+C.kV=new H.GD("link")
+C.Os=new A.ES(C.kV,C.BM,!1,C.Db,!1,C.XVh)
+C.Wm=new H.GD("refChanged")
+C.QW=new A.ES(C.Wm,C.it,!1,C.dg,!1,C.xD)
+C.SA=new H.GD("lines")
+C.At=H.IL('WO')
+C.KI=new A.ES(C.SA,C.BM,!1,C.At,!1,C.y0)
+C.bJ=new H.GD("counters")
+C.jJ=H.IL('qC')
+C.iF=new A.ES(C.bJ,C.BM,!1,C.jJ,!1,C.XVh)
+C.cg=new H.GD("anchor")
+C.pU=new A.ES(C.cg,C.BM,!1,C.Db,!1,C.XVh)
+C.fn=new H.GD("instance")
+C.MR1=H.IL('vO')
+C.cV=new A.ES(C.fn,C.BM,!1,C.MR1,!1,C.XVh)
+C.aH=new H.GD("displayCutoff")
+C.hR=new A.ES(C.aH,C.BM,!1,C.Db,!1,C.y0)
+C.uk=new H.GD("last")
+C.Mq=new A.ES(C.uk,C.BM,!1,C.BQ,!1,C.XVh)
+C.bz=new H.GD("isolateChanged")
+C.Bk=new A.ES(C.bz,C.it,!1,C.dg,!1,C.xD)
+C.CG=new H.GD("posChanged")
+C.Ml=new A.ES(C.CG,C.it,!1,C.dg,!1,C.xD)
+C.QH=new H.GD("fragmentation")
+C.kt=new A.ES(C.QH,C.BM,!1,C.MR1,!1,C.XVh)
+C.td=new H.GD("object")
+C.SmN=H.IL('af')
+C.No=new A.ES(C.td,C.BM,!1,C.SmN,!1,C.XVh)
+C.SR=new H.GD("map")
+C.HL=new A.ES(C.SR,C.BM,!1,C.MR1,!1,C.XVh)
+C.Gs=new H.GD("sampleCount")
+C.iO=new A.ES(C.Gs,C.BM,!1,C.Db,!1,C.y0)
+C.kw=new H.GD("trace")
+C.W9=new A.ES(C.kw,C.BM,!1,C.MR1,!1,C.XVh)
+C.uu=new H.GD("internal")
+C.x3=new A.ES(C.uu,C.BM,!1,C.BQ,!1,C.XVh)
+C.TW=new H.GD("tagSelector")
+C.H0=new A.ES(C.TW,C.BM,!1,C.Db,!1,C.y0)
+C.nf=new H.GD("function")
+C.Up=new A.ES(C.nf,C.BM,!1,C.MR1,!1,C.XVh)
+C.Ys=new H.GD("pad")
+C.hK=new A.ES(C.Ys,C.BM,!1,C.BQ,!1,C.XVh)
+C.He=new H.GD("hideTagsChecked")
+C.oV=new A.ES(C.He,C.BM,!1,C.BQ,!1,C.y0)
+C.zz=new H.GD("timeSpan")
+C.lS=new A.ES(C.zz,C.BM,!1,C.Db,!1,C.y0)
+C.Gr=new H.GD("endPos")
+C.yw=H.IL('KN')
+C.j3=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.XVh)
+C.mr=new H.GD("expanded")
+C.DC=new A.ES(C.mr,C.BM,!1,C.BQ,!1,C.y0)
+C.j2=new H.GD("app")
+C.PS=H.IL('mL')
+C.zJ=new A.ES(C.j2,C.BM,!1,C.PS,!1,C.XVh)
+C.xP=new H.GD("ref")
+C.hI=new A.ES(C.xP,C.BM,!1,C.SmN,!1,C.XVh)
+C.qs=new H.GD("io")
+C.ly=new A.ES(C.qs,C.BM,!1,C.MR1,!1,C.XVh)
+C.qX=new H.GD("fragmentationChanged")
+C.dO=new A.ES(C.qX,C.it,!1,C.dg,!1,C.xD)
+C.i0=new H.GD("coverageChanged")
+C.GH=new A.ES(C.i0,C.it,!1,C.dg,!1,C.xD)
+C.pO=new H.GD("functionChanged")
+C.au=new A.ES(C.pO,C.it,!1,C.dg,!1,C.xD)
+C.rP=new H.GD("mapChanged")
+C.Nt=new A.ES(C.rP,C.it,!1,C.dg,!1,C.xD)
+C.aP=new H.GD("active")
+C.xO=new A.ES(C.aP,C.BM,!1,C.BQ,!1,C.XVh)
+C.WQ=new H.GD("field")
+C.NA=new A.ES(C.WQ,C.BM,!1,C.MR1,!1,C.XVh)
+C.YD=new H.GD("sampleRate")
+C.fP=new A.ES(C.YD,C.BM,!1,C.Db,!1,C.y0)
+C.Aa=new H.GD("results")
+C.Gsc=H.IL('wn')
+C.Uz=new A.ES(C.Aa,C.BM,!1,C.Gsc,!1,C.y0)
+C.t6=new H.GD("mapAsString")
+C.b6=new A.ES(C.t6,C.BM,!1,C.Db,!1,C.y0)
+C.hf=new H.GD("label")
+C.n6=new A.ES(C.hf,C.BM,!1,C.Db,!1,C.XVh)
+C.UY=new H.GD("result")
+C.rT=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.XVh)
+C.PX=new H.GD("script")
+C.qn=H.IL('vx')
+C.Cj=new A.ES(C.PX,C.BM,!1,C.qn,!1,C.XVh)
+C.S4=new H.GD("busy")
+C.FB=new A.ES(C.S4,C.BM,!1,C.BQ,!1,C.y0)
+C.AO=new H.GD("qualifiedName")
+C.UE=new A.ES(C.AO,C.BM,!1,C.Db,!1,C.XVh)
+C.eh=new H.GD("lineMode")
+C.rH=new A.ES(C.eh,C.BM,!1,C.Db,!1,C.y0)
+C.XA=new H.GD("cls")
+C.CO=new A.ES(C.XA,C.BM,!1,C.MR1,!1,C.XVh)
+C.AV=new H.GD("callback")
+C.h1=new A.ES(C.AV,C.BM,!1,C.HH,!1,C.XVh)
+C.PM=new H.GD("status")
+C.jv=new A.ES(C.PM,C.BM,!1,C.Db,!1,C.y0)
+C.kz=new H.GD("showCoverageChanged")
+C.db=new A.ES(C.kz,C.it,!1,C.dg,!1,C.xD)
+C.ox=new H.GD("countersChanged")
+C.Rh=new A.ES(C.ox,C.it,!1,C.dg,!1,C.xD)
+C.bk=new H.GD("checked")
+C.Nu=new A.ES(C.bk,C.BM,!1,C.BQ,!1,C.XVh)
+C.bE=new H.GD("sampleDepth")
+C.h3=new A.ES(C.bE,C.BM,!1,C.Db,!1,C.y0)
+C.tW=new H.GD("pos")
+C.HM=new A.ES(C.tW,C.BM,!1,C.yw,!1,C.XVh)
+C.RJ=new H.GD("vm")
+C.n8S=H.IL('wv')
+C.Ce=new A.ES(C.RJ,C.BM,!1,C.n8S,!1,C.XVh)
+C.WZ=new H.GD("coverage")
+C.Um=new A.ES(C.WZ,C.BM,!1,C.BQ,!1,C.XVh)
+C.wu=H.IL('Sa')
+C.ti=new A.ES(C.AV,C.BM,!1,C.wu,!1,C.XVh)
+C.N8=new H.GD("scriptChanged")
+C.qE=new A.ES(C.N8,C.it,!1,C.dg,!1,C.xD)
+C.UX=new H.GD("msg")
+C.X4=new A.ES(C.UX,C.BM,!1,C.MR1,!1,C.XVh)
+C.rE=new H.GD("frame")
+C.Kv=new A.ES(C.rE,C.BM,!1,C.jJ,!1,C.XVh)
+C.ak=new H.GD("hasParent")
+C.yI=new A.ES(C.ak,C.BM,!1,C.BQ,!1,C.y0)
+C.xS=new H.GD("tagSelectorChanged")
+C.bw=new A.ES(C.xS,C.it,!1,C.dg,!1,C.xD)
+C.kG=new H.GD("classTable")
+C.jt=H.IL('Vz')
+C.dh=new A.ES(C.kG,C.BM,!1,C.jt,!1,C.y0)
+C.Dj=new H.GD("refreshTime")
+C.Ay=new A.ES(C.Dj,C.BM,!1,C.Db,!1,C.y0)
+C.i4=new H.GD("code")
+C.nq=H.IL('kx')
+C.h9=new A.ES(C.i4,C.BM,!1,C.nq,!1,C.XVh)
+C.oj=new H.GD("httpServer")
+C.dF=new A.ES(C.oj,C.BM,!1,C.MR1,!1,C.XVh)
+C.vb=new H.GD("profile")
+C.eq=new A.ES(C.vb,C.BM,!1,C.MR1,!1,C.XVh)
+C.a0=new H.GD("isDart")
+C.P9=new A.ES(C.a0,C.BM,!1,C.BQ,!1,C.y0)
+C.Gn=new H.GD("objectChanged")
+C.az=new A.ES(C.Gn,C.it,!1,C.dg,!1,C.xD)
+C.ne=new H.GD("exception")
+C.SNu=H.IL('EP')
+C.l6=new A.ES(C.ne,C.BM,!1,C.SNu,!1,C.XVh)
+C.QK=new H.GD("qualified")
+C.VQ=new A.ES(C.QK,C.BM,!1,C.BQ,!1,C.XVh)
+C.yh=new H.GD("error")
+C.k5t=H.IL('ft')
+C.yc=new A.ES(C.yh,C.BM,!1,C.k5t,!1,C.XVh)
+C.oUD=H.IL('N7')
+C.xQ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.XVh)
+C.r1=new H.GD("expandChanged")
+C.nP=new A.ES(C.r1,C.it,!1,C.dg,!1,C.xD)
+C.XY=new H.GD("showCoverage")
+C.ec=new A.ES(C.XY,C.BM,!1,C.BQ,!1,C.XVh)
+C.Lc=new H.GD("kind")
+C.Tt=new A.ES(C.Lc,C.BM,!1,C.Db,!1,C.XVh)
+C.ng=I.ko([C.mI])
+C.Qs=new A.ES(C.i4,C.BM,!0,C.nq,!1,C.ng)
+C.lH=new H.GD("checkedText")
+C.A5=new A.ES(C.lH,C.BM,!1,C.Db,!1,C.XVh)
+C.GE=new A.ES(C.yh,C.BM,!1,C.SmN,!1,C.XVh)
+C.XM=new H.GD("path")
+C.hL=new A.ES(C.XM,C.BM,!1,C.MR1,!1,C.XVh)
+C.mi=new H.GD("text")
+C.yV=new A.ES(C.mi,C.BM,!1,C.Db,!1,C.y0)
+C.vp=new H.GD("list")
+C.K9=new A.ES(C.vp,C.BM,!1,C.MR1,!1,C.XVh)
+C.PI=new H.GD("displayValue")
+C.lg=new A.ES(C.PI,C.BM,!1,C.Db,!1,C.y0)
 C.ny=new P.a6(0)
-C.mt=H.VM(new W.UC("change"),[W.ea])
-C.pi=H.VM(new W.UC("click"),[W.Wp])
-C.MD=H.VM(new W.UC("error"),[W.ew])
-C.PP=H.VM(new W.UC("hashchange"),[W.ea])
-C.i3=H.VM(new W.UC("input"),[W.ea])
-C.fK=H.VM(new W.UC("load"),[W.ew])
-C.Ns=H.VM(new W.UC("message"),[W.cx])
-C.DK=H.VM(new W.UC("mousedown"),[W.Wp])
-C.W2=H.VM(new W.UC("mousemove"),[W.Wp])
-C.Mc=function(hooks) {
+C.U3=H.VM(new W.pq("change"),[W.ea])
+C.pi=H.VM(new W.pq("click"),[W.Oq])
+C.MD=H.VM(new W.pq("error"),[W.kQ])
+C.Bn=H.VM(new W.pq("hashchange"),[W.ea])
+C.i3=H.VM(new W.pq("input"),[W.ea])
+C.LF=H.VM(new W.pq("load"),[W.kQ])
+C.ph=H.VM(new W.pq("message"),[W.AW])
+C.uh=H.VM(new W.pq("mousedown"),[W.Oq])
+C.Kq=H.VM(new W.pq("mousemove"),[W.Oq])
+C.JS=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
 }
@@ -17427,23 +17036,23 @@
   }
   hooks.getTag = getTagFirefox;
 }
-C.XQ=function(hooks) { return hooks; }
-
-C.AS=function getTagFallback(o) {
+C.w2=function getTagFallback(o) {
   var constructor = o.constructor;
   if (typeof constructor == "function") {
     var name = constructor.name;
-    if (typeof name == "string"
-        && name !== ""
-        && name !== "Object"
-        && name !== "Function.prototype") {
+    if (typeof name == "string" &&
+        name.length > 2 &&
+        name !== "Object" &&
+        name !== "Function.prototype") {
       return name;
     }
   }
   var s = Object.prototype.toString.call(o);
   return s.substring(8, s.length - 1);
 }
-C.ur=function(getTagFallback) {
+C.XQ=function(hooks) { return hooks; }
+
+C.ku=function(getTagFallback) {
   return function(hooks) {
     if (typeof navigator != "object") return hooks;
     var ua = navigator.userAgent;
@@ -17519,7 +17128,7 @@
   hooks.getTag = getTagIE;
   hooks.prototypeForTag = prototypeForTagIE;
 }
-C.hQ=function(hooks) {
+C.NH=function(hooks) {
   var getTag = hooks.getTag;
   var prototypeForTag = hooks.prototypeForTag;
   function getTagFixed(o) {
@@ -17537,393 +17146,365 @@
   hooks.getTag = getTagFixed;
   hooks.prototypeForTag = prototypeForTagFixed;
 }
-C.xr=new P.by(null,null)
+C.zc=new P.D4(null,null)
 C.A3=new P.Cf(null)
-C.cb=new P.ze(null,null)
-C.Ek=new N.qV("FINER",400)
-C.R5=new N.qV("FINE",500)
+C.Sr=new P.ze(null,null)
+C.Ab=new N.qV("FINER",400)
+C.eI=new N.qV("FINE",500)
 C.IF=new N.qV("INFO",800)
-C.cV=new N.qV("SEVERE",1000)
+C.Xm=new N.qV("SEVERE",1000)
 C.nT=new N.qV("WARNING",900)
-I.makeConstantList = function(list) {
-  list.immutable$list = init;
-  list.fixed$length = init;
-  return list;
-};
-C.HE=I.makeConstantList([0,0,26624,1023,0,0,65534,2047])
-C.mK=I.makeConstantList([0,0,26624,1023,65534,2047,65534,2047])
-C.yD=I.makeConstantList([0,0,26498,1023,65534,34815,65534,18431])
-C.xu=I.makeConstantList([43,45,42,47,33,38,60,61,62,63,94,124])
-C.u0=I.makeConstantList(["==","!=","<=",">=","||","&&"])
-C.Me=H.VM(I.makeConstantList([]),[P.Ms])
-C.dn=H.VM(I.makeConstantList([]),[P.tg])
-C.hU=H.VM(I.makeConstantList([]),[P.X9])
-C.iH=H.VM(I.makeConstantList([]),[J.bU])
-C.xD=I.makeConstantList([])
-C.Qy=I.makeConstantList(["in","this"])
-C.Ym=I.makeConstantList(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
-C.kg=I.makeConstantList([0,0,24576,1023,65534,34815,65534,18431])
-C.aa=I.makeConstantList([0,0,32754,11263,65534,34815,65534,18431])
-C.Wd=I.makeConstantList([0,0,32722,12287,65535,34815,65534,18431])
-C.iq=I.makeConstantList([40,41,91,93,123,125])
-C.jH=I.makeConstantList(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.jH)
-C.uS=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
-C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
-C.a5k=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.a5k)
-C.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
-C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
-C.CM=new H.LPe(0,{},C.xD)
-C.MEG=I.makeConstantList(["enumerate"])
-C.eu=new H.LPe(1,{enumerate:K.UM()},C.MEG)
-C.PU=new H.GD("dart.core.Object")
-C.N4=new H.GD("dart.core.DateTime")
-C.Kc=new H.GD("dart.core.bool")
-C.fz=new H.GD("[]")
-C.aP=new H.GD("active")
-C.Es=new H.GD("anchor")
-C.wh=new H.GD("app")
-C.US=new H.GD("architecture")
-C.Zg=new H.GD("args")
-C.ly=new H.GD("assertsEnabled")
-C.S4=new H.GD("busy")
-C.Ka=new H.GD("call")
-C.AV=new H.GD("callback")
-C.wb=new H.GD("checked")
-C.lH=new H.GD("checkedText")
-C.M5=new H.GD("classTable")
-C.XA=new H.GD("cls")
-C.b1=new H.GD("code")
-C.MR=new H.GD("counters")
-C.Xs=new H.GD("coverage")
-C.h1=new H.GD("currentHash")
-C.of=new H.GD("devtools")
-C.aH=new H.GD("displayCutoff")
-C.Jw=new H.GD("displayValue")
-C.nN=new H.GD("dynamic")
-C.Gr=new H.GD("endPos")
-C.tP=new H.GD("entry")
-C.YU=new H.GD("error")
-C.ne=new H.GD("exception")
-C.dI=new H.GD("expand")
-C.mr=new H.GD("expanded")
-C.Of=new H.GD("expander")
-C.Jt=new H.GD("expanderStyle")
-C.Yy=new H.GD("expr")
-C.IV=new H.GD("field")
-C.CX=new H.GD("fileAndLine")
-C.Gd=new H.GD("firstTokenPos")
-C.Aq=new H.GD("formattedAverage")
-C.WG=new H.GD("formattedCollections")
-C.uU=new H.GD("formattedExclusiveTicks")
-C.eF=new H.GD("formattedInclusiveTicks")
-C.Zt=new H.GD("formattedLine")
-C.ST=new H.GD("formattedTotalCollectionTime")
-C.QH=new H.GD("fragmentation")
-C.rE=new H.GD("frame")
-C.nf=new H.GD("function")
-C.JB=new H.GD("getColumnLabel")
-C.mP=new H.GD("hasClass")
-C.zS=new H.GD("hasDisassembly")
-C.D2=new H.GD("hasParent")
-C.Ia=new H.GD("hashLinkWorkaround")
-C.lb=new H.GD("hideTagsChecked")
-C.wq=new H.GD("hitStyle")
-C.bA=new H.GD("hoverText")
-C.AZ=new H.GD("dart.core.String")
-C.Di=new H.GD("iconClass")
-C.q2=new H.GD("idle")
-C.fn=new H.GD("instance")
-C.zD=new H.GD("internal")
-C.P9=new H.GD("isDart")
+C.Yy=new H.GD("keys")
+C.Yn=new H.GD("values")
+C.Wn=new H.GD("length")
 C.ai=new H.GD("isEmpty")
 C.nZ=new H.GD("isNotEmpty")
-C.FQ=new H.GD("isOptimized")
-C.Z8=new H.GD("isolate")
-C.Qn=new H.GD("jumpTarget")
-C.fy=new H.GD("kind")
-C.y2=new H.GD("label")
-C.QL=new H.GD("last")
+C.Zw=I.ko([C.Yy,C.Yn,C.Wn,C.ai,C.nZ])
+C.yD=I.ko([0,0,26498,1023,65534,34815,65534,18431])
+C.G8=I.ko(["==","!=","<=",">=","||","&&"])
+C.Cd=I.ko(["in","this"])
+C.QC=I.ko(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
+C.bg=I.ko([43,45,42,47,33,38,37,60,61,62,63,94,124])
+C.iq=I.ko([40,41,91,93,123,125])
+C.zao=I.ko(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
+C.uE=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.p5=I.ko(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
+C.Mk=new H.Px(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
+C.paX=I.ko(["name","extends","constructor","noscript","attributes"])
+C.kr=new H.Px(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
+C.CM=new H.Px(0,{},C.xD)
+C.MB=I.ko(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
+C.SP=new H.Px(17,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",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.MB)
+C.d6=I.ko(["enumerate"])
+C.eu=new H.Px(1,{enumerate:K.yU()},C.d6)
+C.tq=H.IL('Bo')
+C.pg=H.IL('wA')
+C.wE=I.ko([C.pg])
+C.Xk=new A.Wq(!1,!1,!0,C.tq,!1,!0,C.wE,null)
+C.wVi=H.IL('yL')
+C.bt=I.ko([C.wVi])
+C.YV=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.bt,null)
+C.IH=new H.GD("address")
+C.US=new H.GD("architecture")
+C.Zg=new H.GD("args")
+C.ET=new H.GD("assertsEnabled")
+C.WC=new H.GD("bpt")
+C.Ro=new H.GD("buttonClick")
+C.Ka=new H.GD("call")
+C.C0=new H.GD("change")
+C.eZ=new H.GD("changeSort")
+C.OI=new H.GD("classes")
+C.qt=new H.GD("coloring")
+C.p1=new H.GD("columns")
+C.M8=new H.GD("currentHash")
+C.iE=new H.GD("descriptor")
+C.f4=new H.GD("descriptors")
+C.aK=new H.GD("doAction")
+C.GP=new H.GD("element")
+C.tP=new H.GD("entry")
+C.Zb=new H.GD("eval")
+C.u7=new H.GD("evalNow")
+C.Ek=new H.GD("expander")
+C.Pn=new H.GD("expanderStyle")
+C.Gd=new H.GD("firstTokenPos")
+C.FP=new H.GD("formatSize")
+C.kF=new H.GD("formatTime")
+C.UD=new H.GD("formattedAddress")
+C.Aq=new H.GD("formattedAverage")
+C.DS=new H.GD("formattedCollections")
+C.C9=new H.GD("formattedDeoptId")
+C.VF=new H.GD("formattedExclusive")
+C.uU=new H.GD("formattedExclusiveTicks")
+C.YJ=new H.GD("formattedInclusive")
+C.eF=new H.GD("formattedInclusiveTicks")
+C.oI=new H.GD("formattedLine")
+C.ST=new H.GD("formattedTotalCollectionTime")
+C.EI=new H.GD("functions")
+C.JB=new H.GD("getColumnLabel")
+C.Uq=new H.GD("getFormattedValue")
+C.A8=new H.GD("getValue")
+C.SI=new H.GD("hasDescriptors")
+C.zS=new H.GD("hasDisassembly")
+C.eo=new H.GD("hashLink")
+C.Ge=new H.GD("hashLinkWorkaround")
+C.wq=new H.GD("hitStyle")
+C.k6=new H.GD("hoverText")
+C.PJ=new H.GD("human")
+C.q2=new H.GD("idle")
+C.d2=new H.GD("imp")
+C.kN=new H.GD("imports")
+C.eJ=new H.GD("instruction")
+C.iG=new H.GD("instructions")
+C.Py=new H.GD("interface")
+C.h7=new H.GD("ioEnabled")
+C.I9=new H.GD("isBool")
+C.C1=new H.GD("isComment")
+C.Yg=new H.GD("isDartCode")
+C.bR=new H.GD("isDouble")
+C.ob=new H.GD("isError")
+C.Iv=new H.GD("isInstance")
+C.Wg=new H.GD("isInt")
+C.tD=new H.GD("isList")
+C.Of=new H.GD("isNull")
+C.pY=new H.GD("isOptimized")
+C.Lk=new H.GD("isString")
+C.dK=new H.GD("isType")
+C.xf=new H.GD("isUnexpected")
+C.Jx=new H.GD("isolates")
+C.b5=new H.GD("jumpTarget")
 C.kA=new H.GD("lastTokenPos")
-C.Wn=new H.GD("length")
-C.Ij=new H.GD("libraries")
-C.EV=new H.GD("library")
-C.eh=new H.GD("lineMode")
-C.Cv=new H.GD("lines")
-C.dB=new H.GD("link")
-C.jA=new H.GD("loading")
-C.dH=new H.GD("mainPort")
-C.p3=new H.GD("map")
-C.t6=new H.GD("mapAsString")
-C.PC=new H.GD("dart.core.int")
-C.ch=new H.GD("message")
-C.UX=new H.GD("msg")
+C.ur=new H.GD("lib")
+C.VN=new H.GD("libraries")
+C.VI=new H.GD("line")
+C.DY=new H.GD("loading")
+C.wT=new H.GD("mainPort")
+C.pX=new H.GD("message")
+C.VD=new H.GD("mouseOut")
+C.NN=new H.GD("mouseOver")
 C.YS=new H.GD("name")
-C.KG=new H.GD("nameIsEmpty")
+C.pu=new H.GD("nameIsEmpty")
 C.So=new H.GD("newHeapCapacity")
-C.IO=new H.GD("newHeapUsed")
+C.EK=new H.GD("newHeapUsed")
 C.OV=new H.GD("noSuchMethod")
-C.VJ=new H.GD("object")
-C.xG=new H.GD("objectPool")
-C.Le=new H.GD("oldHeapCapacity")
-C.SW=new H.GD("oldHeapUsed")
-C.ZU=new H.GD("pad")
+C.zO=new H.GD("objectPool")
+C.eH=new H.GD("oldHeapCapacity")
+C.ap=new H.GD("oldHeapUsed")
+C.zm=new H.GD("padding")
+C.Ic=new H.GD("pause")
 C.yG=new H.GD("pauseEvent")
-C.Kl=new H.GD("pos")
-C.vb=new H.GD("profile")
-C.zc=new H.GD("qualified")
-C.AO=new H.GD("qualifiedName")
-C.kY=new H.GD("ref")
-C.Dj=new H.GD("refreshTime")
-C.c8=new H.GD("registerCallback")
-C.mE=new H.GD("response")
-C.UY=new H.GD("result")
-C.Aa=new H.GD("results")
-C.xe=new H.GD("rootLib")
-C.X8=new H.GD("running")
-C.ok=new H.GD("dart.core.Null")
-C.md=new H.GD("dart.core.double")
-C.XU=new H.GD("sampleCount")
-C.bE=new H.GD("sampleDepth")
-C.mI=new H.GD("sampleRate")
-C.fX=new H.GD("script")
-C.eC=new H.GD("[]=")
-C.V0=new H.GD("showCoverage")
-C.AH=new H.GD("sortedRows")
+C.GR=new H.GD("refresh")
+C.KX=new H.GD("refreshCoverage")
+C.ja=new H.GD("refreshGC")
+C.MT=new H.GD("registerCallback")
+C.Gi=new H.GD("relativeHashLink")
+C.X2=new H.GD("resetAccumulator")
+C.F3=new H.GD("response")
+C.nY=new H.GD("resume")
+C.HD=new H.GD("retainedSize")
+C.iU=new H.GD("retainingPath")
+C.eN=new H.GD("rootLib")
+C.ue=new H.GD("row")
+C.nh=new H.GD("rows")
+C.L2=new H.GD("running")
+C.EA=new H.GD("scripts")
+C.oW=new H.GD("selectExpr")
+C.hd=new H.GD("serviceType")
+C.DW=new H.GD("sortedRows")
 C.R3=new H.GD("stacktrace")
-C.PM=new H.GD("status")
-C.TW=new H.GD("tagSelector")
-C.mi=new H.GD("text")
-C.zz=new H.GD("timeSpan")
-C.EB=new H.GD("topFrame")
-C.QK=new H.GD("totalSamplesInProfile")
-C.kw=new H.GD("trace")
+C.Nv=new H.GD("subclass")
+C.hO=new H.GD("tipExclusive")
+C.ei=new H.GD("tipKind")
+C.HK=new H.GD("tipParent")
+C.je=new H.GD("tipTicks")
+C.hN=new H.GD("tipTime")
+C.Q1=new H.GD("toggleExpand")
+C.ID=new H.GD("toggleExpanded")
+C.z6=new H.GD("tokenPos")
+C.bc=new H.GD("topFrame")
+C.Kj=new H.GD("totalSamplesInProfile")
 C.ep=new H.GD("tree")
 C.J2=new H.GD("typeChecksEnabled")
-C.WY=new H.GD("uncheckedText")
+C.bn=new H.GD("updateLineMode")
 C.mh=new H.GD("uptime")
 C.Fh=new H.GD("url")
-C.ls=new H.GD("value")
+C.jh=new H.GD("v")
+C.YI=new H.GD("value")
+C.xw=new H.GD("variables")
 C.zn=new H.GD("version")
-C.RJ=new H.GD("vm")
-C.KS=new H.GD("vmName")
-C.v6=new H.GD("void")
-C.n8=H.uV('qC')
-C.WP=new H.QT(C.n8,"K",0)
-C.SL=H.uV('Ae')
-C.xC=new H.QT(C.SL,"V",0)
-C.QJ=H.uV('xh')
-C.wW=new H.QT(C.QJ,"T",0)
-C.Gsc=H.uV('wn')
-C.io=new H.QT(C.Gsc,"E",0)
-C.nz=new H.QT(C.n8,"V",0)
-C.k5t=H.uV('hx')
-C.KSy=H.uV('Yj')
-C.q0S=H.uV('Dg')
-C.z6Y=H.uV('Tg')
-C.xFi=H.uV('rm')
-C.eY=H.uV('n6')
-C.J9=H.uV('zMr')
-C.Vh=H.uV('Pz')
-C.hgE=H.uV('flR')
-C.zq=H.uV('Qa')
-C.qfw=H.uV('qW')
-C.z7=H.uV('YA')
-C.GTO=H.uV('F1')
-C.nY=H.uV('a')
-C.Yc=H.uV('iP')
-C.jRs=H.uV('Be')
-C.Ow=H.uV('oO')
-C.PT=H.uV('I2')
-C.p8F=H.uV('NQ')
-C.xLI=H.uV('pz')
-C.xz=H.uV('Stq')
-C.T1=H.uV('Wy')
-C.aj=H.uV('fI')
-C.Kh=H.uV('I5')
-C.lg=H.uV('hV')
-C.la=H.uV('ZX')
-C.G4=H.uV('CN')
-C.O4=H.uV('double')
-C.yw=H.uV('int')
-C.b7=H.uV('uwf')
-C.RcY=H.uV('aQ')
-C.KJ=H.uV('mk')
-C.ST4=H.uV('en')
-C.X6M=H.uV('jM')
-C.yiu=H.uV('knI')
-C.dUi=H.uV('Uj')
-C.U9=H.uV('UL')
-C.iG=H.uV('yc')
-C.HI=H.uV('Pg')
-C.ab=H.uV('xI')
-C.lk=H.uV('mJ')
-C.lpG=H.uV('LU')
-C.EG=H.uV('Oz')
-C.Ch=H.uV('KL')
-C.kbo=H.uV('SM')
-C.jV=H.uV('rF')
-C.OdR=H.uV('pL')
-C.cj=H.uV('E7')
-C.UNa=H.uV('F1i')
-C.wE=H.uV('vj')
-C.JW=H.uV('Ww')
-C.qo=H.uV('jY')
-C.l49=H.uV('uL')
-C.yQ=H.uV('EH')
-C.Im=H.uV('X6')
-C.FU=H.uV('lw')
-C.p5=H.uV('oM')
-C.nG=H.uV('zt')
-C.px=H.uV('tz')
-C.epC=H.uV('Jc')
-C.eB=H.uV('IWF')
-C.JA3=H.uV('b0B')
-C.PF=H.uV('nk')
-C.Db=H.uV('String')
-C.Tu=H.uV('xc')
-C.jwA=H.uV('qkb')
-C.bh=H.uV('i6')
-C.Bm=H.uV('XP')
-C.hg=H.uV('hd')
-C.Fv=H.uV('ob')
-C.Wza=H.uV('pR')
-C.leN=H.uV('Lt')
-C.HL=H.uV('bool')
-C.Qf=H.uV('Null')
-C.HH=H.uV('dynamic')
-C.vVv=H.uV('iL')
-C.Gp=H.uV('cw')
-C.ri=H.uV('yy')
-C.X0=H.uV('Ir')
-C.CS=H.uV('vm')
-C.hN=H.uV('oI')
-C.R4R=H.uV('xT')
-C.xM=new P.z0(!1)
-C.hi=H.VM(new W.bO(W.pq()),[W.OJ])
+C.Tc=new H.GD("vmName")
+C.k5=H.IL('hx')
+C.Mf=H.IL('G1')
+C.cI=H.IL('Dg')
+C.Dl=H.IL('F1')
+C.UJ=H.IL('oa')
+C.E0=H.IL('aI')
+C.Y3=H.IL('CY')
+C.kq=H.IL('Nn')
+C.j4=H.IL('IW')
+C.Vh=H.IL('qZ')
+C.dH=H.IL('Pz')
+C.HC=H.IL('F0')
+C.yS=H.IL('G6')
+C.Sb=H.IL('kn')
+C.FQ=H.IL('a')
+C.Yc=H.IL('iP')
+C.vw=H.IL('UK')
+C.Jo=H.IL('i7')
+C.jR=H.IL('Be')
+C.al=H.IL('es')
+C.PT=H.IL('CX')
+C.iD=H.IL('Vb')
+C.Zt=H.IL('Uy')
+C.ce=H.IL('kK')
+C.FA=H.IL('Ya')
+C.nI=H.IL('Wy')
+C.hG=H.IL('ir')
+C.Th=H.IL('fI')
+C.tU=H.IL('L4')
+C.yT=H.IL('FK')
+C.cK=H.IL('I5')
+C.jA=H.IL('Eg')
+C.K4=H.IL('hV')
+C.Mt=H.IL('hu')
+C.la=H.IL('ZX')
+C.AY=H.IL('CP')
+C.xE=H.IL('aC')
+C.vu=H.IL('uw')
+C.Yxm=H.IL('Pg')
+C.il=H.IL('xI')
+C.G0=H.IL('mJ')
+C.lp=H.IL('LU')
+C.I7=H.IL('vF')
+C.TU=H.IL('Oz')
+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.JW=H.IL('Ww')
+C.CT=H.IL('St')
+C.wH=H.IL('zM')
+C.l4=H.IL('uL')
+C.Wh=H.IL('U1')
+C.Zj=H.IL('md')
+C.Im=H.IL('X6')
+C.YZ=H.IL('zt')
+C.NR=H.IL('nm')
+C.qF=H.IL('mO')
+C.Ey=H.IL('wM')
+C.nX=H.IL('DE')
+C.bh=H.IL('i6')
+C.KO=H.IL('ZP')
+C.BV=H.IL('Mc')
+C.Wz=H.IL('pR')
+C.Io=H.IL('Qh')
+C.wk=H.IL('nJ')
+C.te=H.IL('BS')
+C.ms=H.IL('Bm')
+C.qJ=H.IL('pG')
+C.pK=H.IL('Rk')
+C.lE=H.IL('DK')
+C.ri=H.IL('yy')
+C.CS=H.IL('vm')
+C.Az=H.IL('Gk')
+C.GX=H.IL('c8')
+C.X8=H.IL('Ti')
+C.Lg=H.IL('JI')
+C.Ju=H.IL('Ly')
+C.mq=H.IL('qk')
+C.XW=H.IL('uEY')
+C.oT=H.IL('VY')
+C.jK=H.IL('el')
+C.xM=new P.Fd(!1)
 $.libraries_to_load = {}
-$.te="$cachedFunction"
+$.z7="$cachedFunction"
 $.eb="$cachedInvocation"
 $.OK=0
 $.bf=null
-$.P4=null
-$.Jl=!1
+$.U9=null
+$.UA=!1
 $.NF=null
 $.TX=null
 $.x7=null
 $.nw=null
 $.vv=null
 $.Bv=null
-$.NR=null
-$.oK=null
-$.tY=null
+$.BY=null
+$.oKB=null
 $.S6=null
 $.k8=null
 $.X3=C.NU
 $.Ss=0
-$.L4=null
-$.PN=null
+$.Qz=null
+$.R6=null
 $.RL=!1
 $.Y4=C.IF
-$.xO=0
-$.el=0
-$.tW=null
-$.Td=!1
+$.Y1=0
+$.ax=0
+$.Oo=null
+$.AM=!1
+$.ps=0
+$.xG=null
 $.Bh=0
-$.uP=!0
-$.VZ="objects/"
-$.To=null
-$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","Ft","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","P9","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xe","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","ak","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE1","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gHu","gI","gID","gIF","gIK","gIO","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gKW","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gMz","gN","gNF","gNG","gNT","gNW","gNl","gNo","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gR","gRA","gRH","gRY","gRn","gRu","gRw","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gYr","gZf","ga1","ga3","ga4","gai","gbP","gbY","gbx","gcC","gdB","gdG","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","gfi","ghU","ghX","ghf","ghi","gho","ghw","gi9","giC","giF","giO","giX","gib","gig","gik","git","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goM","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqW","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","gu6","guD","guT","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxU","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","nY","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pp","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rL","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDD","sDe","sE1","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sHu","sID","sIF","sIK","sIO","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sKW","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sMz","sN","sNF","sNG","sNT","sNW","sNl","sNo","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sYr","sa1","sa3","sa4","sai","sbP","sbY","scC","sdB","sdG","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","sfi","shU","shX","shf","shi","sho","shw","siC","siF","siX","sib","sig","sik","sit","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soM","soY","soc","sox","soy","sp8","spD","sph","sqO","sqW","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","su6","suD","suT","suw","svH","svJ","svt","swd","sx","sxU","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vD","vQ","vV","w","wB","wE","wL","wY","wg","x3","xJ","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
-$.Au=[C.k5t,Z.hx,{created:Z.Co},C.KSy,D.Yj,{created:D.b2},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.J9,R.zMr,{created:R.hp},C.hgE,A.flR,{created:A.Du},C.zq,A.Qa,{created:A.JR},C.qfw,U.qW,{created:U.Wz},C.z7,D.YA,{created:D.BP},C.GTO,A.F1,{created:A.aD},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.p8F,Q.NQ,{created:Q.Zo},C.xLI,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.lg,X.hV,{created:X.zy},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.EG,D.Oz,{created:D.RP},C.Ch,M.KL,{created:M.Ro},C.kbo,T.SM,{created:T.T5},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.UNa,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.p5,A.oM,{created:A.PQ},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.eB,D.IWF,{created:D.dm},C.JA3,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.Tu,A.xc,{created:A.G7},C.jwA,L.qkb,{created:L.uD},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.lv},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
+$.ok=!1
+$.RQ="objects/"
+$.vU=null
+$.Au=[C.tq,W.Bo,{},C.k5,Z.hx,{created:Z.BN},C.Mf,A.G1,{created:A.J8},C.cI,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.Lu},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Al},C.j4,D.IW,{created:D.dm},C.Vh,Q.qZ,{created:Q.RH},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.D2},C.vw,A.UK,{created:A.JT},C.Jo,D.i7,{created:D.dq},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.Zt,T.Uy,{created:T.T5},C.ce,X.kK,{created:X.os},C.FA,A.Ya,{created:A.JR},C.hG,A.ir,{created:A.oaJ},C.Th,U.fI,{created:U.dI},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.vC},C.jA,R.Eg,{created:R.fL},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.zg},C.vu,X.uw,{created:X.bV},C.Yxm,H.Pg,{"":H.KY},C.il,Q.xI,{created:Q.lK},C.lp,R.LU,{created:R.rA},C.I7,H.vF,{"":H.m6},C.TU,D.Oz,{created:D.RP},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.M7},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.cE},C.l4,Z.uL,{created:Z.EE},C.Wh,E.U1,{created:E.hm},C.Zj,A.md,{created:A.aD},C.NR,K.nm,{created:K.an},C.qF,E.mO,{created:E.G7},C.Ey,A.wM,{created:A.GO},C.nX,E.DE,{created:E.oB},C.bh,R.i6,{created:R.IT},C.KO,F.ZP,{created:F.Sj},C.BV,D.Mc,{created:D.BP},C.Wz,B.pR,{created:B.lu},C.Io,D.Qh,{created:D.Qj},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJ},C.pK,D.Rk,{created:D.ma},C.lE,U.DK,{created:U.E5},C.ri,W.yy,{},C.Az,A.Gk,{created:A.Sy},C.X8,U.Ti,{created:U.lv},C.Lg,R.JI,{created:R.p7},C.Ju,K.Ly,{created:K.le},C.mq,L.qk,{created:L.KM},C.XW,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","cO","C5",function(){return $.jk().window})
-I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
+I.$lazy($,"globalWindow","UW","My",function(){return $.jk().window})
+I.$lazy($,"globalWorker","uj","nB",function(){return $.jk().Worker})
 I.$lazy($,"globalPostMessageDefined","Da","JU",function(){return $.jk().postMessage!==void 0})
-I.$lazy($,"thisScript","Kb","Ak",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[J.bU])})
-I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.LX(H.S7({toString:function(){return"$receiver$"}}))})
-I.$lazy($,"notClosurePattern","k1","OI",function(){return H.LX(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
-I.$lazy($,"nullCallPattern","Re","PH",function(){return H.LX(H.S7(null))})
-I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.LX(function(){var $argumentsExpr$='$arguments$'
+I.$lazy($,"thisScript","Kb","Rs",function(){return H.yl()})
+I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[P.KN])})
+I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
+I.$lazy($,"notClosurePattern","k1","KL",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
+I.$lazy($,"nullCallPattern","Re","PH",function(){return H.cM(H.S7(null))})
+I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
 try{null.$method$($argumentsExpr$)}catch(z){return z.message}}())})
-I.$lazy($,"undefinedCallPattern","qi","rx",function(){return H.LX(H.S7(void 0))})
-I.$lazy($,"undefinedLiteralCallPattern","rZ","Kr",function(){return H.LX(function(){var $argumentsExpr$='$arguments$'
+I.$lazy($,"undefinedCallPattern","qi","rx",function(){return H.cM(H.S7(void 0))})
+I.$lazy($,"undefinedLiteralCallPattern","rZ","Kr",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
 try{(void 0).$method$($argumentsExpr$)}catch(z){return z.message}}())})
-I.$lazy($,"nullPropertyPattern","BX","zO",function(){return H.LX(H.Mj(null))})
-I.$lazy($,"nullLiteralPropertyPattern","tt","Bi",function(){return H.LX(function(){try{null.$method$}catch(z){return z.message}}())})
-I.$lazy($,"undefinedPropertyPattern","dt","eA",function(){return H.LX(H.Mj(void 0))})
-I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.LX(function(){try{(void 0).$method$}catch(z){return z.message}}())})
-I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().$0()})
-I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
-I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
-I.$lazy($,"_dynamicType","QG","P8",function(){return new H.EE(C.nN)})
-I.$lazy($,"_voidType","Q3","oj",function(){return new H.EE(C.v6)})
-I.$lazy($,"librariesByName","Ct","vK",function(){return H.dF()})
-I.$lazy($,"currentJsMirrorSystem","GR","Cm",function(){return new H.Sn(null,new H.Lj(init.globalState.N0))})
-I.$lazy($,"mangledNames","tj","bx",function(){return H.hY(init.mangledNames,!1)})
-I.$lazy($,"reflectiveNames","DE","I6",function(){return H.YK($.bx())})
-I.$lazy($,"mangledGlobalNames","iC","Sl",function(){return H.hY(init.mangledGlobalNames,!0)})
-I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.Oj()})
+I.$lazy($,"nullPropertyPattern","BX","W6",function(){return H.cM(H.Mj(null))})
+I.$lazy($,"nullLiteralPropertyPattern","tt","Bi",function(){return H.cM(function(){try{null.$method$}catch(z){return z.message}}())})
+I.$lazy($,"undefinedPropertyPattern","dt","eA",function(){return H.cM(H.Mj(void 0))})
+I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.cM(function(){try{(void 0).$method$}catch(z){return z.message}}())})
+I.$lazy($,"_completer","IQ","Xr",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
+I.$lazy($,"_toStringList","qW","oM",function(){return[]})
+I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.C2()})
 I.$lazy($,"_toStringVisiting","xg","xb",function(){return P.yv(null)})
 I.$lazy($,"_toStringList","yu","tw",function(){return[]})
-I.$lazy($,"webkitEvents","fD","Vp",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","eo","cM",function(){return P.ND(function(){return this}())})
-I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
+I.$lazy($,"webkitEvents","Ha","PO",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","ca",function(){return P.pL(function(){return this}())})
+I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","xu","jl",function(){return init.getIsolateTag("_$dart_dartObject")})
 I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
 I.$lazy($,"_dartProxyCtor","Je","hs",function(){return function DartObject(a){this.o=a}})
-I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
-I.$lazy($,"_pageSeparationColor","RD","eK",function(){return[0,0,0,255]})
-I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(J.O,N.TJ)})
-I.$lazy($,"_logger","G3","iU",function(){return N.Jx("Observable.dirtyCheck")})
-I.$lazy($,"objectType","XV","aA",function(){return P.re(C.nY)})
-I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.Md().$0()})
-I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR(H.v4("\\s",!1,!0,!1),null,null)})
-I.$lazy($,"_logger","y7","aT",function(){return N.Jx("observe.PathObserver")})
-I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,J.O,P.uq)})
-I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,J.O,A.XP)})
-I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,J.O,[J.Q,A.XP])})
-I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,J.O,A.XP)})
-I.$lazy($,"_objectType","p0","H8",function(){return P.re(C.nY)})
-I.$lazy($,"_sheetLog","Fa","vM",function(){return N.Jx("polymer.stylesheet")})
-I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w12().$0()})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR(H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,J.O,P.a)
+I.$lazy($,"_freeColor","nK","aw",function(){return[255,255,255,255]})
+I.$lazy($,"_pageSeparationColor","fM","Sd",function(){return[0,0,0,255]})
+I.$lazy($,"_loggers","Uj","Iu",function(){return P.Fl(P.qU,N.Rw)})
+I.$lazy($,"_logger","m0","OD",function(){return N.QM("Observable.dirtyCheck")})
+I.$lazy($,"_instance","qr","V6",function(){return new L.ov([])})
+I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.MdQ().$0()})
+I.$lazy($,"_logger","y7","Ku",function(){return N.QM("observe.PathObserver")})
+I.$lazy($,"_pathCache","zC","fX",function(){return P.L5(null,null,null,P.qU,L.Tv)})
+I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
+I.$lazy($,"_declarations","ef","RA",function(){return P.L5(null,null,null,P.qU,A.XP)})
+I.$lazy($,"_hasShadowDomPolyfill","jQ","Nc",function(){return $.ca().Eg("ShadowDOMPolyfill")})
+I.$lazy($,"_sheetLog","dz","Es",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.NL())})
+I.$lazy($,"_reverseEventTranslations","fp","pT",function(){return new A.DOe().$0()})
+I.$lazy($,"_ATTRIBUTES_REGEX","vg","zZ",function(){return new H.VR("\\s|,",H.ol("\\s|,",!1,!0,!1),null,null)})
+I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.ol("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"_polymerSyntax","Df","J1",function(){var z=P.L5(null,null,null,P.qU,P.a)
 z.FV(0,C.eu)
-return new A.HJ(z)})
+return new A.N9(z)})
 I.$lazy($,"_ready","tS","mC",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"veiledElements","yi","IN",function(){return["body"]})
-I.$lazy($,"_observeLog","DZ","a3",function(){return N.Jx("polymer.observe")})
-I.$lazy($,"_eventsLog","Fj","SS",function(){return N.Jx("polymer.events")})
-I.$lazy($,"_unbindLog","fV","P5",function(){return N.Jx("polymer.unbind")})
-I.$lazy($,"_bindLog","Q6","ZH",function(){return N.Jx("polymer.bind")})
-I.$lazy($,"_shadowHost","cU","od",function(){return H.VM(new P.kM(null),[A.zs])})
-I.$lazy($,"_librariesToLoad","x2","UP",function(){return A.GA(document,window.location.href,null,null)})
-I.$lazy($,"_libs","D9","UG",function(){return $.Cm().gvU()})
-I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().F1.gcZ().gFP()})
-I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
-I.$lazy($,"_typeHandlers","lq","CT",function(){return new Z.W6().$0()})
-I.$lazy($,"_logger","m0","eH",function(){return N.Jx("polymer_expressions")})
-I.$lazy($,"_BINARY_OPERATORS","Af","Ra",function(){return P.EF(["+",new K.Uf(),"-",new K.wJY(),"*",new K.zOQ(),"/",new K.W6o(),"==",new K.MdQ(),"!=",new K.YJG(),">",new K.DOe(),">=",new K.lPa(),"<",new K.Ufa(),"<=",new K.Raa(),"||",new K.w0(),"&&",new K.w4(),"|",new K.w5()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return P.EF(["+",new K.w7(),"-",new K.w10(),"!",new K.w11()],null,null)})
-I.$lazy($,"_currentIsolateMatcher","tV","PY",function(){return new H.VR(H.v4("isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR(H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.DO().$0()})
+I.$lazy($,"_observeLog","DZ","dn",function(){return N.QM("polymer.observe")})
+I.$lazy($,"_eventsLog","mf","Uk",function(){return N.QM("polymer.events")})
+I.$lazy($,"_unbindLog","fV","RI",function(){return N.QM("polymer.unbind")})
+I.$lazy($,"_bindLog","Q6","ZH",function(){return N.QM("polymer.bind")})
+I.$lazy($,"_shadowHost","zr","c7",function(){return H.VM(new P.kM(null),[A.dM])})
+I.$lazy($,"_typeHandlers","lq","QL",function(){return P.EF([C.Db,new Z.Md(),C.GX,new Z.lP(),C.Yc,new Z.Uf(),C.BQ,new Z.Ra(),C.yw,new Z.wJY(),C.AY,new Z.zOQ()],null,null)})
+I.$lazy($,"_BINARY_OPERATORS","Af","Jl",function(){return P.EF(["+",new K.lPa(),"-",new K.Ufa(),"*",new K.Raa(),"/",new K.w0(),"==",new K.w5(),"!=",new K.w10(),">",new K.w11(),">=",new K.w12(),"<",new K.w13(),"<=",new K.w14(),"||",new K.w15(),"&&",new K.w16(),"|",new K.w17()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","qM","qL",function(){return P.EF(["+",new K.w18(),"-",new K.w19(),"!",new K.w20()],null,null)})
+I.$lazy($,"_currentIsolateMatcher","mb","vo",function(){return new H.VR("isolates/\\d+",H.ol("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.ol("isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
+I.$lazy($,"typeInspector","Yv","yQ",function(){return D.kP()})
+I.$lazy($,"symbolConverter","qe","b7",function(){return D.kP()})
+I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.YJG().$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
 I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.lP()).zV(0,", ")})
-I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
+I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.W6o()).zV(0,", ")})
+I.$lazy($,"_templateCreator","H8","rf",function(){return H.VM(new P.kM(null),[null])})
+I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.kM("template_binding"),[null])})
 
-init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","charCode","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isSuperCall","stubName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"ny"},{func:"Dv",args:[null]},"_","a","total","pad",{func:"Pt",ret:J.O,args:[J.bU]},"v","time","bytes",{func:"RJ",ret:J.O,args:[null]},{func:"kl",void:true},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","fields","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map",{func:"n9",void:true,args:[{func:"kl",void:true}]},"callback","errorHandler","zone","listeners","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,J.O]},"line",{func:"kx",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bX",ret:J.bU,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","indent",{func:"P2",ret:J.bU,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"Gm",ret:J.bU,args:[P.a]},{func:"K4",ret:J.bU,args:[J.O],named:{onError:{func:"Tl",ret:J.bU,args:[J.O]},radix:J.bU}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","length","createProxy","mustCopy","nativeImageData","imageData","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","val",{func:"bh",args:[null,null]},{func:"Za",args:[J.O,null]},"parameter",{func:"hF",args:[null,J.O]},J.kn,J.O,[P.Z0,J.O,W.cv],{func:"Uf",ret:J.kn},C.Nw,C.J19,{func:"zk",args:[J.kn]},C.Us,{func:"I0",ret:J.O},{func:"ZT",void:true,args:[null,null,null]},X.LP,H.Tp,G.dZ,D.zM,{func:"Wy",ret:D.bv},{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event",J.bU,[J.Q,G.Y2],[J.Q,J.O],{func:"r5",ret:[J.Q,J.bU]},{func:"qE",ret:J.O,args:[J.bU,J.bU]},"row","column",{func:"wI",args:[J.bU,J.bU]},"i","j",D.SI,{func:"Eg",ret:D.SI},{func:"Q5",args:[D.SI]},"done",B.pv,D.af,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},"dummy",Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,"r",R.Vct,R.Nr,"library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"typeArgument","tv",{func:"VG",ret:P.Ms,args:[J.bU]},{func:"Z5",args:[J.bU]},{func:"UC",ret:P.X9,args:[J.bU]},"reflectiveName",{func:"ag",args:[J.O,J.O]},{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each","k",{func:"Yz",ret:J.kn,args:[P.jp]},"matched",{func:"Tl",ret:J.bU,args:[J.O]},{func:"Zh",ret:J.Pp,args:[J.O]},"ch",{func:"cd",ret:J.kn,args:[J.bU]},{func:"Dt",ret:J.bU,args:[J.bU]},"digit","part",{func:"GF",ret:J.bU,args:[null,null]},"byteString",{func:"HE",ret:J.bU,args:[J.bU,J.bU]},"byte","buffer","xhr","header","prevValue",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.WZq,R.Bc,A.pva,U.rs,{func:"fO",ret:J.O,args:[D.SI]},N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.bU,args:[[P.QV,J.bU]]},"color",{func:"S1",void:true,args:[J.bU,J.O,[P.QV,J.bU]]},"classId",{func:"D8",void:true,args:[null,J.bU]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.bU],args:[J.bU]},{func:"D9",ret:J.O,args:[[P.hL,J.bU]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,J.bU]]},{func:"j4",void:true,args:[J.bU]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.bU]},{func:"Yi",ret:J.O,args:[J.kn]},"newSpace",K.V4,{func:"iR",args:[J.bU,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[J.O]}]},{func:"uj",ret:P.QV,args:[{func:"qt",ret:P.QV,args:[J.O]}]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V9,D.t9,J.Pp,G.XN,{func:"nzZ",ret:J.O,args:[G.Y2]},X.V10,D.bv,D.V11,{func:"KD",ret:P.b8,args:[null]},D.V12,D.V13,D.V14,V.qC,D.vT,{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},D.V15,P.tU,L.Lr,L.V16,"tagProfile",Z.V17,D.U4,{func:"ax",ret:D.U4},{func:"SN",args:[D.U4]},M.V18,"rec",{func:"IM",args:[N.HV]},A.V19,A.V20,A.V21,A.V22,A.V23,A.V24,A.V25,A.V26,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V27,{func:"Z8",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.Pp]},{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"kG",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:J.bU},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"ZD",args:[[J.Q,G.DA]]},{func:"oe",args:[[J.Q,T.yj]]},"onName","eventType",{func:"rj",void:true,args:[J.O,J.O]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"pair","p",{func:"YT",void:true,args:[[J.Q,T.yj]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"PO",ret:U.zX,args:[U.hw,U.hw]},"h","item",3,{func:"Qc",args:[U.hw]},Q.V28,D.rj,[J.Q,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[J.Q,D.c2]},{func:"mRV",args:[[J.Q,D.c2]]},{func:"Yg",ret:J.O,args:[D.c2]},T.V29,A.x4,U.V30,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:J.Pp},{func:"mV",args:[J.Pp]},"isolateId",[P.Z0,J.O,J.Pp],{func:"zs",ret:J.O,args:[J.O]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"EIX",ret:[Q.wn,D.U4]},{func:"P5",args:[[Q.wn,D.U4]]},{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[J.Q,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V31,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V32,{func:"nR",ret:Z.uL},U.V33,Q.Vfx,"details",Q.LPc,K.V34,X.V35,"y",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"UxH",args:[J.Q]},D.pD,{func:"Af",args:[D.zM]},U.V36,];$=null
+init.functionAliases={Sa:166}
+init.metadata=["sender","e",{func:"pL",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"aB",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"b1",void:true,args:[{func:"kl",void:true}]},{func:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.MN]},,"error","stackTrace",{func:"Ib",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.Rz,P.Rz]},{func:"E0",ret:P.a2,args:[P.a,P.a]},{func:"DZ",ret:P.KN,args:[P.a]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","callback","captureThis","self","arguments","o",{func:"NT"},{func:"ZD",ret:P.a2,args:[P.IN]},"symbol",{func:"qq",ret:[P.cX,K.O1],args:[P.cX]},"iterable","invocation","f",{func:"ob",args:[P.EH]},"code",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"Cj",void:true,args:[D.EP]},"exception","event","obj",{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"c3",args:[P.KN,P.KN]},"done",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail","target",{func:"Aw",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"Cm",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"arg","each",{func:"lv",args:[P.IN,null]},{func:"jK",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.CP,args:[P.qU]},"xhr",{func:"QO",void:true,args:[W.Oq]},"result",{func:"fK",args:[D.af]},{func:"XG",ret:O.Hz},"response",{func:"Q5",args:[D.vO]},"st",{func:"Sz",void:true,args:[W.ea,null,W.h4]},{func:"xo",ret:P.qU,args:[P.a2]},"newSpace",{func:"vO",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"xD",ret:P.cX,args:[{func:"pL",args:[P.qU]}]},{func:"Qd",ret:P.cX,args:[{func:"qt",ret:P.cX,args:[P.qU]}]},{func:"S0",void:true,args:[P.a2,null]},"expand",{func:"KDY",ret:[P.b8,D.af],args:[null]},{func:"Df",ret:P.qU,args:[G.Y2]},"m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"le",ret:P.qU,args:[P.CP]},"time",{func:"h6",ret:P.a2,args:[P.qU]},"type","s",{func:"DF",void:true,args:[P.a]},"records",{func:"kk",args:[L.Tv,null]},{func:"qx",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"WW",void:true,args:[W.ea]},"i","changes","model","node","oneTime",{func:"yF",args:[null,null,null]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},"k","v",{func:"oe",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.hw,U.hw]},{func:"qo",args:[U.hw]},{func:"Yg",ret:P.qU,args:[D.c2]},"line","map",{func:"JC",args:[V.qC]},{func:"If",ret:P.qU,args:[P.qU]},"id",{func:"rl",ret:P.b8},{func:"a0",void:true,args:[D.vO]},"coverage","scriptCoverage","timer",{func:"I0",ret:P.qU},{func:"xA",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func","msg","details","x",{func:"K7",void:true,args:[[P.WO,G.DA]]},"splices",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"vl",ret:[P.b8,V.qC],args:[P.qU]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
-function convertToFastObject(properties) {
-  function MyClass() {};
-  MyClass.prototype = properties;
-  new MyClass();
-  return properties;
-}
+function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
+new MyClass()
+return a}
 A = convertToFastObject(A)
 B = convertToFastObject(B)
 C = convertToFastObject(C)
@@ -17960,35 +17541,11 @@
 init.isolateTag=v
 break}}}()
 init.dispatchPropertyName=init.getIsolateTag("dispatch_record")
-;(function (callback) {
-  if (typeof document === "undefined") {
-    callback(null);
-    return;
-  }
-  if (document.currentScript) {
-    callback(document.currentScript);
-    return;
-  }
-
-  var scripts = document.scripts;
-  function onLoad(event) {
-    for (var i = 0; i < scripts.length; ++i) {
-      scripts[i].removeEventListener("load", onLoad, false);
-    }
-    callback(event.target);
-  }
-  for (var i = 0; i < scripts.length; ++i) {
-    scripts[i].addEventListener("load", onLoad, false);
-  }
-})(function(currentScript) {
-  init.currentScript = currentScript;
-
-  if (typeof dartMainRunner === "function") {
-    dartMainRunner((function(a){H.oT(E.KU(),a)}), []);
-  } else {
-    (function(a){H.oT(E.KU(),a)})([]);
-  }
-})
+;(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.Tb(),b)},[])}else{(function(b){H.wW(E.Tb(),b)})([])}})
 function init(){I.p={}
 function generateAccessor(a,b,c){var y=a.split("-")
 var x=y[0]
@@ -18045,7 +17602,7 @@
 var t=[]}for(var s in a){if(w.call(a,s)){var r=a[s]
 if(r instanceof Array)r=r[1]
 var q=r["^"],p,o=s,n=q
-if(typeof q=="object"&&q instanceof Array){q=n=q[0]}if(typeof q=="string"){var m=q.split("/")
+if(typeof q=="string"){var m=q.split("/")
 if(m.length==2){o=m[0]
 n=m[1]}}var l=n.split(";")
 n=l[1]==""?[]:l[1].split(",")
@@ -18065,8 +17622,7 @@
 var r=a[s]
 var f=b
 if(r instanceof Array){f=r[0]||b
-r=r[1]}g["@"]=r
-x[s]=g
+r=r[1]}x[s]=g
 f[s]=g}v=null
 var e={}
 init.interceptorsByTag=Object.create(null)
@@ -18089,9 +17645,7 @@
 for(var a6=0;a6<a7.length;a6++){var a8=x[a7[a6]]
 a8.$nativeSuperclassTag=a5[0]}}for(a6=0;a6<a5.length;a6++){init.interceptorsByTag[a5[a6]]=a1
 init.leafTags[a5[a6]]=false}}}}for(var s in y)finishClass(s)}
-I.$lazy=function(a,b,c,d,e){if(!init.lazies)init.lazies={}
-init.lazies[c]=d
-var y={}
+I.$lazy=function(a,b,c,d,e){var y={}
 var x={}
 a[c]=y
 a[d]=function(){var w=$[c]
@@ -18105,6 +17659,6 @@
 Isolate.prototype.constructor=Isolate
 Isolate.p=y
 Isolate.$finishClasses=a.$finishClasses
-Isolate.makeConstantList=a.makeConstantList
+Isolate.ko=a.ko
 return Isolate}}
 })()
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index 69f642c..ca3f4b2 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -1,16 +1,347 @@
-<!DOCTYPE html><html><head><script src="packages/shadow_dom/shadow_dom.debug.js"></script>
-<script src="packages/custom_element/custom-elements.debug.js"></script>
-
+<!DOCTYPE html><html><head>
   <title>Dart VM Observatory</title>
   <meta charset="utf-8">
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
-  <script type="text/javascript" src="https://www.google.com/jsapi"></script>
-  <script src="packages/browser/interop.js"></script>
   
-  <script src="index_devtools.html_bootstrap.dart.js"></script>
+  
+  
+  
+  
   
 </head>
-<body><polymer-element name="curly-block">
+<body><script type="text/javascript" src="https://www.google.com/jsapi"></script>
+
+<!--
+These two files are from the Polymer project:
+https://github.com/Polymer/platform/ and https://github.com/Polymer/polymer/.
+
+You can replace platform.js and polymer.html with different versions if desired.
+-->
+<!-- minified for deployment: -->
+
+
+
+<!-- unminfied for debugging:
+<script src="../../packages/web_components/platform.concat.js"></script>
+<script src="src/js/polymer/polymer.concat.js"></script>
+<link rel="import" href="src/js/polymer/polymer-body.html">
+-->
+
+<!-- Teach dart2js about Shadow DOM polyfill objects. -->
+
+
+<!-- Bootstrap the user application in a new isolate. -->
+
+<!-- TODO(sigmund): replace boot.js by boot.dart (dartbug.com/18007)
+<script type="application/dart">export "package:polymer/boot.dart";</script>
+ -->
+<script src="packages/polymer/src/js/use_native_dartium_shadowdom.js"></script><script src="packages/web_components/platform.js"></script>
+<!-- <link rel="import" href="../polymer-dev/polymer.html"> -->
+<script src="packages/polymer/src/js/polymer/polymer.js"></script><polymer-element name="polymer-body" extends="body">
+
+  <script>
+
+  // upgrade polymer-body last so that it can contain other imported elements
+  document.addEventListener('polymer-ready', function() {
+    
+    Polymer('polymer-body', Platform.mixin({
+
+      created: function() {
+        this.template = document.createElement('template');
+        var body = wrap(document).body;
+        var c$ = body.childNodes.array();
+        for (var i=0, c; (c=c$[i]); i++) {
+          if (c.localName !== 'script') {
+            this.template.content.appendChild(c);
+          }
+        }
+        // snarf up user defined model
+        window.model = this;
+      },
+
+      parseDeclaration: function(elementElement) {
+        this.lightFromTemplate(this.template);
+      }
+
+    }, window.model));
+
+  });
+
+  </script>
+
+</polymer-element><script src="packages/web_components/dart_support.js"></script><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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+
+  
+
+  
+  
+  
+<polymer-element name="curly-block">
   <template>
     <style>
       .idle {
@@ -53,11 +384,239 @@
 <polymer-element name="observatory-element">
   
 </polymer-element>
+
+  
 <polymer-element name="service-ref" extends="observatory-element">
   
 </polymer-element><polymer-element name="instance-ref" extends="service-ref">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <style>
+/* 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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <style>
       .errorBox {
         background-color: #f5f5f5;
@@ -162,9 +721,240 @@
   </template>
   
 </polymer-element>
+
+  
+  
+
+  
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <style>
       nav {
         position: fixed;
@@ -365,7 +1155,233 @@
 
 <polymer-element name="breakpoint-list" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
@@ -389,12 +1405,254 @@
   </template>
   
 </polymer-element>
+
+
 <polymer-element name="class-ref" extends="service-ref">
 
-<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+<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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
 
 </polymer-element>
+
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+
+  
+  
 <polymer-element name="eval-box" extends="observatory-element">
   <template>
     <style>
@@ -475,6 +1733,8 @@
 </polymer-element>
 
 
+
+  
 <polymer-element name="eval-link">
   <template>
     <style>
@@ -489,10 +1749,10 @@
     </style>
 
     <template if="{{ busy }}">
-      <span class="busy">[evaluate]</span>
+      <span class="busy">{{ label }}</span>
     </template>
     <template if="{{ !busy }}">
-      <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
+      <span class="idle"><a on-click="{{ evalNow }}">{{ label }}</a></span>
     </template>
     <template if="{{ result != null }}">
       = <instance-ref ref="{{ result }}"></instance-ref>
@@ -501,9 +1761,239 @@
   </template>
   
 </polymer-element>
+
+
+
+
 <polymer-element name="field-ref" extends="service-ref">
   <template>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <div>
       <template if="{{ ref['static'] }}">static</template>
       <template if="{{ ref['final'] }}">final</template>
@@ -520,8 +2010,237 @@
   </template>
   
 </polymer-element>
+
+
+
 <polymer-element name="function-ref" extends="service-ref">
-  <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css"><!-- These comments are here to allow newlines.
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style><!-- These comments are here to allow newlines.
      --><template if="{{ isDart }}"><!--
        --><template if="{{ qualified &amp;&amp; !hasParent &amp;&amp; hasClass }}"><!--
        --><class-ref ref="{{ ref['owner'] }}"></class-ref>.</template><!--
@@ -532,8 +2251,236 @@
   --></template><template if="{{ !isDart }}"><span> {{ name }}</span></template></template>
 
 </polymer-element>
+
+
 <polymer-element name="library-ref" extends="service-ref">
-<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+<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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
   <template if="{{ nameIsEmpty }}">
     <a href="{{ url }}">unnamed</a>
   </template>
@@ -543,16 +2490,471 @@
 </template>
 
 </polymer-element>
+
+
+
 <polymer-element name="script-ref" extends="service-ref">
 <template>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
   <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
 
 </polymer-element>
 <polymer-element name="class-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
@@ -689,9 +3091,237 @@
   </template>
   
 </polymer-element>
+
+  
 <polymer-element name="code-ref" extends="service-ref">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <template if="{{ code.isDartCode }}">
         <template if="{{ code.isOptimized }}">
           <a href="{{ url }}">*{{ name }}</a>
@@ -705,9 +3335,240 @@
     </template>
   </template>
 
-</polymer-element><polymer-element name="code-view" extends="observatory-element">
+</polymer-element>
+
+
+
+
+<polymer-element name="code-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <style>
       div.flex-row:hover {
         background-color: #FFF3E3;
@@ -866,6 +3727,8 @@
   </template>
   
 </polymer-element>
+
+  
 <polymer-element name="collapsible-content" extends="observatory-element">
   <template>
     <div class="well row">
@@ -878,9 +3741,238 @@
     </div>
   </template>
   
-</polymer-element><polymer-element name="error-view" extends="observatory-element">
+</polymer-element>
+  
+  
+<polymer-element name="error-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
@@ -892,9 +3984,242 @@
   </template>
   
 </polymer-element>
+
+  
+  
+  
+  
+  
+  
 <polymer-element name="field-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
@@ -977,6 +4302,17 @@
   </template>
   
 </polymer-element>
+
+  
+  
+  
+  
+  
+  
+  
+  
+
+  
 <polymer-element name="script-inset" extends="observatory-element">
   <template>
     <style>
@@ -1024,7 +4360,233 @@
 </polymer-element>
 <polymer-element name="function-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu>
@@ -1130,9 +4692,239 @@
   </template>
   
 </polymer-element>
+
+  
+  
+  
 <polymer-element name="heap-map" extends="observatory-element">
 <template>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
   <style>
     .hover {
       position: fixed;
@@ -1164,15 +4956,1482 @@
 </template>
 
 </polymer-element>
+
+  
+  
+  
+<polymer-element name="io-view" extends="observatory-element">
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>dart:io</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/http/servers')}}">HTTP Servers</a>
+        </li>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-http-server-list-view" extends="observatory-element">
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>HttpServers</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ httpServer in list['members'] }}">
+          <li class="list-group-item">
+            <io-http-server-ref ref="{{ httpServer }}"></io-http-server-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-http-server-ref" 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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-http-server-view" extends="observatory-element">
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>HttpServer</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Address</div>
+          <div class="memberValue">{{ httpServer['address'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Port</div>
+          <div class="memberValue">{{ httpServer['port'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Active connections</div>
+          <div class="memberValue">{{ httpServer['active'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Idle connections</div>
+          <div class="memberValue">{{ httpServer['idle'] }}</div>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+
+
+
 <polymer-element name="isolate-ref" extends="service-ref">
-<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+<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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 
 </polymer-element>
+
+  
+  
+  
+  
+  
+  
 <polymer-element name="isolate-summary" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <div class="flex-row">
       <div class="flex-item-10-percent">
         <img src="packages/observatory/src/elements/img/isolate_icon.png">
@@ -1271,7 +6530,233 @@
         white-space: pre;
       }
     </style>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <template if="{{ isolate.error != null }}">
       <div class="content-centered">
         <pre class="errorBox">{{ isolate.error.message }}</pre>
@@ -1285,47 +6770,52 @@
         <isolate-counter-chart counters="{{ isolate.counters }}"></isolate-counter-chart>
       </div>
       <div class="flex-item-40-percent">
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberName">new heap</div>
-              <div class="memberValue">
-                {{ isolate.newHeapUsed | formatSize }}
-                of
-                {{ isolate.newHeapCapacity | formatSize }}
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberName">old heap</div>
-              <div class="memberValue">
-                {{ isolate.oldHeapUsed | formatSize }}
-                of
-                {{ isolate.oldHeapCapacity | formatSize }}
-              </div>
-            </div>
-          </div>
-          <br>
+        <div class="memberList">
           <div class="memberItem">
+            <div class="memberName">new heap</div>
             <div class="memberValue">
-              See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+              {{ isolate.newHeapUsed | formatSize }}
+              of
+              {{ isolate.newHeapCapacity | formatSize }}
             </div>
           </div>
           <div class="memberItem">
+            <div class="memberName">old heap</div>
             <div class="memberValue">
-              See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+              {{ isolate.oldHeapUsed | formatSize }}
+              of
+              {{ isolate.oldHeapCapacity | formatSize }}
             </div>
           </div>
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
-              </div>
+        </div>
+        <br>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+          </div>
+        </div>
+        <template if="{{ isolate.ioEnabled }}">
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('io') }}">dart:io</a>
             </div>
           </div>
+        </template>
       </div>
       <div class="flex-item-10-percent">
       </div>
@@ -1340,9 +6830,246 @@
 </polymer-element>
 
 
+
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
 <polymer-element name="isolate-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <style>
       .sourceInset {
         padding-left: 15%;
@@ -1468,9 +7195,245 @@
   </template>
   
 </polymer-element>
+
+  
+  
+  
+  
+  
+  
+  
+  
+  
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ instance.isolate }}"></isolate-nav-menu>
@@ -1514,7 +7477,32 @@
           <div class="memberItem">
             <div class="memberName">retained size</div>
             <div class="memberValue">
-              <eval-link callback="{{ retainedSize }}"></eval-link>
+              <eval-link callback="{{ retainedSize }}" label="[calculate]">
+              </eval-link>
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">retaining path</div>
+            <div class="memberValue">
+              <template if="{{ path == null }}">
+                <eval-link callback="{{ retainingPath }}" label="[find]" expr="10">
+                </eval-link>
+              </template>
+              <template if="{{ path != null }}">
+                <template repeat="{{ element in path['elements'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ element['index']}}]</div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                  </div>
+                  </div>
+                </template>
+                <template if="{{ path['length'] > path['elements'].length }}">
+                  showing {{ path['elements'].length }} of {{ path['length'] }}
+                  <eval-link callback="{{ retainingPath }}" label="[find more]" expr="{{ path['elements'].length * 2 }}">
+                  </eval-link>
+                </template>
+              </template>
             </div>
           </div>
           <template if="{{ instance['type_class'] != null }}">
@@ -1607,10 +7595,13 @@
       </div>
       <br><br><br><br>
       <br><br><br><br>
+
     </template>
   </template>
   
 </polymer-element>
+
+
 <polymer-element name="json-view" extends="observatory-element">
   <template>
     <nav-bar>
@@ -1620,9 +7611,246 @@
   </template>
   
 </polymer-element>
+
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
 <polymer-element name="library-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
 
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -1749,6 +7977,379 @@
   </template>
   
 </polymer-element>
+
+  
+  
+
+  
+  
+
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+  
+
+  
+  
+  
+<polymer-element name="heap-profile" extends="observatory-element">
+<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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
+  <style>
+    .table {
+      border-collapse: collapse!important;
+      width: 100%;
+      margin-bottom: 20px
+      table-layout: fixed;
+    }
+    .table td:nth-of-type(1) {
+      width: 30%;
+    }
+    .th, .td {
+      padding: 8px;
+      vertical-align: top;
+    }
+    .table thead > tr > th {
+      vertical-align: bottom;
+      text-align: left;
+      border-bottom:2px solid #ddd;
+    }
+    .clickable {
+      color: #0489c3;
+      text-decoration: none;
+      cursor: pointer;
+    }
+    .clickable:hover {
+      text-decoration: underline;
+      cursor: pointer;
+    }
+    #classtable tr:hover > td {
+      background-color: #F4C7C3;
+    }
+  </style>
+  <nav-bar>
+    <top-nav-menu></top-nav-menu>
+    <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
+    <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
+    <nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh>
+    <nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh>
+    <nav-refresh callback="{{ refresh }}"></nav-refresh>
+  </nav-bar>
+
+  <div class="flex-row">
+    <div id="newPieChart" class="flex-item-fixed-4-12" style="height: 400px">
+    </div>
+    <div id="newStatus" class="flex-item-fixed-2-12">
+      <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">Collections</div>
+            <div class="memberValue">{{ formattedCollections(true) }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Average Collection Time</div>
+            <div class="memberValue">{{ formattedAverage(true) }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Cumulative Collection Time</div>
+            <div class="memberValue">{{ formattedTotalCollectionTime(true) }}</div>
+          </div>
+      </div>
+    </div>
+    <div id="oldPieChart" class="flex-item-fixed-4-12" style="height: 400px">
+    </div>
+    <div id="oldStatus" class="flex-item-fixed-2-12">
+      <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">Collections</div>
+            <div class="memberValue">{{ formattedCollections(false) }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Average Collection Time</div>
+            <div class="memberValue">{{ formattedAverage(false) }}</div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">Cumulative Collection Time</div>
+            <div class="memberValue">{{ formattedTotalCollectionTime(false) }}</div>
+          </div>
+      </div>
+    </div>
+  </div>
+  <div class="flex-row">
+    <table id="classtable" class="flex-item-fixed-12-12 table">
+      <thead>
+        <tr>
+          <th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th>
+        </tr>
+      </thead>
+      <tbody>
+        <tr template="" repeat="{{row in classTable.sortedRows }}">
+          <td><class-ref ref="{{ classTable.getValue(row, 0) }}"></class-ref></td>
+          <td title="{{ classTable.getValue(row, 1) }}">{{ classTable.getFormattedValue(row, 1) }}</td>
+          <td title="{{ classTable.getValue(row, 2) }}">{{ classTable.getFormattedValue(row, 2) }}</td>
+          <td title="{{ classTable.getValue(row, 3) }}">{{ classTable.getFormattedValue(row, 3) }}</td>
+          <td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td>
+          <td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td>
+          <td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td>
+          <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td>
+          <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+</template>
+
+</polymer-element>
+
+  
+  
+  
+  
+  
 <polymer-element name="sliding-checkbox">
   <template>
     <style>
@@ -1835,7 +8436,233 @@
 </polymer-element>
 <polymer-element name="isolate-profile" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
@@ -2014,124 +8841,239 @@
   </template>
   
 </polymer-element>
-<polymer-element name="heap-profile" extends="observatory-element">
-<template>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
-  <style>
-    .table {
-      border-collapse: collapse!important;
-      width: 100%;
-      margin-bottom: 20px
-      table-layout: fixed;
-    }
-    .table td:nth-of-type(1) {
-      width: 30%;
-    }
-    .th, .td {
-      padding: 8px;
-      vertical-align: top;
-    }
-    .table thead > tr > th {
-      vertical-align: bottom;
-      text-align: left;
-      border-bottom:2px solid #ddd;
-    }
-    .clickable {
-      color: #0489c3;
-      text-decoration: none;
-      cursor: pointer;
-    }
-    .clickable:hover {
-      text-decoration: underline;
-      cursor: pointer;
-    }
-    #classtable tr:hover > td {
-      background-color: #F4C7C3;
-    }
-  </style>
-  <nav-bar>
-    <top-nav-menu></top-nav-menu>
-    <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-    <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
-    <nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh>
-    <nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh>
-    <nav-refresh callback="{{ refresh }}"></nav-refresh>
-  </nav-bar>
 
-  <div class="flex-row">
-    <div id="newPieChart" class="flex-item-fixed-4-12" style="height: 400px">
-    </div>
-    <div id="newStatus" class="flex-item-fixed-2-12">
-      <div class="memberList">
-          <div class="memberItem">
-            <div class="memberName">Collections</div>
-            <div class="memberValue">{{ formattedCollections(true) }}</div>
-          </div>
-          <div class="memberItem">
-            <div class="memberName">Average Collection Time</div>
-            <div class="memberValue">{{ formattedAverage(true) }}</div>
-          </div>
-          <div class="memberItem">
-            <div class="memberName">Cumulative Collection Time</div>
-            <div class="memberValue">{{ formattedTotalCollectionTime(true) }}</div>
-          </div>
-      </div>
-    </div>
-    <div id="oldPieChart" class="flex-item-fixed-4-12" style="height: 400px">
-    </div>
-    <div id="oldStatus" class="flex-item-fixed-2-12">
-      <div class="memberList">
-          <div class="memberItem">
-            <div class="memberName">Collections</div>
-            <div class="memberValue">{{ formattedCollections(false) }}</div>
-          </div>
-          <div class="memberItem">
-            <div class="memberName">Average Collection Time</div>
-            <div class="memberValue">{{ formattedAverage(false) }}</div>
-          </div>
-          <div class="memberItem">
-            <div class="memberName">Cumulative Collection Time</div>
-            <div class="memberValue">{{ formattedTotalCollectionTime(false) }}</div>
-          </div>
-      </div>
-    </div>
-  </div>
-  <div class="flex-row">
-    <table id="classtable" class="flex-item-fixed-12-12 table">
-      <thead>
-        <tr>
-          <th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th>
-        </tr>
-      </thead>
-      <tbody>
-        <tr template="" repeat="{{row in classTable.sortedRows }}">
-          <td><class-ref ref="{{ classTable.getValue(row, 0) }}"></class-ref></td>
-          <td title="{{ classTable.getValue(row, 1) }}">{{ classTable.getFormattedValue(row, 1) }}</td>
-          <td title="{{ classTable.getValue(row, 2) }}">{{ classTable.getFormattedValue(row, 2) }}</td>
-          <td title="{{ classTable.getValue(row, 3) }}">{{ classTable.getFormattedValue(row, 3) }}</td>
-          <td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td>
-          <td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td>
-          <td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td>
-          <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td>
-          <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td>
-        </tr>
-      </tbody>
-    </table>
-  </div>
-</template>
-
-</polymer-element>
+  
+  
+  
 <polymer-element name="script-view" extends="observatory-element">
 <template>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+  <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
@@ -2153,9 +9095,245 @@
 </template>
 
 </polymer-element>
+
+  
+  
+  
+
+  
+  
+  
+  
+  
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <div class="flex-row">
       <div class="flex-item-fixed-1-12">
       </div>
@@ -2188,7 +9366,233 @@
 </polymer-element>
 <polymer-element name="stack-trace" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
@@ -2212,9 +9616,244 @@
   </template>
   
 </polymer-element>
+
+  
+  
+  
+  
+  
+  
+  
+  
 <polymer-element name="vm-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -2269,13 +9908,242 @@
   
 </polymer-element><polymer-element name="observatory-application" extends="observatory-element">
   <template>
-    <response-viewer app="{{ app }}"></response-viewer>
+    <response-viewer app="{{ this.app }}"></response-viewer>
   </template>
   
 </polymer-element>
+
+  
+  
 <polymer-element name="service-exception-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
@@ -2290,9 +10158,238 @@
   </template>
   
 </polymer-element>
+
+  
+  
 <polymer-element name="service-error-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
@@ -2304,14 +10401,242 @@
   </template>
   
 </polymer-element>
+
+
 <polymer-element name="vm-ref" extends="service-ref">
-<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+<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;
+}
+
+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;
+}
+
+.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;
+}
+
+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-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);
+}
+</style>
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
 
 </polymer-element>
 
-
+<script src="main.dart.js"></script>
   <observatory-application devtools="true"></observatory-application>
 
-</body></html>
\ No newline at end of file
+<script src="index_devtools.html_bootstrap.dart.js"></script></body></html>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
index ed9c8d4..f3c3c8e 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
@@ -53,7 +53,7 @@
 init()
 $=I.p
 var $$={}
-;init.mangledNames={gAb:"__$lineMode",gAn:"_fragmentationData",gAp:"__$library",gAu:"__$cls",gB3:"__$trace",gBC:"profileTrieRoot",gBJ:"__$tagSelector",gBW:"__$msg",gBs:"__$lines",gCO:"_oldPieChart",gDD:"classes",gDe:"__$function",gDu:"exclusiveTicks",gE1:"__$counters",gFZ:"__$coverage",gFm:"machine",gFs:"__$isDart",gGQ:"_newPieDataTable",gGV:"__$expanded",gGe:"_colorToClassId",gH:"node",gHJ:"__$showCoverage",gHX:"__$displayValue",gHm:"tree",gHq:"__$label",gHu:"__$busy",gID:"__$vm",gIK:"__$checkedText",gIu:"__$qualifiedName",gJ0:"_newPieChart",gJJ:"imports",gJo:"__$last",gKM:"$",gKO:"tryIndex",gKU:"__$link",gKW:"__$label",gL4:"human",gLE:"timers",gLH:"tipTime",gLR:"deoptId",gLn:"__$callback",gM5:"__$sampleDepth",gMb:"endAddress",gMz:"__$pad",gNT:"__$refreshTime",gNo:"__$uncheckedText",gOZ:"__$map",gOc:"_oldPieDataTable",gOe:"__$app",gOh:"__$fragmentation",gOl:"__$profile",gOm:"__$cls",gOo:"addressTicks",gP:"value",gPA:"__$status",gPe:"__$internal",gPw:"__$isolate",gPy:"__$error",gQV:"__$script",gRd:"line",gRu:"__$kind",gSB:"__$active",gSF:"root",gSw:"lines",gTS:"__$busy",gUL:"_classIdToName",gUy:"_collapsed",gUz:"__$script",gV4:"__$anchor",gVF:"tokenPos",gVS:"callers",gVh:"tipTicks",gX7:"__$mapAsString",gXR:"scripts",gXX:"displayThreshold",gXc:"__$exception",gXh:"__$instance",gXv:"__$sampleRate",gXx:"__$code",gYu:"address",gZ3:"variables",gZ6:"locationManager",gZn:"tipKind",ga:"a",ga1:"__$library",ga3:"__$text",ga4:"text",gb:"b",gbY:"__$callback",gci:"callees",gdB:"__$callback",gdW:"_pageHeight",ge6:"tagProfileChart",geH:"__$sampleCount",gfF:"inclusiveTicks",gfY:"kind",gfi:"__$busy",ghX:"__$endPos",ghi:"_fragmentationCanvas",giF:"chart",gik:"__$displayCutoff",giy:"__$isolate",gjA:"__$error",gjJ:"__$pos",gjS:"__$timeSpan",gjv:"__$expr",gk5:"__$devtools",gkF:"__$checked",gkW:"__$app",gki:"tipExclusive",glc:"__$error",glh:"__$qualified",gmC:"__$object",gmu:"functions",gnc:"__$classTable",gnx:"__$callback",goH:"columns",goM:"__$expand",goY:"__$isolate",goy:"__$result",gpD:"__$profile",gqO:"_id",gqe:"__$hasParent",grM:"_classIdToColor",grU:"__$callback",grd:"__$frame",gt7:"__$pos",gtY:"__$ref",gts:"_updateTimer",gu9:"hits",guH:"descriptors",gvH:"index",gva:"instructions",gvg:"startAddress",gvs:"tipParent",gvt:"__$field",gwd:"children",gy4:"__$results",gyt:"depth",gzU:"rows",gzf:"vm",gzg:"__$hasClass",gzh:"__$iconClass",gzt:"__$hideTagsChecked"};init.mangledGlobalNames={B6:"MICROSECONDS_PER_SECOND",BO:"ALLOCATED_BEFORE_GC",DI:"_closeIconClass",DY2:"ACCUMULATED_SIZE",JP:"hitStyleExecuted",RD:"_pageSeparationColor",SoT:"_PAGE_SEPARATION_HEIGHT",V1g:"LIVE_AFTER_GC_SIZE",Vl:"_openIconClass",VnP:"hitStyleNotExecuted",bN:"hitStyleNone",bQj:"ALLOCATED_BEFORE_GC_SIZE",nK:"_freeColor",pC:"ACCUMULATED",qEV:"ALLOCATED_SINCE_GC_SIZE",r1K:"ALLOCATED_SINCE_GC",xK:"LIVE_AFTER_GC"};(function(a){"use strict"
+;(function(a){"use strict"
 function map(b){b={x:b}
 delete b.x
 return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
@@ -100,7 +100,7 @@
 var a5=(a3&1)===1
 var a6=b+a4!=g[0].length
 var a7=b4[2]
-var a8=3*a4+2*b+3
+var a8=2*a4+b+3
 var a9=b4.length>a8
 if(d){h=tearOff(g,b4,b6,b5,a6)
 b3[b5].$getter=h
@@ -154,9 +154,9 @@
 HT:{
 "^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
 "^":"",
-x:[function(a){return void 0},"$1","Ue",2,0,null,6,[]],
-Qu:[function(a,b,c,d){return{i:a,p:b,e:c,x:d}},"$4","yC",8,0,null,7,[],8,[],9,[],10,[]],
-ks:[function(a){var z,y,x,w
+x:function(a){return void 0},
+Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
+m0: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
@@ -166,79 +166,80 @@
 if(y===x)return z.i
 if(z.e===x)throw H.b(P.SY("Return interceptor for "+H.d(y(a,z))))}w=H.w3(a)
 if(w==null){y=Object.getPrototypeOf(a)
-if(y==null||y===Object.prototype)return C.ZQ
-else return C.vB}return w},"$1","mz",2,0,null,6,[]],
-e1:[function(a){var z,y,x,w
+if(y==null||y===Object.prototype)return C.Sx
+else return C.vB}return w},
+TZ:function(a){var z,y,x,w
 z=$.Au
 if(z==null)return
 y=z
 for(z=y.length,x=J.x(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
-if(x.n(a,y[w]))return w}return},"$1","kC",2,0,null,11,[]],
-Xr:[function(a){var z,y,x
-z=J.e1(a)
+if(x.n(a,y[w]))return w}return},
+Xr:function(a){var z,y,x
+z=J.TZ(a)
 if(z==null)return
 y=$.Au
 x=z+1
 if(x>=y.length)return H.e(y,x)
-return y[x]},"$1","Tj",2,0,null,11,[]],
-Nq:[function(a,b){var z,y,x
-z=J.e1(a)
+return y[x]},
+Nq:function(a,b){var z,y,x
+z=J.TZ(a)
 if(z==null)return
 y=$.Au
 x=z+2
 if(x>=y.length)return H.e(y,x)
-return y[x][b]},"$2","BJ",4,0,null,11,[],12,[]],
+return y[x][b]},
 Gv:{
 "^":"a;",
 n:function(a,b){return a===b},
 giO:function(a){return H.eQ(a)},
 bu:function(a){return H.a5(a)},
-T:function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},
+T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,45],
 gbx:function(a){return new H.cu(H.dJ(a),null)},
 "%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
-kn:{
-"^":"bool/Gv;",
+yEe:{
+"^":"Gv;",
 bu:function(a){return String(a)},
 giO:function(a){return a?519018:218159},
-gbx:function(a){return C.HL},
-$isbool:true},
+gbx:function(a){return C.BQ},
+$isa2:true},
 Jh:{
-"^":"Null/Gv;",
+"^":"Gv;",
 n:function(a,b){return null==b},
 bu:function(a){return"null"},
 giO:function(a){return 0},
-gbx:function(a){return C.Qf}},
-Ue1:{
+gbx:function(a){return C.GX},
+T:[function(a,b){return J.Gv.prototype.T.call(this,a,b)},"$1","gxK",2,0,null,45]},
+QI:{
 "^":"Gv;",
 giO:function(a){return 0},
 gbx:function(a){return C.CS}},
-FP:{
-"^":"Ue1;"},
-is:{
-"^":"Ue1;"},
+iC:{
+"^":"QI;"},
+zH:{
+"^":"QI;"},
 Q:{
-"^":"List/Gv;",
+"^":"Gv;",
 h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
 a.push(b)},
-KI:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
+W4:function(a,b){if(b<0||b>=a.length)throw H.b(P.N(b))
 if(!!a.fixed$length)H.vh(P.f("removeAt"))
 return a.splice(b,1)[0]},
-xe:function(a,b,c){if(b<0||b>a.length)throw H.b(P.N(b))
+aP:function(a,b,c){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.de(a[z],b)){a.splice(z,1)
+for(z=0;z<a.length;++z)if(J.xC(a[z],b)){a.splice(z,1)
 return!0}return!1},
 ev:function(a,b){return H.VM(new H.U5(a,b),[null])},
-Ft:[function(a,b){return H.VM(new H.kV(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},128,[]],
+Ft:[function(a,b){return H.VM(new H.zs(a,b),[null,null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"Gb",ret:P.cX,args:[{func:"hT",ret:P.cX,args:[a]}]}},this.$receiver,"Q")},46],
 FV:function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(a,z.gl())},
+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.IG(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},128,[]],
+ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQ",ret:P.cX,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},46],
 zV:function(a,b){var z,y,x,w
 z=a.length
 y=Array(z)
@@ -246,18 +247,15 @@
 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.q9(a,b,null,null)},
+eR:function(a,b){return H.j5(a,b,null,null)},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-D6:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
-if(c==null)c=a.length
-else{if(typeof c!=="number"||Math.floor(c)!==c)throw H.b(P.u(c))
-if(c<b||c>a.length)throw H.b(P.TE(c,b,a.length))}if(b===c)return H.VM([],[H.Kp(a,0)])
+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.Kp(a,0)])
 return H.VM(a.slice(b,c),[H.Kp(a,0)])},
-Jk:function(a,b){return this.D6(a,b,null)},
-Mu:function(a,b,c){H.K0(a,b,c)
-return H.q9(a,b,c,null)},
+Mu:function(a,b,c){H.xF(a,b,c)
+return H.j5(a,b,c,null)},
 gtH:function(a){if(a.length>0)return a[0]
 throw H.b(P.w("No elements"))},
 grZ:function(a){var z=a.length
@@ -271,22 +269,20 @@
 y=J.Wx(c)
 if(y.C(c,b)||y.D(c,z))throw H.b(P.TE(c,b,z))
 if(typeof c!=="number")return H.s(c)
-H.tb(a,c,a,b,z-c)
+H.Gj(a,c,a,b,z-c)
 if(typeof b!=="number")return H.s(b)
 this.sB(a,z-(c-b))},
-YW:function(a,b,c,d,e){if(!!a.immutable$list)H.vh(P.f("set range"))
-H.qG(a,b,c,d,e)},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 Vr:function(a,b){return H.Ck(a,b)},
-GT:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
-H.rd(a,b)},
-np:function(a){return this.GT(a,null)},
+XP:function(a,b){if(!!a.immutable$list)H.vh(P.f("sort"))
+if(b==null)b=P.n4()
+H.ZE(a,0,a.length-1,b)},
+Jd:function(a){return this.XP(a,null)},
 XU:function(a,b,c){return H.TK(a,b,c,a.length)},
 u8: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)},
 tg:function(a,b){var z
-for(z=0;z<a.length;++z)if(J.de(a[z],b))return!0
+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},
@@ -311,27 +307,14 @@
 if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
 a[b]=c},
-$isList:true,
-$isList:true,
+$isQ:true,
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null,
-static:{Qi: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}}},
-nM:{
-"^":"Q;",
-$isnM:true},
-iY:{
-"^":"nM;"},
-H6:{
-"^":"nM;",
-$isH6:true},
+$iscX:true,
+$ascX:null},
 P:{
-"^":"num/Gv;",
+"^":"Gv;",
 iM:function(a,b){var z
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a<b)return-1
@@ -352,7 +335,7 @@
 HG:function(a){return this.yu(this.UD(a))},
 UD:function(a){if(a<0)return-Math.round(-a)
 else return Math.round(a)},
-yM:function(a,b){var z
+Sy:function(a,b){var z
 if(b>20)throw H.b(P.C3(b))
 z=a.toFixed(b)
 if(a===0&&this.gzP(a))return"-"+z
@@ -384,7 +367,7 @@
 cU: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},
-W4:function(a,b){return b>31?0:a<<b>>>0},
+KI: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
@@ -406,27 +389,22 @@
 return a<=b},
 F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
 return a>=b},
-$isnum:true,
-static:{"^":"SAz,N6l"}},
-bU:{
-"^":"int/P;",
+gbx:function(a){return C.yT},
+$isFK:true,
+static:{"^":"Ng,N6l"}},
+L7:{
+"^":"P;",
 gbx:function(a){return C.yw},
-$isdouble:true,
-$isnum:true,
-$isint:true},
+$isCP:true,
+$isFK:true,
+$isKN:true},
 Pp:{
-"^":"double/P;",
-gbx:function(a){return C.O4},
-$isdouble:true,
-$isnum:true},
-x1:{
-"^":"bU;"},
-VP:{
-"^":"x1;"},
-qa:{
-"^":"VP;"},
+"^":"P;",
+gbx:function(a){return C.CR},
+$isCP:true,
+$isFK:true},
 O:{
-"^":"String/Gv;",
+"^":"Gv;",
 j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b<0)throw H.b(P.N(b))
 if(b>=a.length)throw H.b(P.N(b))
@@ -451,21 +429,23 @@
 if(z>y)return!1
 return b===this.yn(a,y-z)},
 h8:function(a,b,c){return H.ys(a,b,c)},
-Fr:function(a,b){return a.split(b)},
-Qi:function(a,b,c){var z
+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 throw H.b("String.split(Pattern) UNIMPLEMENTED")},
+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.Qi(a,b,0)},
-Nj:function(a,b,c){var z
-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){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))
-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.z8(c,a.length))throw H.b(P.N(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))
 return a.substring(b,c)},
 yn:function(a,b){return this.Nj(a,b,null)},
 hc:function(a){return a.toLowerCase()},
@@ -483,7 +463,7 @@
 if(typeof b!=="number")return H.s(b)
 if(0>=b)return""
 if(b===1||a.length===0)return a
-if(b!==b>>>0)throw H.b(C.IU)
+if(b!==b>>>0)throw H.b(C.Eq)
 for(z=a,y="";!0;){if((b&1)===1)y=z+y
 b=b>>>1
 if(b===0)break
@@ -497,13 +477,12 @@
 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
 return-1},
 u8:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){var z,y,x
+Pk:function(a,b,c){var z,y
 c=a.length
-if(typeof b==="string"){z=b.length
+z=b.length
 y=a.length
 if(c+z>y)c=y-z
-return a.lastIndexOf(b,c)}for(z=J.rY(b),x=c;x>=0;--x)if(z.wL(b,a,x)!=null)return x
-return-1},
+return a.lastIndexOf(b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
 Is: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))
@@ -528,23 +507,23 @@
 t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
 if(b>=a.length||b<0)throw H.b(P.N(b))
 return a[b]},
-$isString:true,
-static:{Ga:[function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
+$isqU:true,
+static:{Ga:function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
 default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
-default:return!1}},"$1","BD",2,0,null,13,[]],mm:[function(a,b){var z,y
+default:return!1}},mm:function(a,b){var z,y
 for(z=a.length;b<z;){if(b>=z)H.vh(P.N(b))
 y=a.charCodeAt(b)
-if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},"$2","ut",4,0,null,14,[],15,[]],r9:[function(a,b){var z,y,x
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},r9:function(a,b){var z,y,x
 for(z=a.length;b>0;b=y){y=b-1
 if(y>=z)H.vh(P.N(y))
 x=a.charCodeAt(y)
-if(x!==32&&x!==13&&!J.Ga(x))break}return b},"$2","pc",4,0,null,14,[],15,[]]}}}],["_isolate_helper","dart:_isolate_helper",,H,{
+if(x!==32&&x!==13&&!J.Ga(x))break}return b}}}}],["_isolate_helper","dart:_isolate_helper",,H,{
 "^":"",
-zd:[function(a,b){var z=a.vV(0,b)
+zd:function(a,b){var z=a.vV(0,b)
 init.globalState.Xz.bL()
-return z},"$2","RTQ",4,0,null,16,[],17,[]],
-ox:[function(){--init.globalState.Xz.GL},"$0","q4",0,0,null],
-oT:[function(a,b){var z,y,x,w,v,u
+return z},
+cv:function(){--init.globalState.Xz.GL},
+wW:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=b
 b=b
@@ -552,40 +531,40 @@
 if(b==null){b=[]
 z.a=b
 y=b}else y=b
-if(!J.x(y).$isList)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
+if(!J.x(y).$isWO)throw H.b(P.u("Arguments to main must be a List: "+H.d(y)))
 y=new H.f0(0,0,1,null,null,null,null,null,null,null,null,null,a)
 y.i6(a)
 init.globalState=y
 if(init.globalState.EF===!0)return
 y=init.globalState.Hg++
-x=P.L5(null,null,null,J.bU,H.yo)
-w=P.Ls(null,null,null,J.bU)
-v=new H.yo(0,null,!1)
-u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
+x=P.L5(null,null,null,P.KN,H.zL)
+w=P.Ls(null,null,null,P.KN)
+v=new H.zL(0,null,!1)
+u=new H.aX(y,x,w,new I(),v,P.Jz(),P.Jz(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 w.h(0,0)
-u.aU(0,v)
-init.globalState.Nr=u
+u.O9(0,v)
+init.globalState.yc=u
 init.globalState.N0=u
-y=H.N7()
+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)
 if(y)u.vV(0,new H.JO(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},"$2","wr",4,0,null,18,[],19,[]],
-yl:[function(){var z=init.currentScript
+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 system=="function")return thisFilename()
 if(init.globalState.EF===!0)return H.fU()
-return},"$0","dY",0,0,null],
-fU:[function(){var z,y
+return},
+fU:function(){var z,y
 z=new Error().stack
 if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
 if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
 if(y!=null)return y[1]
 y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
 if(y!=null)return y[1]
-throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},"$0","mZ",0,0,null],
+throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
 Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
 z=H.Hh(b.data)
 y=J.U6(z)
@@ -598,13 +577,13 @@
 s=y.t(z,"startPaused")
 r=H.Hh(y.t(z,"replyTo"))
 y=init.globalState.Hg++
-q=P.L5(null,null,null,J.bU,H.yo)
-p=P.Ls(null,null,null,J.bU)
-o=new H.yo(0,null,!1)
-n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,[],P.Ls(null,null,null,null),null,null,!1,!1)
+q=P.L5(null,null,null,P.KN,H.zL)
+p=P.Ls(null,null,null,P.KN)
+o=new H.zL(0,null,!1)
+n=new H.aX(y,q,p,new I(),o,P.Jz(),P.Jz(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
 p.h(0,0)
-n.aU(0,o)
-init.globalState.Xz.Rk.NZ(0,new H.IY(n,new H.jl(w,v,u,t,s,r),"worker-start"))
+n.O9(0,o)
+init.globalState.Xz.Rk.NZ(new H.IY(n,new H.mN(w,v,u,t,s,r),"worker-start"))
 init.globalState.N0=n
 init.globalState.Xz.bL()
 break
@@ -615,15 +594,15 @@
 l=y.t(z,"isSpawnUri")
 k=y.t(z,"startPaused")
 y=y.t(z,"replyPort")
-if(m==null)m=$.Ak()
+if(m==null)m=$.Rs()
 j=new Worker(m)
 j.onmessage=function(c,d){return function(e){c(d,e)}}(H.Mg,j)
-i=init.globalState.hJ++
+i=init.globalState.Y7++
 $.p6().u(0,j,i)
 init.globalState.XC.u(0,i,j)
-j.postMessage(H.Gy(P.EF(["command","start","id",i,"replyTo",H.Gy(y),"args",p,"msg",H.Gy(o),"isSpawnUri",l,"startPaused",k,"functionName",q],null,null)))
+j.postMessage(H.t0(P.EF(["command","start","id",i,"replyTo",H.t0(y),"args",p,"msg",H.t0(o),"isSpawnUri",l,"startPaused",k,"functionName",q],null,null)))
 break
-case"message":if(y.t(z,"port")!=null)J.Sq(y.t(z,"port"),y.t(z,"msg"))
+case"message":if(y.t(z,"port")!=null)J.m9(y.t(z,"port"),y.t(z,"msg"))
 init.globalState.Xz.bL()
 break
 case"close":init.globalState.XC.Rz(0,$.p6().t(0,a))
@@ -633,77 +612,80 @@
 case"log":H.ZF(y.t(z,"msg"))
 break
 case"print":if(init.globalState.EF===!0){y=init.globalState.vd
-q=H.Gy(P.EF(["command","print","msg",z],null,null))
+q=H.t0(P.EF(["command","print","msg",z],null,null))
 y.toString
-self.postMessage(q)}else P.JS(y.t(z,"msg"))
+self.postMessage(q)}else P.mp(y.t(z,"msg"))
 break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,20,[],21,[]],
-ZF:[function(a){var z,y,x,w
+case"error":throw H.b(y.t(z,"msg"))}},"$2","NB",4,0,null,0,1],
+ZF:function(a){var z,y,x,w
 if(init.globalState.EF===!0){y=init.globalState.vd
-x=H.Gy(P.EF(["command","log","msg",a],null,null))
+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)
-throw H.b(P.FM(z))}},"$1","eR",2,0,null,22,[]],
-Ws:[function(a,b,c,d,e,f){var z,y,x,w
+z=new H.oP(w,null)
+throw H.b(P.FM(z))}},
+Di:function(a,b,c,d,e,f){var z,y,x,w
 z=init.globalState.N0
 y=z.jO
-$.te=$.te+("_"+y)
+$.z7=$.z7+("_"+y)
 $.eb=$.eb+("_"+y)
 y=z.EE
 x=init.globalState.N0.jO
-w=z.Qy
-J.Sq(f,["spawned",new H.Z6(y,x),w,z.PX])
-x=new H.Vg(a,b,c,d)
-if(e===!0){z.v8(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},"$6","op",12,0,null,23,[],19,[],24,[],25,[],26,[],27,[]],
-Gy:[function(a){var z
-if(init.globalState.ji===!0){z=new H.NA(0,new H.X1())
-z.il=new H.fP(null)
-return z.h7(a)}else{z=new H.NO(new H.X1())
-z.il=new H.fP(null)
-return z.h7(a)}},"$1","YH",2,0,null,24,[]],
-Hh:[function(a){if(init.globalState.ji===!0)return new H.II(null).QS(a)
-else return a},"$1","m6",2,0,null,24,[]],
-VO:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","lF",2,0,null,28,[]],
-ZR:[function(a){return a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean"},"$1","dD",2,0,null,28,[]],
+w=z.um
+J.m9(f,["spawned",new H.Ze(y,x),w,z.PX])
+x=new H.vK(a,b,c,d,z)
+if(e===!0){z.V0(w,w)
+init.globalState.Xz.Rk.NZ(new H.IY(z,x,"start isolate"))}else x.$0()},
+t0:function(a){var z
+if(init.globalState.ji===!0){z=new H.RS(0,new H.cx())
+z.mR=new H.aJ(null)
+return z.Zo(a)}else{z=new H.Qt(new H.cx())
+z.mR=new H.aJ(null)
+return z.Zo(a)}},
+Hh:function(a){if(init.globalState.ji===!0)return new H.EU(null).ug(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:{
-"^":"Tp:115;a,b",
-$0:[function(){this.b.$1(this.a.a)},"$0",null,0,0,null,"call"],
+"^":"Xs:47;a,b",
+$0:function(){this.b.$1(this.a.a)},
 $isEH:true},
 JO:{
-"^":"Tp:115;a,c",
-$0:[function(){this.c.$2(this.a.a,null)},"$0",null,0,0,null,"call"],
+"^":"Xs:47;a,c",
+$0:function(){this.c.$2(this.a.a,null)},
 $isEH:true},
 f0:{
-"^":"a;Hg,oL,hJ,N0,Nr,Xz,vu,EF,ji,i2<,vd,XC,w2<",
+"^":"a;Hg,oL,Y7,N0,yc,Xz,Ai,EF,ji,i2<,vd,XC,w2<",
 i6:function(a){var z,y,x,w
-z=$.C5()==null
-y=$.Nl()
+z=$.My()==null
+y=$.nB()
 x=z&&$.JU()===!0
 this.EF=x
-if(!x)y=y!=null&&$.Ak()!=null
+if(!x)y=y!=null&&$.Rs()!=null
 else y=!0
 this.ji=y
-this.vu=z&&!x
-this.Xz=new H.cC(P.NZ(null,H.IY),0)
-this.i2=P.L5(null,null,null,J.bU,H.aX)
-this.XC=P.L5(null,null,null,J.bU,null)
+this.Ai=z&&!x
+y=H.IY
+x=H.VM(new P.Sw(null,0,0,0),[y])
+x.Eo(null,y)
+this.Xz=new H.cC(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.JH()
 this.vd=z
 w=function(b,c){return function(d){b(c,d)}}(H.Mg,z)
 $.jk().onmessage=w
 $.jk().dartPrint=function(b){}}}},
 aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,Qy,PX,RW<,C9<,lJ,Jp,mR,mf,pa",
-v8:function(a,b){if(!this.Qy.n(0,a))return
-if(this.lJ.h(0,b)&&!this.RW)this.RW=!0
+"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,Vp<,lJ,CN,M2,mf,pa,ir",
+V0:function(a,b){if(!this.um.n(0,a))return
+if(this.lJ.h(0,b)&&!this.UF)this.UF=!0
 this.PC()},
 NR:function(a){var z,y,x,w,v,u
-if(!this.RW)return
+if(!this.UF)return
 z=this.lJ
 z.Rz(0,a)
-if(z.X5===0){for(z=this.C9;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
+if(z.X5===0){for(z=this.Vp;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
 x=z.pop()
 y=init.globalState.Xz.Rk
 w=y.av
@@ -713,328 +695,348 @@
 y.av=w
 if(w<0||w>=u)return H.e(v,w)
 v[w]=x
-if(w===y.eZ)y.VW();++y.qT}this.RW=!1}this.PC()},
-iK:function(a){var z=this.Jp
+if(w===y.eZ)y.M9();++y.qT}this.UF=!1}this.PC()},
+uS:function(a){var z=this.CN
 if(z==null){z=[]
-this.Jp=z}if(J.kE(z,a))return
-this.Jp.push(a)},
-Hh:function(a){var z=this.Jp
+this.CN=z}if(J.x5(z,a))return
+this.CN.push(a)},
+IB:function(a){var z=this.CN
 if(z==null)return
-J.V1(z,a)},
+J.Dq(z,a)},
 MZ:function(a,b){if(!this.PX.n(0,a))return
 this.pa=b},
 Wq:function(a,b){var z,y
 z=J.x(b)
 if(!z.n(b,0))y=z.n(b,1)&&!this.mf
 else y=!0
-if(y){J.Sq(a,null)
+if(y){J.m9(a,null)
 return}y=new H.NY(a)
-if(z.n(b,2)){init.globalState.Xz.Rk.NZ(0,new H.IY(this,y,"ping"))
-return}z=this.mR
-if(z==null){z=P.NZ(null,null)
-this.mR=z}z.NZ(0,y)},
+if(z.n(b,2)){init.globalState.Xz.Rk.NZ(new H.IY(this,y,"ping"))
+return}z=this.M2
+if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
+z.Eo(null,null)
+this.M2=z}z.NZ(y)},
 bc: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.mf
 else y=!0
-if(y){this.Pb()
+if(y){this.Dm()
 return}if(z.n(b,2)){z=init.globalState.Xz
 y=this.gQb()
-z.Rk.NZ(0,new H.IY(this,y,"kill"))
-return}z=this.mR
-if(z==null){z=P.NZ(null,null)
-this.mR=z}z.NZ(0,this.gQb())},
-vV:function(a,b){var z,y,x
+z.Rk.NZ(new H.IY(this,y,"kill"))
+return}z=this.M2
+if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
+z.Eo(null,null)
+this.M2=z}z.NZ(this.gQb())},
+hk:function(a,b){var z,y
+z=this.ir
+if(z.X5===0){if(this.pa===!0&&this===init.globalState.yc)return
+z=$.jk()
+if(z.console!=null&&typeof z.console.error=="function")z.console.error(a,b)
+else{P.mp(a)
+if(b!=null)P.mp(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.m9(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.mf=!0
-try{y=b.$0()}finally{this.mf=!1
+try{y=b.$0()}catch(v){u=H.Ru(v)
+x=u
+w=new H.oP(v,null)
+this.hk(x,w)
+if(this.pa===!0){this.Dm()
+if(this===init.globalState.yc)throw v}}finally{this.mf=!1
 init.globalState.N0=z
 if(z!=null)$=z.gEn()
-if(this.mR!=null)for(;x=this.mR,!x.gl0(x);)this.mR.AR().$0()}return y},
+if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZ2",2,0,48,49],
 Ds:function(a){var z=J.U6(a)
-switch(z.t(a,0)){case"pause":this.v8(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.uS(z.t(a,1))
 break
-case"remove-ondone":this.Hh(z.t(a,1))
+case"remove-ondone":this.IB(z.t(a,1))
 break
 case"set-errors-fatal":this.MZ(z.t(a,1),z.t(a,2))
 break
 case"ping":this.Wq(z.t(a,1),z.t(a,2))
 break
 case"kill":this.bc(z.t(a,1),z.t(a,2))
+break
+case"getErrors":this.ir.h(0,z.t(a,1))
+break
+case"stopErrors":this.ir.Rz(0,z.t(a,1))
 break}},
-hV:function(a){return this.Gx.t(0,a)},
-aU:function(a,b){var z=this.Gx
+iQ:function(a){return this.Gx.t(0,a)},
+O9:function(a,b){var z=this.Gx
 if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
 z.u(0,a,b)},
-PC:function(){if(this.Gx.X5-this.fW.X5>0||this.RW)init.globalState.i2.u(0,this.jO,this)
-else this.Pb()},
-Pb:[function(){var z,y
-z=this.mR
+PC:function(){if(this.Gx.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
 if(z!=null)z.V1(0)
-for(z=this.Gx,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ro()
+for(z=this.Gx,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.pr()
 z.V1(0)
 this.fW.V1(0)
 init.globalState.i2.Rz(0,this.jO)
-z=this.Jp
-if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Sq(z.lo,null)
-this.Jp=null}},"$0","gQb",0,0,126],
+this.ir.V1(0)
+z=this.CN
+if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.m9(z.lo,null)
+this.CN=null}},"$0","gQb",0,0,13],
 $isaX:true},
 NY:{
-"^":"Tp:126;a",
-$0:[function(){J.Sq(this.a,null)},"$0",null,0,0,null,"call"],
+"^":"Xs:13;a",
+$0:[function(){J.m9(this.a,null)},"$0",null,0,0,null,"call"],
 $isEH:true},
 cC:{
 "^":"a;Rk,GL",
-Jc:function(){var z=this.Rk
+mj:function(){var z=this.Rk
 if(z.av===z.eZ)return
 return z.AR()},
 xB:function(){var z,y,x
-z=this.Jc()
-if(z==null){if(init.globalState.Nr!=null&&init.globalState.i2.x4(init.globalState.Nr.jO)&&init.globalState.vu===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
+z=this.mj()
+if(z==null){if(init.globalState.yc!=null&&init.globalState.i2.x4(init.globalState.yc.jO)&&init.globalState.Ai===!0&&init.globalState.yc.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
 y=init.globalState
 if(y.EF===!0&&y.i2.X5===0&&y.Xz.GL===0){y=y.vd
-x=H.Gy(P.EF(["command","close"],null,null))
+x=H.t0(P.EF(["command","close"],null,null))
 y.toString
-self.postMessage(x)}return!1}z.VU()
+self.postMessage(x)}return!1}z.Fn()
 return!0},
-oV:function(){if($.C5()!=null)new H.RA(this).$0()
+Wu:function(){if($.My()!=null)new H.QB(this).$0()
 else for(;this.xB(););},
 bL:function(){var z,y,x,w,v
-if(init.globalState.EF!==!0)this.oV()
-else try{this.oV()}catch(x){w=H.Ru(x)
+if(init.globalState.EF!==!0)this.Wu()
+else try{this.Wu()}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 w=init.globalState.vd
-v=H.Gy(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
+v=H.t0(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
 w.toString
 self.postMessage(v)}}},
-RA:{
-"^":"Tp:126;a",
+QB:{
+"^":"Xs:13;a",
 $0:[function(){if(!this.a.xB())return
-P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
+P.ww(C.RT,this)},"$0",null,0,0,null,"call"],
 $isEH:true},
 IY:{
-"^":"a;F1*,i3,G1*",
-VU:function(){if(this.F1.gRW()){this.F1.gC9().push(this)
-return}J.yn(this.F1,this.i3)},
+"^":"a;od*,i3,G1>",
+Fn:function(){if(this.od.gUF()){this.od.gVp().push(this)
+return}J.Ok(this.od,this.i3)},
 $isIY:true},
 JH:{
 "^":"a;"},
-jl:{
-"^":"Tp:115;a,b,c,d,e,f",
-$0:[function(){H.Ws(this.a,this.b,this.c,this.d,this.e,this.f)},"$0",null,0,0,null,"call"],
+mN:{
+"^":"Xs:47;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},
-Vg:{
-"^":"Tp:126;a,b,c,d",
+vK:{
+"^":"Xs:13;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.N7()
+y=H.G3()
 x=H.KT(y,[y,y]).BD(z)
 if(x)z.$2(this.b,this.c)
 else{y=H.KT(y,[y]).BD(z)
 if(y)z.$1(this.b)
 else z.$0()}}},"$0",null,0,0,null,"call"],
 $isEH:true},
-Iy4:{
+AY:{
 "^":"a;",
-$isbC:true,
+$isRZ:true,
 $ishq:true},
-Z6:{
-"^":"Iy4;JE,Jz",
-zY:function(a,b){var z,y,x,w,v
+Ze:{
+"^":"AY;JE,tv",
+wR:function(a,b){var z,y,x,w,v
 z={}
-y=this.Jz
+y=this.tv
 x=init.globalState.i2.t(0,y)
 if(x==null)return
 w=this.JE
 if(w.gP0())return
 v=init.globalState.N0!=null&&init.globalState.N0.jO!==y
 z.a=b
-if(v)z.a=H.Gy(b)
+if(v)z.a=H.t0(b)
 if(x.gEE()===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.NZ(new H.IY(x,new H.Ua(z,this,v),w))},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isZ6&&J.de(this.JE,b.JE)},
-giO:function(a){return J.td(this.JE)},
-$isZ6:true,
-$isbC:true,
+return!!J.x(b).$isZe&&J.xC(this.JE,b.JE)},
+giO:function(a){return J.Mo(this.JE)},
+$isZe:true,
+$isRZ:true,
 $ishq:true},
 Ua:{
-"^":"Tp:115;a,b,c",
+"^":"Xs:47;a,b,c",
 $0:[function(){var z,y
 z=this.b.JE
 if(!z.gP0()){if(this.c){y=this.a
-y.a=H.Hh(y.a)}J.t8(z,this.a.a)}},"$0",null,0,0,null,"call"],
+y.a=H.Hh(y.a)}z.Rf(this.a.a)}},"$0",null,0,0,null,"call"],
 $isEH:true},
-ns:{
-"^":"Iy4;hQ,bv,Jz",
-zY:function(a,b){var z,y
-z=H.Gy(P.EF(["command","message","port",this,"msg",b],null,null))
+dd:{
+"^":"AY;ZU,bv,tv",
+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.vd.toString
-self.postMessage(z)}else{y=init.globalState.XC.t(0,this.hQ)
+self.postMessage(z)}else{y=init.globalState.XC.t(0,this.ZU)
 if(y!=null)y.postMessage(z)}},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isns&&J.de(this.hQ,b.hQ)&&J.de(this.Jz,b.Jz)&&J.de(this.bv,b.bv)},
+return!!J.x(b).$isdd&&J.xC(this.ZU,b.ZU)&&J.xC(this.tv,b.tv)&&J.xC(this.bv,b.bv)},
 giO:function(a){var z,y,x
-z=J.Eh(this.hQ,16)
-y=J.Eh(this.Jz,8)
+z=J.Eh(this.ZU,16)
+y=J.Eh(this.tv,8)
 x=this.bv
 if(typeof x!=="number")return H.s(x)
 return(z^y^x)>>>0},
-$isns:true,
-$isbC:true,
+$isdd:true,
+$isRZ:true,
 $ishq:true},
-yo:{
-"^":"a;ng>,bd,P0<",
-wy:function(a){return this.bd.$1(a)},
-ro:function(){this.P0=!0
-this.bd=null},
-cO:function(a){var z,y
+zL:{
+"^":"a;x6>,D1,P0<",
+zd:function(a){return this.D1.$1(a)},
+pr:function(){this.P0=!0
+this.D1=null},
+S6:function(a){var z,y
 if(this.P0)return
 this.P0=!0
-this.bd=null
+this.D1=null
 z=init.globalState.N0
-y=this.ng
+y=this.x6
 z.Gx.Rz(0,y)
 z.fW.Rz(0,y)
 z.PC()},
-FL:function(a,b){if(this.P0)return
-this.wy(b)},
-$isyo:true,
+Rf:function(a){if(this.P0)return
+this.zd(a)},
+$iszL:true,
 static:{"^":"v0"}},
-NA:{
-"^":"Tf;CN,il",
-DE:function(a){if(!!a.$isZ6)return["sendport",init.globalState.oL,a.Jz,J.td(a.JE)]
-if(!!a.$isns)return["sendport",a.hQ,a.Jz,a.bv]
+RS:{
+"^":"Tf;Ao,mR",
+DE:function(a){if(!!a.$isZe)return["sendport",init.globalState.oL,a.tv,J.Mo(a.JE)]
+if(!!a.$isdd)return["sendport",a.ZU,a.tv,a.bv]
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isku)return["capability",a.ng]
+yf:function(a){if(!!a.$isiV)return["capability",a.x6]
 throw H.b("Capability not serializable: "+a.bu(0))}},
-NO:{
-"^":"Nt;il",
-DE:function(a){if(!!a.$isZ6)return new H.Z6(a.JE,a.Jz)
-if(!!a.$isns)return new H.ns(a.hQ,a.bv,a.Jz)
+Qt:{
+"^":"ooy;mR",
+DE:function(a){if(!!a.$isZe)return new H.Ze(a.JE,a.tv)
+if(!!a.$isdd)return new H.dd(a.ZU,a.bv,a.tv)
 throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isku)return new H.ku(a.ng)
+yf:function(a){if(!!a.$isiV)return new H.iV(a.x6)
 throw H.b("Capability not serializable: "+a.bu(0))}},
-II:{
-"^":"Xb;RZ",
+EU:{
+"^":"lY;RZ",
 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.de(y,init.globalState.oL)){v=init.globalState.i2.t(0,x)
+if(J.xC(y,init.globalState.oL)){v=init.globalState.i2.t(0,x)
 if(v==null)return
-u=v.hV(w)
+u=v.iQ(w)
 if(u==null)return
-return new H.Z6(u,x)}else return new H.ns(y,w,x)},
-Op:function(a){return new H.ku(J.UQ(a,1))}},
-fP:{
+return new H.Ze(u,x)}else return new H.dd(y,w,x)},
+Op:function(a){return new H.iV(J.UQ(a,1))}},
+aJ:{
 "^":"a;MD",
 t:function(a,b){return b.__MessageTraverser__attached_info__},
 u:function(a,b,c){this.MD.push(b)
 b.__MessageTraverser__attached_info__=c},
-Hn:function(a){this.MD=[]},
-Xq:function(){var z,y,x
+CH:function(a){this.MD=[]},
+no:function(){var z,y,x
 for(z=this.MD.length,y=0;y<z;++y){x=this.MD
 if(y>=x.length)return H.e(x,y)
 x[y].__MessageTraverser__attached_info__=null}this.MD=null}},
-X1:{
+cx:{
 "^":"a;",
 t:function(a,b){return},
 u:function(a,b,c){},
-Hn:function(a){},
-Xq:function(){}},
+CH:function(a){},
+no:function(){}},
 BB:{
 "^":"a;",
-h7:function(a){var z
-if(H.VO(a))return this.Pq(a)
-this.il.Hn(0)
+Zo:function(a){var z
+if(H.vM(a))return this.Pq(a)
+this.mR.CH(0)
 z=null
-try{z=this.I8(a)}finally{this.il.Xq()}return z},
+try{z=this.I8(a)}finally{this.mR.no()}return z},
 I8:function(a){var z
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
 z=J.x(a)
-if(!!z.$isList)return this.wb(a)
+if(!!z.$isWO)return this.wb(a)
 if(!!z.$isZ0)return this.TI(a)
-if(!!z.$isbC)return this.DE(a)
+if(!!z.$isRZ)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")}},
-Nt:{
+return this.N1(a)},
+N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
+ooy:{
 "^":"BB;",
 Pq:function(a){return a},
-wb:function(a){var z,y,x,w,v,u
-z=this.il.t(0,a)
+wb:function(a){var z,y,x,w
+z=this.mR.t(0,a)
 if(z!=null)return z
 y=J.U6(a)
 x=y.gB(a)
-if(typeof x!=="number")return H.s(x)
 z=Array(x)
 z.fixed$length=init
-this.il.u(0,a,z)
-for(w=z.length,v=0;v<x;++v){u=this.I8(y.t(a,v))
-if(v>=w)return H.e(z,v)
-z[v]=u}return z},
+this.mR.u(0,a,z)
+for(w=0;w<x;++w)z[w]=this.I8(y.t(a,w))
+return z},
 TI:function(a){var z,y
 z={}
-y=this.il.t(0,a)
+y=this.mR.t(0,a)
 z.a=y
 if(y!=null)return y
 y=P.L5(null,null,null,null,null)
 z.a=y
-this.il.u(0,a,y)
+this.mR.u(0,a,y)
 a.aN(0,new H.OW(z,this))
 return z.a},
 DE:function(a){return H.vh(P.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
 OW:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.I8(a),z.I8(b))},"$2",null,4,0,null,49,[],299,[],"call"],
+"^":"Xs:50;a,b",
+$2:function(a,b){var z=this.b
+J.kW(this.a.a,z.I8(a),z.I8(b))},
 $isEH:true},
 Tf:{
 "^":"BB;",
 Pq:function(a){return a},
 wb:function(a){var z,y
-z=this.il.t(0,a)
+z=this.mR.t(0,a)
 if(z!=null)return["ref",z]
-y=this.CN++
-this.il.u(0,a,y)
+y=this.Ao++
+this.mR.u(0,a,y)
 return["list",y,this.mE(a)]},
 TI:function(a){var z,y
-z=this.il.t(0,a)
+z=this.mR.t(0,a)
 if(z!=null)return["ref",z]
-y=this.CN++
-this.il.u(0,a,y)
+y=this.Ao++
+this.mR.u(0,a,y)
 return["map",y,this.mE(J.qA(a.gvc())),this.mE(J.qA(a.gUQ(a)))]},
 mE:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
 x=[]
 C.Nm.sB(x,y)
-if(typeof y!=="number")return H.s(y)
-w=0
-for(;w<y;++w){v=this.I8(z.t(a,w))
+for(w=0;w<y;++w){v=this.I8(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.SY(null))},
 yf:function(a){return H.vh(P.SY(null))}},
-Xb:{
+lY:{
 "^":"a;",
-QS:function(a){if(H.ZR(a))return a
-this.RZ=P.Py(null,null,null,null,null)
+ug:function(a){if(H.ZR(a))return a
+this.RZ=P.YM(null,null,null,null,null)
 return this.XE(a)},
 XE:function(a){var z,y
 if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
@@ -1042,7 +1044,7 @@
 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.tv(a)
+case"map":return this.en(a)
 case"sendport":return this.Vf(a)
 case"capability":return this.Op(a)
 default:return this.PR(a)}},
@@ -1057,7 +1059,7 @@
 v=0
 for(;v<w;++v)z.u(x,v,this.XE(z.t(x,v)))
 return x},
-tv:function(a){var z,y,x,w,v,u,t,s
+en: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)
@@ -1073,11 +1075,11 @@
 return z},
 PR:function(a){throw H.b("Unexpected serialized object")}},
 yH:{
-"^":"a;Kf,zu,p9",
+"^":"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
-H.ox()
-if(this.Kf)$.jk().clearTimeout(this.p9)
+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."))},
 Qa:function(a,b){var z,y
@@ -1086,28 +1088,28 @@
 if(z){this.p9=1
 z=init.globalState.Xz
 y=init.globalState.N0
-z.Rk.NZ(0,new H.IY(y,new H.FA(this,b),"timer"))
+z.Rk.NZ(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.Av(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))}},
+this.p9=z.setTimeout(H.tR(new H.Wl(this,b),0),a)}else throw H.b(P.f("Timer greater than 0."))}},
 static:{cy:function(a,b){var z=new H.yH(!0,!1,null)
 z.Qa(a,b)
 return z}}},
-FA:{
-"^":"Tp:126;a,b",
+Av:{
+"^":"Xs:13;a,b",
 $0:[function(){this.a.p9=null
 this.b.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
-Av:{
-"^":"Tp:126;c,d",
+Wl:{
+"^":"Xs:13;c,d",
 $0:[function(){this.c.p9=null
-H.ox()
+H.cv()
 this.d.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
-ku:{
-"^":"a;ng>",
+iV:{
+"^":"a;x6>",
 giO:function(a){var z,y,x
-z=this.ng
+z=this.x6
 y=J.Wx(z)
 x=y.m(z,0)
 y=y.Z(z,4294967296)
@@ -1120,30 +1122,29 @@
 n:function(a,b){var z,y
 if(b==null)return!1
 if(b===this)return!0
-if(!!J.x(b).$isku){z=this.ng
-y=b.ng
+if(!!J.x(b).$isiV){z=this.x6
+y=b.x6
 return z==null?y==null:z===y}return!1},
-$isku:true,
+$isiV:true,
 $ishq:true}}],["_js_helper","dart:_js_helper",,H,{
 "^":"",
-wV:[function(a,b){var z
+Gp:function(a,b){var z
 if(b!=null){z=b.x
-if(z!=null)return z}return!!J.x(a).$isXj},"$2","b3",4,0,null,6,[],29,[]],
-d:[function(a){var z
+if(z!=null)return z}return!!J.x(a).$isXj},
+d:function(a){var z
 if(typeof a==="string")return a
 if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
 else if(!1===a)return"false"
 else if(a==null)return"null"
 z=J.AG(a)
 if(typeof z!=="string")throw H.b(P.u(a))
-return z},"$1","Sa",2,0,null,30,[]],
-Hz:[function(a){throw H.b(P.f("Can't use '"+H.d(a)+"' in reflection because it is not included in a @MirrorsUsed annotation."))},"$1","c7",2,0,null,31,[]],
-eQ:[function(a){var z=a.$identityHash
+return z},
+eQ:function(a){var z=a.$identityHash
 if(z==null){z=Math.random()*0x3fffffff|0
-a.$identityHash=z}return z},"$1","Y0",2,0,null,6,[]],
-vx:[function(a){throw H.b(P.cD(a))},"$1","Rm",2,0,32,14,[]],
-BU:[function(a,b,c){var z,y,x,w,v,u
-if(c==null)c=H.Rm()
+a.$identityHash=z}return z},
+rd:[function(a){throw H.b(P.cD(a))},"$1","yY",2,0,2],
+BU:function(a,b,c){var z,y,x,w,v,u
+if(c==null)c=H.yY()
 if(typeof a!=="string")H.vh(P.u(a))
 z=/^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(a)
 if(b==null){if(z!=null){y=z.length
@@ -1151,8 +1152,7 @@
 if(z[2]!=null)return parseInt(a,16)
 if(3>=y)return H.e(z,3)
 if(z[3]!=null)return parseInt(a,10)
-return c.$1(a)}b=10}else{if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u("Radix is not an integer"))
-if(b<2||b>36)throw H.b(P.C3("Radix "+H.d(b)+" not in range 2..36"))
+return c.$1(a)}b=10}else{if(b<2||b>36)throw H.b(P.C3("Radix "+H.d(b)+" not in range 2..36"))
 if(z!=null){if(b===10){if(3>=z.length)return H.e(z,3)
 y=z[3]!=null}else y=!1
 if(y)return parseInt(a,10)
@@ -1168,48 +1168,48 @@
 if(!(v<u))break
 y.j(w,0)
 if(y.j(w,v)>x)return c.$1(a);++v}}}}if(z==null)return c.$1(a)
-return parseInt(a,b)},"$3","Yv",6,0,null,33,[],34,[],35,[]],
-IH:[function(a,b){var z,y
+return parseInt(a,b)},
+RR:function(a,b){var z,y
 if(typeof a!=="string")H.vh(P.u(a))
-if(b==null)b=H.Rm()
+if(b==null)b=H.yY()
 if(!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(a))return b.$1(a)
 z=parseFloat(a)
 if(isNaN(z)){y=J.rr(a)
 if(y==="NaN"||y==="+NaN"||y==="-NaN")return z
-return b.$1(a)}return z},"$2","inc",4,0,null,33,[],35,[]],
-lh:[function(a){var z,y
-z=C.AS(J.x(a))
+return b.$1(a)}return z},
+lh:function(a){var z,y
+z=C.w2(J.x(a))
 if(z==="Object"){y=String(a.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1]
 if(typeof y==="string")z=/^\w+$/.test(y)?y:z}if(z.length>1&&C.xB.j(z,0)===36)z=C.xB.yn(z,1)
-return z+H.ia(H.oX(a),0,null)},"$1","Ig",2,0,null,6,[]],
-a5:[function(a){return"Instance of '"+H.lh(a)+"'"},"$1","jb",2,0,null,6,[]],
-RF:[function(a){var z,y,x,w,v,u
+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)+"'"},
+Cb: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},"$1","JG",2,0,null,36,[]],
-YF:[function(a){var z,y,x
+v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},
+YF:function(a){var z,y,x
 z=[]
-z.$builtinTypeInfo=[J.bU]
+z.$builtinTypeInfo=[P.KN]
 y=new H.a7(a,a.length,0,null)
 y.$builtinTypeInfo=[H.Kp(a,0)]
 for(;y.G();){x=y.lo
 if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
 if(x<=65535)z.push(x)
 else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.RF(z)},"$1","nE",2,0,null,37,[]],
-eT:[function(a){var z,y
+z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.Cb(z)},
+eT:function(a){var z,y
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
 if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
 if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.YF(a)}return H.RF(a)},"$1","Wb",2,0,null,38,[]],
-Lw:[function(a){var z
+if(y>65535)return H.YF(a)}return H.Cb(a)},
+Lw:function(a){var z
 if(typeof a!=="number")return H.s(a)
 if(0<=a){if(a<=65535)return String.fromCharCode(a)
 if(a<=1114111){z=a-65536
-return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},"$1","cK",2,0,null,39,[]],
-zW:[function(a,b,c,d,e,f,g,h){var z,y,x,w
+return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
+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))
 if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
@@ -1223,23 +1223,23 @@
 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},"$8","mV",16,0,null,40,[],41,[],42,[],43,[],44,[],45,[],46,[],47,[]],
-o2:[function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},"$1","j1",2,0,null,48,[]],
-VK:[function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-return a[b]},"$2","Zl",4,0,null,6,[],49,[]],
-aw:[function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-a[b]=c},"$3","WJ",6,0,null,6,[],49,[],30,[]],
-zo:[function(a,b,c){var z,y,x
+return w.valueOf()}return y},
+o2:function(a){if(a.date===void 0)a.date=new Date(a.y3)
+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))
+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},
+zo:function(a,b,c){var z,y,x
 z={}
 z.a=0
 y=[]
 x=[]
 if(b!=null){z.a=b.length
 C.Nm.FV(y,b)}z.b=""
-if(c!=null&&!c.gl0(c))c.aN(0,new H.Cj(z,y,x))
-return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},"$3","pT",6,0,null,17,[],50,[],51,[]],
-im:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q
+if(c!=null&&!c.gl0(c))c.aN(0,new H.lk(z,y,x))
+return J.jf(a,new H.LI(C.Ka,"$"+z.a+z.b,0,y,x,null))},
+im:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z={}
 if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
 if(y==null)return H.zo(a,b,c)
@@ -1249,8 +1249,8 @@
 w=x.Rv
 if(w!==b.length)return H.zo(a,b,c)
 v=P.L5(null,null,null,null,null)
-for(u=x.hG,t=0;t<u;++t){s=t+w
-v.u(0,x.KE(s),init.metadata[x.Fk(s)])}z.a=!1
+for(u=x.Ee,t=0;t<u;++t){s=t+w
+v.u(0,x.QN(s),init.metadata[x.Fk(s)])}z.a=!1
 c.aN(0,new H.u8(z,v))
 if(z.a)return H.zo(a,b,c)
 C.Nm.FV(b,v.gUQ(v))
@@ -1259,33 +1259,21 @@
 C.Nm.FV(r,b)
 y=a["$"+q]
 if(y==null)return H.zo(a,b,c)
-return y.apply(a,r)},"$3","fl",6,0,null,17,[],50,[],51,[]],
-mN:[function(a){if(a=="String")return C.Kn
-if(a=="int")return C.c1
-if(a=="double")return C.yX
-if(a=="num")return C.oD
-if(a=="bool")return C.Fm
-if(a=="List")return C.E3
-if(a=="Null")return C.x0
-return init.allClasses[a]},"$1","JL",2,0,null,52,[]],
-SG:[function(a){return a===C.Kn||a===C.c1||a===C.yX||a===C.oD||a===C.Fm||a===C.E3||a===C.x0},"$1","EN",2,0,null,6,[]],
-Pq:[function(){var z={x:0}
-delete z.x
-return z},"$0","vg",0,0,null],
-s:[function(a){throw H.b(P.u(a))},"$1","Ff",2,0,null,53,[]],
-e:[function(a,b){if(a==null)J.q8(a)
+return y.apply(a,r)},
+s:function(a){throw H.b(P.u(a))},
+e:function(a,b){if(a==null)J.q8(a)
 if(typeof b!=="number"||Math.floor(b)!==b)H.s(b)
-throw H.b(P.N(b))},"$2","x3",4,0,null,48,[],15,[]],
-b:[function(a){var z
+throw H.b(P.N(b))},
+b:function(a){var z
 if(a==null)a=new P.LK()
 z=new Error()
 z.dartException=a
-if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.Ju})
-z.name=""}else z.toString=H.Ju
-return z},"$1","Cr",2,0,null,54,[]],
-Ju:[function(){return J.AG(this.dartException)},"$0","Eu",0,0,null],
-vh:[function(a){throw H.b(a)},"$1","xE",2,0,null,54,[]],
-Ru:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+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","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.Am(a)
 if(a==null)return
 if(typeof a!=="object")return a
@@ -1296,13 +1284,13 @@
 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))
 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=$.OI()
+return z.$1(new H.Zo(v,null))}}if(a instanceof TypeError){v=$.WD()
+u=$.KL()
 t=$.PH()
 s=$.D1()
-r=$.rx()
+r=$.LC()
 q=$.Kr()
-p=$.zO()
+p=$.W6()
 $.Bi()
 o=$.eA()
 n=$.ko()
@@ -1320,32 +1308,32 @@
 if(m==null){m=n.qS(y)
 v=m!=null}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0
 if(v){v=m==null?null:m.method
-return z.$1(new H.W0(y,v))}}}v=typeof y==="string"?y:""
+return z.$1(new H.Zo(y,v))}}}v=typeof y==="string"?y:""
 return z.$1(new H.vV(v))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.VS()
 return z.$1(new P.AT(null))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.VS()
-return a},"$1","v2",2,0,null,54,[]],
-CU:[function(a){if(a==null||typeof a!='object')return J.v1(a)
-else return H.eQ(a)},"$1","Zs",2,0,null,6,[]],
-B7:[function(a,b){var z,y,x,w
+return a},
+CU:function(a){if(a==null||typeof a!='object')return J.v1(a)
+else return H.eQ(a)},
+B7:function(a,b){var z,y,x,w
 z=a.length
 for(y=0;y<z;y=w){x=y+1
 w=x+1
-b.u(0,a[y],a[x])}return b},"$2","nD",4,0,null,56,[],57,[]],
-ft:[function(a,b,c,d,e,f,g){var z=J.x(c)
+b.u(0,a[y],a[x])}return b},
+El:[function(a,b,c,d,e,f,g){var z=J.x(c)
 if(z.n(c,0))return H.zd(b,new H.dr(a))
 else if(z.n(c,1))return H.zd(b,new H.TL(a,d))
-else if(z.n(c,2))return H.zd(b,new H.KX(a,d,e))
-else if(z.n(c,3))return H.zd(b,new H.uZ(a,d,e,f))
-else if(z.n(c,4))return H.zd(b,new H.OQ(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","mD",14,0,null,58,[],16,[],59,[],60,[],61,[],62,[],63,[]],
-tR:[function(a,b){var z
+else if(z.n(c,2))return H.zd(b,new H.uZ(a,d,e))
+else if(z.n(c,3))return H.zd(b,new H.OQ(a,d,e,f))
+else if(z.n(c,4))return H.zd(b,new H.Qx(a,d,e,f,g))
+else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","Q8",14,0,null,3,4,5,6,7,8,9],
+tR:function(a,b){var z
 if(a==null)return
 z=a.$identity
 if(!!z)return z
-z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.ft)
+z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.N0,H.El)
 a.$identity=z
-return z},"$2","qN",4,0,null,58,[],64,[]],
-iA:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+return z},
+HA:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=b[0]
 z.$stubName
 y=z.$callName
@@ -1362,50 +1350,50 @@
 v.prototype=w
 u=!d
 if(u){t=e.length==1&&!0
-s=H.SD(a,z,t)
+s=H.bx(a,z,t)
 s.$reflectionInfo=c}else{w.$name=f
 s=z
 t=!1}if(typeof x=="number")r=function(g){return function(){return init.metadata[g]}}(x)
-else if(u&&typeof x=="function"){q=t?H.yS:H.eZ
+else if(u&&typeof x=="function"){q=t?H.HY:H.dS
 r=function(g,h){return function(){return g.apply({$receiver:h(this)},arguments)}}(x,q)}else throw H.b("Error in reflectionInfo.")
 w.$signature=r
 w[y]=s
 for(u=b.length,p=1;p<u;++p){o=b[p]
 n=o.$callName
-if(n!=null){m=d?o:H.SD(a,o,t)
+if(n!=null){m=d?o:H.bx(a,o,t)
 w[n]=m}}w["call*"]=s
-return v},"$6","Xd",12,0,null,48,[],65,[],66,[],67,[],68,[],69,[]],
-vq:[function(a,b,c,d){var z=H.eZ
+return v},
+vq:function(a,b,c,d){var z=H.dS
 switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
 case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
 case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
 case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
 case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
 case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
-default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},"$4","X5",8,0,null,64,[],70,[],71,[],17,[]],
-SD:[function(a,b,c){var z,y,x,w,v,u
-if(c)return H.wg(a,b)
+default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
+bx:function(a,b,c){var z,y,x,w,v,u
+if(c)return H.Hf(a,b)
 z=b.$stubName
 y=b.length
 x=a[z]
 w=b==null?x==null:b===x
 if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
 if(y===0){w=$.bf
-if(w==null){w=H.B3("self")
+if(w==null){w=H.E2("self")
 $.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
 v=$.OK
 $.OK=J.WB(v,1)
 return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
 w="return function("+u+"){return this."
 v=$.bf
-if(v==null){v=H.B3("self")
+if(v==null){v=H.E2("self")
 $.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
 w=$.OK
 $.OK=J.WB(w,1)
-return new Function(v+H.d(w)+"}")()},"$3","Fw",6,0,null,48,[],17,[],72,[]],
-Z4:[function(a,b,c,d){var z,y
-z=H.eZ
-y=H.yS
+return new Function(v+H.d(w)+"}")()},
+Z4:function(a,b,c,d){var z,y
+z=H.dS
+y=H.HY
 switch(b?-1:a){case 0:throw H.b(H.Ef("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)
@@ -1415,11 +1403,11 @@
 case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
 default:return function(e,f,g,h){return function(){h=[g(this)]
 Array.prototype.push.apply(h,arguments)
-return e.apply(f(this),h)}}(d,z,y)}},"$4","VT",8,0,null,64,[],70,[],12,[],17,[]],
-wg:[function(a,b){var z,y,x,w,v,u,t,s
+return e.apply(f(this),h)}}(d,z,y)}},
+Hf:function(a,b){var z,y,x,w,v,u,t,s
 z=H.oN()
 y=$.P4
-if(y==null){y=H.B3("receiver")
+if(y==null){y=H.E2("receiver")
 $.P4=y}x=b.$stubName
 w=b.length
 v=typeof dart_precompiled=="function"
@@ -1433,40 +1421,39 @@
 y="return function("+s+"){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+", "+s+");"
 t=$.OK
 $.OK=J.WB(t,1)
-return new Function(y+H.d(t)+"}")()},"$2","FT",4,0,null,48,[],17,[]],
-qm:[function(a,b,c,d,e,f){b.fixed$length=init
+return new Function(y+H.d(t)+"}")()},
+qm:function(a,b,c,d,e,f){b.fixed$length=init
 c.fixed$length=init
-return H.iA(a,b,c,!!d,e,f)},"$6","Rz",12,0,null,48,[],65,[],66,[],67,[],68,[],12,[]],
-SE:[function(a,b){var z=J.U6(b)
-throw H.b(H.aq(H.lh(a),z.Nj(b,3,z.gB(b))))},"$2","H7",4,0,null,30,[],74,[]],
-Go:[function(a,b){var z
+return H.HA(a,b,c,!!d,e,f)},
+SE:function(a,b){var z=J.U6(b)
+throw H.b(H.Ep(H.lh(a),z.Nj(b,3,z.gB(b))))},
+Go:function(a,b){var z
 if(a!=null)z=typeof a==="object"&&J.x(a)[b]
 else z=!0
 if(z)return a
-H.SE(a,b)},"$2","CY",4,0,null,30,[],74,[]],
-ag:[function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},"$1","RK",2,0,null,75,[]],
-KT:[function(a,b,c){return new H.tD(a,b,c,null)},"$3","HN",6,0,null,77,[],78,[],79,[]],
-Og:[function(a,b){var z=a.name
+H.SE(a,b)},
+ag:function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},
+KT:function(a,b,c){return new H.GN(a,b,c,null)},
+Og:function(a,b){var z=a.name
 if(b==null||b.length===0)return new H.tu(z)
-return new H.fw(z,b,null)},"$2","ZPJ",4,0,null,80,[],81,[]],
-N7:[function(){return C.KZ},"$0","cI",0,0,null],
-uV:[function(a){return new H.cu(a,null)},"$1","IZ",2,0,null,12,[]],
-VM:[function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},"$2","Ub",4,0,null,82,[],83,[]],
-oX:[function(a){if(a==null)return
-return a.$builtinTypeInfo},"$1","Cb",2,0,null,82,[]],
-IM:[function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},"$2","PE",4,0,null,82,[],84,[]],
-ip:[function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},"$3","Cn",6,0,null,82,[],84,[],15,[]],
-Kp:[function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},"$2","tC",4,0,null,82,[],15,[]],
-Ko:[function(a,b){if(a==null)return"dynamic"
+return new H.Tu(z,b,null)},
+G3:function(){return C.KZ},
+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)
+return z==null?null:z[c]},
+Kp:function(a,b){var z=H.oX(a)
+return z==null?null:z[b]},
+Ko:function(a,b){if(a==null)return"dynamic"
 else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.ia(a,1,b)
 else if(typeof a=="function")return a.builtin$cls
-else if(typeof a==="number"&&Math.floor(a)===a)if(b==null)return C.jn.bu(a)
-else return b.$1(a)
-else return},"$2$onTypeVariable","bR",2,3,null,85,11,[],86,[]],
-ia:[function(a,b,c){var z,y,x,w,v,u
+else if(typeof a==="number"&&Math.floor(a)===a)return C.jn.bu(a)
+else return},
+ia:function(a,b,c){var z,y,x,w,v,u
 if(a==null)return""
 z=P.p9("")
 for(y=b,x=!0,w=!0;y<a.length;++y){if(x)x=!1
@@ -1474,40 +1461,41 @@
 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)+">"},"$3$onTypeVariable","iM",4,3,null,85,87,[],88,[],86,[]],
-dJ:[function(a){var z=typeof a==="object"&&a!==null&&a.constructor===Array?"List":J.x(a).constructor.builtin$cls
-return z+H.ia(a.$builtinTypeInfo,0,null)},"$1","Yx",2,0,null,6,[]],
-Y9:[function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
+z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
+dJ:function(a){var z=J.x(a).constructor.builtin$cls
+if(a==null)return z
+return z+H.ia(a.$builtinTypeInfo,0,null)},
+Y9:function(a,b){if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
 else if(typeof a=="function"){a=H.ml(a,null,b)
 if(typeof a==="object"&&a!==null&&a.constructor===Array)b=a
-else if(typeof a=="function")b=H.ml(a,null,b)}return b},"$2","zL",4,0,null,89,[],90,[]],
-RB:[function(a,b,c,d){var z,y
+else if(typeof a=="function")b=H.ml(a,null,b)}return b},
+RB:function(a,b,c,d){var z,y
 if(a==null)return!1
 z=H.oX(a)
 y=J.x(a)
 if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},"$4","Ap",8,0,null,6,[],91,[],92,[],93,[]],
-hv:[function(a,b){var z,y
+return H.hv(H.Y9(y[d],z),c)},
+hv:function(a,b){var z,y
 if(a==null||b==null)return!0
 z=a.length
 for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},"$2","QY",4,0,null,94,[],95,[]],
-IG:[function(a,b,c){return H.ml(a,b,H.IM(b,c))},"$3","k2",6,0,null,96,[],97,[],98,[]],
-XY:[function(a,b){var z,y
-if(a==null)return b==null||b.builtin$cls==="a"||b.builtin$cls==="Null"
+return!0},
+IG: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
 z=H.oX(a)
 a=J.x(a)
 if(z!=null){y=z.slice()
 y.splice(0,0,a)}else y=a
-return H.t1(y,b)},"$2","Dk",4,0,null,99,[],95,[]],
-t1:[function(a,b){var z,y,x,w,v,u,t
+return H.t1(y,b)},
+t1:function(a,b){var z,y,x,w,v,u,t
 if(a===b)return!0
 if(a==null||b==null)return!0
 if("func" in b){if(!("func" in a)){if("$is_"+H.d(b.func) in a)return!0
 z=a.$signature
 if(z==null)return!1
-a=z.apply(a,null)}return H.Ly(a,b)}if(b.builtin$cls==="EH"&&"func" in a)return!0
+a=z.apply(a,null)}return H.J4(a,b)}if(b.builtin$cls==="EH"&&"func" in a)return!0
 y=typeof a==="object"&&a!==null&&a.constructor===Array
 x=y?a[0]:a
 w=typeof b==="object"&&b!==null&&b.constructor===Array
@@ -1518,8 +1506,8 @@
 if(!y&&t==null||!w)return!0
 y=y?a.slice(1):null
 w=w?b.slice(1):null
-return H.hv(H.Y9(t,y),w)},"$2","Mb",4,0,null,94,[],95,[]],
-Hc:[function(a,b,c){var z,y,x,w,v
+return H.hv(H.Y9(t,y),w)},
+Hc:function(a,b,c){var z,y,x,w,v
 if(b==null&&a==null)return!0
 if(b==null)return c
 if(a==null)return!1
@@ -1528,8 +1516,8 @@
 if(c){if(z<y)return!1}else if(z!==y)return!1
 for(x=0;x<y;++x){w=a[x]
 v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},"$3","d1",6,0,null,94,[],95,[],100,[]],
-Vt:[function(a,b){var z,y,x,w,v,u
+if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},
+Vt:function(a,b){var z,y,x,w,v,u
 if(b==null)return!0
 if(a==null)return!1
 z=Object.getOwnPropertyNames(b)
@@ -1539,8 +1527,8 @@
 if(!Object.hasOwnProperty.call(a,w))return!1
 v=b[w]
 u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},"$2","y3",4,0,null,94,[],95,[]],
-Ly:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},
+J4:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
 if(!("func" in a))return!1
 if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
 y=b.ret
@@ -1561,13 +1549,13 @@
 n=w[m]
 if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
 n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},"$2","Sj",4,0,null,94,[],95,[]],
-ml:[function(a,b,c){return a.apply(b,c)},"$3","fW",6,0,null,17,[],48,[],90,[]],
-kj:[function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.$1(a))},"$1","aZ",2,0,null,101,[]],
-wzi:[function(a){return H.eQ(a)},"$1","nR",2,0,null,6,[]],
-iw:[function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},"$3","OU",6,0,null,101,[],74,[],30,[]],
-w3:[function(a){var z,y,x,w,v,u
+if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
+ml:function(a,b,c){return a.apply(b,c)},
+kj:function(a){var z=$.NF
+return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
+KS:function(a){return H.eQ(a)},
+bm:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
+w3:function(a){var z,y,x,w,v,u
 z=$.NF.$1(a)
 y=$.nw[z]
 if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
@@ -1588,43 +1576,45 @@
 return y.i}if(v==="~"){$.vv[z]=x
 return x}if(v==="-"){u=H.Va(x)
 Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}if(v==="+")return H.Lc(a,x)
+return u.i}if(v==="+")return H.B1(a,x)
 if(v==="*")throw H.b(P.SY(z))
 if(init.leafTags[z]===true){u=H.Va(x)
 Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}else return H.Lc(a,x)},"$1","eU",2,0,null,101,[]],
-Lc:[function(a,b){var z,y
+return u.i}else return H.B1(a,x)},
+B1:function(a,b){var z,y
 z=Object.getPrototypeOf(a)
 y=J.Qu(b,z,null,null)
 Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return b},"$2","qF",4,0,null,101,[],7,[]],
-Va:[function(a){return J.Qu(a,!1,null,!!a.$isXj)},"$1","MlJ",2,0,null,7,[]],
-VF:[function(a,b,c){var z=b.prototype
+return b},
+Va:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
+ow:function(a,b,c){var z=b.prototype
 if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},"$3","vi",6,0,null,102,[],103,[],8,[]],
-XD:[function(){if(!0===$.Bv)return
+else return J.Qu(z,c,null,null)},
+XD:function(){if(!0===$.Bv)return
 $.Bv=!0
-H.Z1()},"$0","Ki",0,0,null],
-Z1:[function(){var z,y,x,w,v,u,t
+H.Z1()},
+Z1:function(){var z,y,x,w,v,u,t,s
 $.nw=Object.create(null)
 $.vv=Object.create(null)
 H.kO()
 z=init.interceptorsByTag
 y=Object.getOwnPropertyNames(z)
 if(typeof window!="undefined"){window
-for(x=0;x<y.length;++x){w=y[x]
-v=$.x7.$1(w)
-if(v!=null){u=H.VF(w,z[w],v)
-if(u!=null)Object.defineProperty(v,init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})}}}for(x=0;x<y.length;++x){w=y[x]
-if(/^[A-Za-z_]/.test(w)){t=z[w]
-z["!"+w]=t
-z["~"+w]=t
-z["-"+w]=t
-z["+"+w]=t
-z["*"+w]=t}}},"$0","vU",0,0,null],
-kO:[function(){var z,y,x,w,v,u,t
+x=function(){}
+for(w=0;w<y.length;++w){v=y[w]
+u=$.x7.$1(v)
+if(u!=null){t=H.ow(v,z[v],u)
+if(t!=null){Object.defineProperty(u,init.dispatchPropertyName,{value:t,enumerable:false,writable:true,configurable:true})
+x.prototype=u}}}}for(w=0;w<y.length;++w){v=y[w]
+if(/^[A-Za-z_]/.test(v)){s=z[v]
+z["!"+v]=s
+z["~"+v]=s
+z["-"+v]=s
+z["+"+v]=s
+z["*"+v]=s}}},
+kO:function(){var z,y,x,w,v,u,t
 z=C.MA()
-z=H.ud(C.Mc,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ur(C.AS),z)))))))
+z=H.ud(C.JS,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]
 if(y.constructor==Array)for(x=0;x<y.length;++x){w=y[x]
@@ -1633,9 +1623,9 @@
 t=z.prototypeForTag
 $.NF=new H.dC(v)
 $.TX=new H.wN(u)
-$.x7=new H.VX(t)},"$0","Hb",0,0,null],
-ud:[function(a,b){return a(b)||b},"$2","rM",4,0,null,104,[],105,[]],
-ZT:[function(a,b){var z,y,x,w,v,u
+$.x7=new H.VX(t)},
+ud:function(a,b){return a(b)||b},
+ZT:function(a,b){var z,y,x,w,v,u
 z=H.VM([],[P.Od])
 y=b.length
 x=a.length
@@ -1644,45 +1634,33 @@
 z.push(new H.tQ(v,b,a))
 u=v+x
 if(u===y)break
-else w=v===u?w+1:u}return z},"$2","tl",4,0,null,110,[],111,[]],
-m2:[function(a,b,c){var z,y
+else w=v===u?w+1:u}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
-return y.test(z)}else return J.pO(z.dd(b,C.xB.yn(a,c)))}},"$3","WL",6,0,null,48,[],112,[],88,[]],
-ys:[function(a,b,c){var z,y,x,w,v
-if(typeof b==="string")if(b==="")if(a==="")return c
+return y.test(z)}else return J.z4(z.dd(b,C.xB.yn(a,c)))}},
+ys:function(a,b,c){var z,y,x,w
+if(b==="")if(a==="")return c
 else{z=P.p9("")
 y=a.length
 z.KF(c)
 for(x=0;x<y;++x){w=a[x]
 w=z.vM+=w
-z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace("$","$$$$"))
-else if(!!J.x(b).$isVR){v=b.gl9()
-v.lastIndex=0
-return a.replace(v,c.replace("$","$$$$"))}else{if(b==null)H.vh(P.u(null))
-throw H.b("String.replaceAll(Pattern) UNIMPLEMENTED")}},"$3","uF",6,0,null,48,[],113,[],114,[]],
-Zd:{
-"^":"a;"},
-xQ:{
-"^":"a;"},
-F0:{
-"^":"a;"},
-pa:{
+z.vM=w+c}return z.vM}else return a.replace(new RegExp(b.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),"\\$&"),'g'),c.replace(/\$/g,"$$$$"))},
+ysD:{
 "^":"a;",
-gl0:function(a){return J.de(this.gB(this),0)},
-gor:function(a){return!J.de(this.gB(this),0)},
+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)},
-Ix:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
-u:function(a,b,c){return this.Ix()},
-Rz:function(a,b){return this.Ix()},
-V1:function(a){return this.Ix()},
-FV:function(a,b){return this.Ix()},
+EP:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
+u:function(a,b,c){return this.EP()},
+V1:function(a){return this.EP()},
+FV:function(a,b){return this.EP()},
 $isZ0:true},
-LPe:{
-"^":"pa;B>,HV,tc",
-di:function(a){return this.gUQ(this).Vr(0,new H.LD(this,a))},
+Px:{
+"^":"ysD;B>,HV,tc",
 x4:function(a){if(typeof a!=="string")return!1
 if("__proto__"===a)return!1
 return this.HV.hasOwnProperty(a)},
@@ -1694,33 +1672,19 @@
 for(y=0;y<z.length;++y){x=z[y]
 b.$2(x,this.TZ(x))}},
 gvc:function(){return H.VM(new H.XR(this),[H.Kp(this,0)])},
-gUQ:function(a){return H.K1(this.tc,new H.jJ(this),H.Kp(this,0),H.Kp(this,1))},
+gUQ:function(a){return H.K1(this.tc,new H.hY(this),H.Kp(this,0),H.Kp(this,1))},
 $isyN:true},
-LD:{
-"^":"Tp;a,b",
-$1:[function(a){return J.de(a,this.b)},"$1",null,2,0,null,30,[],"call"],
-$isEH:true,
-$signature:function(){return H.IG(function(a,b){return{func:"JF",args:[b]}},this.a,"LPe")}},
-jJ:{
-"^":"Tp:116;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,49,[],"call"],
+hY:{
+"^":"Xs:30;a",
+$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,51,"call"],
 $isEH:true},
 XR:{
 "^":"mW;Y3",
-gA:function(a){return J.GP(this.Y3.tc)}},
+gA:function(a){return J.mY(this.Y3.tc)}},
 LI:{
 "^":"a;lK,uk,xI,rq,FX,Nc",
-gWa:function(){var z,y,x
-z=this.lK
-if(!!J.x(z).$iswv)return z
-y=$.bx().t(0,z)
-if(y!=null){x=y.split(":")
-if(0>=x.length)return H.e(x,0)
-z=x[0]}x=new H.GD(z)
-this.lK=x
-return x},
-glT:function(){return this.xI===1},
-ghB:function(){return this.xI===2},
+gWa:function(){return this.lK},
+gUA:function(){return this.xI===0},
 gnd:function(){var z,y,x,w
 if(this.xI===1)return C.xD
 z=this.rq
@@ -1732,78 +1696,22 @@
 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.wv,null)
+if(this.xI!==0)return P.Fl(P.IN,null)
 z=this.FX
 y=z.length
 x=this.rq
 w=x.length-y
-if(y===0)return P.Fl(P.wv,null)
-v=P.L5(null,null,null,P.wv,null)
+if(y===0)return P.Fl(P.IN,null)
+v=P.L5(null,null,null,P.IN,null)
 for(u=0;u<y;++u){if(u>=z.length)return H.e(z,u)
 t=z[u]
 s=w+u
 if(s<0||s>=x.length)return H.e(x,s)
 v.u(0,new H.GD(t),x[s])}return v},
-ZU:function(a){var z,y,x,w,v,u,t,s,r,q
-z=J.x(a)
-y=this.uk
-x=Object.prototype.hasOwnProperty.call(init.interceptedNames,y)||$.Dq.indexOf(y)!==-1
-if(x){w=a===z?null:z
-v=z
-z=w}else{v=a
-z=null}u=v[y]
-if(typeof u!="function"){t=J.GL(this.gWa())
-u=v[t+"*"]
-if(u==null){z=J.x(a)
-u=z[t+"*"]
-if(u!=null)x=!0
-else z=null}s=!0}else s=!1
-if(typeof u=="function"){if(!("$reflectable" in u)){r=J.x(a)
-q=!!r.$isv||!!r.$isBp}else q=!0
-if(!q)H.Hz(J.GL(this.gWa()))
-if(s)return new H.IW(H.zh(u),y,u,x,z)
-else return new H.A2(y,u,x,z)}else return new H.F3(z)},
-static:{"^":"Kq,oY,zl"}},
-A2:{
-"^":"a;Pi<,mr,eK<,Ot",
-gpf:function(){return!1},
-gIt:function(){return!!this.mr.$getterStub},
-Bj:function(a,b){var z,y
-if(!this.eK){if(b.constructor!==Array)b=P.F(b,!0,null)
-z=a}else{y=[a]
-C.Nm.FV(y,b)
-z=this.Ot
-z=z!=null?z:a
-b=y}return this.mr.apply(z,b)}},
-IW:{
-"^":"A2;qa,Pi,mr,eK,Ot",
-To:function(a){return this.qa.$1(a)},
-gIt:function(){return!1},
-Bj:function(a,b){var z,y,x,w,v,u,t
-z=this.qa
-y=z.Rv
-x=y+z.hG
-if(!this.eK){if(b.constructor===Array){w=b.length
-if(w<x)b=P.F(b,!0,null)}else{b=P.F(b,!0,null)
-w=b.length}v=a}else{u=[a]
-C.Nm.FV(u,b)
-v=this.Ot
-v=v!=null?v:a
-w=u.length-1
-b=u}if(z.Mo&&w>y)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+b.length+" arguments."))
-else if(w<y)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too few)."))
-else if(w>x)throw H.b(H.WE("Invocation of unstubbed method '"+z.gx5()+"' with "+w+" arguments (too many)."))
-for(t=w;t<x;++t)C.Nm.h(b,init.metadata[z.BX(0,t)])
-return this.mr.apply(v,b)}},
-F3:{
-"^":"a;e0",
-gpf:function(){return!0},
-gIt:function(){return!1},
-Bj:function(a,b){var z=this.e0
-return J.jf(z==null?a:z,b)}},
+static:{"^":"hAw,eHF,zl"}},
 FD:{
-"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
-XL:function(a){var z=this.Rn[2*a+this.hG+3]
+"^":"a;mr,Rn>,XZ,Rv,Ee,Mo,AM,NE",
+XL:function(a){var z=this.Rn[a+this.Ee+3]
 return init.metadata[z]},
 BX:function(a,b){var z=this.Rv
 if(typeof b!=="number")return b.C()
@@ -1811,65 +1719,58 @@
 return this.Rn[3+b-z]},
 Fk:function(a){var z=this.Rv
 if(a<z)return
-if(!this.Mo||this.hG===1)return this.BX(0,a)
+if(!this.Mo||this.Ee===1)return this.BX(0,a)
 return this.BX(0,this.e4(a-z))},
-KE:function(a){var z=this.Rv
+QN:function(a){var z=this.Rv
 if(a<z)return
-if(!this.Mo||this.hG===1)return this.XL(a)
+if(!this.Mo||this.Ee===1)return this.XL(a)
 return this.XL(this.e4(a-z))},
-e4:function(a){var z,y,x,w,v,u
+e4:function(a){var z,y,x,w,v,u,t
 z={}
-if(this.NE==null){y=this.hG
+if(this.NE==null){y=this.Ee
 this.NE=Array(y)
-x=P.Fl(J.O,J.bU)
+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()
 y=P.F(y,!0,H.ip(y,"mW",0))
-H.rd(y,null)
-H.bQ(y,new H.Nv(z,this,x))}z=this.NE
+t=P.n4()
+H.ZE(y,0,y.length-1,t)
+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]},
-hl:function(a){var z,y
-z=this.AM
-if(typeof z=="number")return init.metadata[z]
-else if(typeof z=="function"){y=new a()
-H.VM(y,y["<>"])
-return z.apply({$receiver:y})}else throw H.b(H.Ef("Unexpected function type"))},
-gx5:function(){return this.mr.$reflectionName},
-static:{"^":"vS,FV,C1,bt",zh:function(a){var z,y,x,w
+static:{"^":"t4,FV,OcN,yM",zh:function(a){var z,y,x
 z=a.$reflectionInfo
 if(z==null)return
 z.fixed$length=init
 z=z
 y=z[0]
-x=y>>1
-w=z[1]
-return new H.FD(a,z,(y&1)===1,x,w>>1,(w&1)===1,z[2],null)}}},
-Nv:{
-"^":"Tp:32;a,b,c",
-$1:[function(a){var z,y,x
+x=z[1]
+return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
+uV:{
+"^":"Xs:2;a,b,c",
+$1:function(a){var z,y,x
 z=this.b.NE
 y=this.a.a++
 x=this.c.t(0,a)
 if(y>=z.length)return H.e(z,y)
-z[y]=x},"$1",null,2,0,null,12,[],"call"],
+z[y]=x},
 $isEH:true},
-Cj:{
-"^":"Tp:301;a,b,c",
-$2:[function(a,b){var z=this.a
+lk:{
+"^":"Xs:52;a,b,c",
+$2:function(a,b){var z=this.a
 z.b=z.b+"$"+H.d(a)
 this.c.push(a)
-this.b.push(b);++z.a},"$2",null,4,0,null,12,[],53,[],"call"],
+this.b.push(b);++z.a},
 $isEH:true},
 u8:{
-"^":"Tp:301;a,b",
-$2:[function(a,b){var z=this.b
+"^":"Xs:52;a,b",
+$2:function(a,b){var z=this.b
 if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},"$2",null,4,0,null,302,[],30,[],"call"],
+else this.a.a=!0},
 $isEH:true},
 Zr:{
-"^":"a;bT,rq,Xs,Fa,Ga,EP",
+"^":"a;bT,rq,Xs,Fa,Ga,cR",
 qS:function(a){var z,y,x
 z=new RegExp(this.bT).exec(a)
 if(z==null)return
@@ -1882,10 +1783,10 @@
 if(x!==-1)y.expr=z[x+1]
 x=this.Ga
 if(x!==-1)y.method=z[x+1]
-x=this.EP
+x=this.cR
 if(x!==-1)y.receiver=z[x+1]
 return y},
-static:{"^":"lm,k1,Re,fN,qi,rZ,BX,tt,dt,A7",LX:[function(a){var z,y,x,w,v,u
+static:{"^":"lm,k1,Re,fN,GK,rZ,BX,tt,dt,A7",cM:function(a){var z,y,x,w,v,u
 a=a.replace(String({}),'$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]",'g'),'\\$&')
 z=a.match(/\\\$[a-zA-Z]+\\\$/g)
 if(z==null)z=[]
@@ -1894,40 +1795,40 @@
 w=z.indexOf("\\$expr\\$")
 v=z.indexOf("\\$method\\$")
 u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},"$1","dx",2,0,null,24,[]],S7:[function(a){return function(b){var $argumentsExpr$='$arguments$'
-try{b.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},"$1","LS",2,0,null,55,[]],Mj:[function(a){return function(b){try{b.$method$}catch(z){return z.message}}(a)},"$1","cl",2,0,null,55,[]]}},
-W0:{
-"^":"Ge;K9,Ga",
+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)}}},
+Zo:{
+"^":"XS;V7,Ga",
 bu:function(a){var z=this.Ga
-if(z==null)return"NullError: "+H.d(this.K9)
+if(z==null)return"NullError: "+H.d(this.V7)
 return"NullError: Cannot call \""+H.d(z)+"\" on null"},
-$ismp:true,
-$isGe:true},
-az:{
-"^":"Ge;K9,Ga,EP",
+$isMC:true,
+$isXS:true},
+u0:{
+"^":"XS;V7,Ga,cR",
 bu:function(a){var z,y
 z=this.Ga
-if(z==null)return"NoSuchMethodError: "+H.d(this.K9)
-y=this.EP
-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)+")"},
-$ismp:true,
-$isGe:true,
+if(z==null)return"NoSuchMethodError: "+H.d(this.V7)
+y=this.cR
+if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.V7)+")"
+return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.V7)+")"},
+$isMC:true,
+$isXS:true,
 static:{T3:function(a,b){var z,y
 z=b==null
 y=z?null:b.method
 z=z?null:b.receiver
-return new H.az(a,y,z)}}},
+return new H.u0(a,y,z)}}},
 vV:{
-"^":"Ge;K9",
-bu:function(a){var z=this.K9
+"^":"XS;V7",
+bu:function(a){var z=this.V7
 return C.xB.gl0(z)?"Error":"Error: "+z}},
 Am:{
-"^":"Tp:116;a",
-$1:[function(a){if(!!J.x(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},"$1",null,2,0,null,171,[],"call"],
+"^":"Xs:30;a",
+$1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
+return a},
 $isEH:true},
-XO:{
+oP:{
 "^":"a;lA,ui",
 bu:function(a){var z,y
 z=this.ui
@@ -1938,75 +1839,68 @@
 this.ui=z
 return z}},
 dr:{
-"^":"Tp:115;a",
-$0:[function(){return this.a.$0()},"$0",null,0,0,null,"call"],
+"^":"Xs:47;a",
+$0:function(){return this.a.$0()},
 $isEH:true},
 TL:{
-"^":"Tp:115;b,c",
-$0:[function(){return this.b.$1(this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
-KX:{
-"^":"Tp:115;d,e,f",
-$0:[function(){return this.d.$2(this.e,this.f)},"$0",null,0,0,null,"call"],
+"^":"Xs:47;b,c",
+$0:function(){return this.b.$1(this.c)},
 $isEH:true},
 uZ:{
-"^":"Tp:115;UI,bK,Gq,Rm",
-$0:[function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},"$0",null,0,0,null,"call"],
+"^":"Xs:47;d,e,f",
+$0:function(){return this.d.$2(this.e,this.f)},
 $isEH:true},
 OQ:{
-"^":"Tp:115;w3,HZ,mG,xC,cj",
-$0:[function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},"$0",null,0,0,null,"call"],
+"^":"Xs:47;UI,bK,Gq,Rm",
+$0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
 $isEH:true},
-Tp:{
+Qx:{
+"^":"Xs:47;w3,HZ,mG,xC,pb",
+$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.pb)},
+$isEH:true},
+Xs:{
 "^":"a;",
 bu:function(a){return"Closure"},
-$isTp:true,
-$isEH:true},
+$isEH:true,
+gKu:function(){return this}},
 Bp:{
-"^":"Tp;",
-$isBp:true},
+"^":"Xs;"},
 v:{
-"^":"Bp;nw<,jm<,EP,RA>",
+"^":"Bp;nw,jm,cR,RA",
 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.EP===b.EP},
+return this.nw===b.nw&&this.jm===b.jm&&this.cR===b.cR},
 giO:function(a){var z,y
-z=this.EP
+z=this.cR
 if(z==null)y=H.eQ(this.nw)
 else y=typeof z!=="object"?J.v1(z):H.eQ(z)
 return J.UN(y,H.eQ(this.jm))},
 $isv:true,
-static:{"^":"bf,P4",eZ:[function(a){return a.gnw()},"$1","PR",2,0,null,58,[]],yS:[function(a){return a.EP},"$1","xm",2,0,null,58,[]],oN:[function(){var z=$.bf
-if(z==null){z=H.B3("self")
-$.bf=z}return z},"$0","uT",0,0,null],B3:[function(a){var z,y,x,w,v
+static:{"^":"bf,P4",dS:function(a){return a.nw},HY:function(a){return a.cR},oN:function(){var z=$.bf
+if(z==null){z=H.E2("self")
+$.bf=z}return z},E2:function(a){var z,y,x,w,v
 z=new H.v("self","target","receiver","name")
 y=Object.getOwnPropertyNames(z)
 y.fixed$length=init
 x=y
 for(y=x.length,w=0;w<y;++w){v=x[w]
-if(z[v]===a)return v}},"$1","ec",2,0,null,73,[]]}},
-qq:{
-"^":"a;Jy"},
-va:{
-"^":"a;Jy"},
-GT:{
-"^":"a;oc>"},
+if(z[v]===a)return v}}}},
 Pe:{
-"^":"Ge;G1>",
+"^":"XS;G1>",
 bu:function(a){return this.G1},
-$isGe:true,
-static:{aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
-Eq:{
-"^":"Ge;G1>",
+$isXS:true,
+static:{Ep:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
+tc:{
+"^":"XS;G1>",
 bu:function(a){return"RuntimeError: "+H.d(this.G1)},
-static:{Ef:function(a){return new H.Eq(a)}}},
-q1:{
+static:{Ef:function(a){return new H.tc(a)}}},
+lbp:{
 "^":"a;"},
-tD:{
-"^":"q1;dw,Iq,is,p6",
+GN:{
+"^":"lbp;dw,Iq,is,p6",
 BD:function(a){var z=this.rP(a)
-return z==null?!1:H.Ly(z,this.za())},
+return z==null?!1:H.J4(z,this.za())},
 rP:function(a){var z=J.x(a)
 return"$signature" in z?z.$signature():null},
 za:function(){var z,y,x,w,v,u,t
@@ -2039,26 +1933,26 @@
 for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
 if(w)x+=", "
 x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+H.d(this.dw))},
-static:{"^":"Jl",Dz:[function(a){var z,y,x
+static:{"^":"UA",Dz:function(a){var z,y,x
 a=a
 z=[]
 for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z},"$1","At",2,0,null,76,[]]}},
+return z}}},
 hJ:{
-"^":"q1;",
+"^":"lbp;",
 bu:function(a){return"dynamic"},
 za:function(){return},
 $ishJ:true},
 tu:{
-"^":"q1;oc>",
+"^":"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}},
-fw:{
-"^":"q1;oc>,re<,Et",
+Tu:{
+"^":"lbp;oc>,re<,Et",
 za:function(){var z,y
 z=this.Et
 if(z!=null)return z
@@ -2069,61 +1963,51 @@
 for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
 this.Et=y
 return y},
-bu:function(a){return H.d(this.oc)+"<"+J.XS(this.re,", ")+">"}},
-oQ:{
-"^":"Ge;K9",
-bu:function(a){return"Unsupported operation: "+this.K9},
-$ismp:true,
-$isGe:true,
-static:{WE:function(a){return new H.oQ(a)}}},
+bu:function(a){return H.d(this.oc)+"<"+J.Dn(this.re,", ")+">"}},
 cu:{
-"^":"a;LU<,ke",
-bu:function(a){var z,y,x
+"^":"a;LU,ke",
+bu:function(a){var z,y
 z=this.ke
 if(z!=null)return z
-y=this.LU
-x=init.mangledGlobalNames[y]
-y=x==null?y:x
+y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
 this.ke=y
 return y},
 giO:function(a){return J.v1(this.LU)},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iscu&&J.de(this.LU,b.LU)},
+return!!J.x(b).$iscu&&J.xC(this.LU,b.LU)},
 $iscu:true,
 $isuq:true},
-QT:{
-"^":"a;XP<,oc>,kU>"},
 dC:{
-"^":"Tp:116;a",
-$1:[function(a){return this.a(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Xs:30;a",
+$1:function(a){return this.a(a)},
 $isEH:true},
 wN:{
-"^":"Tp:303;b",
-$2:[function(a,b){return this.b(a,b)},"$2",null,4,0,null,99,[],102,[],"call"],
+"^":"Xs:53;b",
+$2:function(a,b){return this.b(a,b)},
 $isEH:true},
 VX:{
-"^":"Tp:32;c",
-$1:[function(a){return this.c(a)},"$1",null,2,0,null,102,[],"call"],
+"^":"Xs:2;c",
+$1:function(a){return this.c(a)},
 $isEH:true},
 VR:{
-"^":"a;Ej,Ii,Ua",
-gl9:function(){var z=this.Ii
+"^":"a;zO,Ej,BT,xJ",
+gl9:function(){var z=this.BT
 if(z!=null)return z
 z=this.Ej
-z=H.v4(z.source,z.multiline,!z.ignoreCase,!0)
-this.Ii=z
+z=H.ol(this.zO,z.multiline,!z.ignoreCase,!0)
+this.BT=z
 return z},
-gAT:function(){var z=this.Ua
+gAT:function(){var z=this.xJ
 if(z!=null)return z
 z=this.Ej
-z=H.v4(z.source+"|()",z.multiline,!z.ignoreCase,!0)
-this.Ua=z
+z=H.ol(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
+this.xJ=z
 return z},
 ej:function(a){var z
 if(typeof a!=="string")H.vh(P.u(a))
 z=this.Ej.exec(a)
 if(z==null)return
-return H.yx(this,z)},
+return H.rj(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)},
@@ -2132,7 +2016,7 @@
 z.lastIndex=b
 y=z.exec(a)
 if(y==null)return
-return H.yx(this,y)},
+return H.rj(this,y)},
 Bh:function(a,b){var z,y,x,w
 z=this.gAT()
 z.lastIndex=b
@@ -2143,7 +2027,7 @@
 if(w<0)return H.e(y,w)
 if(y[w]!=null)return
 C.Nm.sB(y,w)
-return H.yx(this,y)},
+return H.rj(this,y)},
 wL:function(a,b,c){var z
 if(c>=0){z=J.q8(b)
 if(typeof z!=="number")return H.s(z)
@@ -2152,32 +2036,32 @@
 return this.Bh(b,c)},
 R4:function(a,b){return this.wL(a,b,0)},
 $isVR:true,
-$isSP:true,
-static:{v4:[function(a,b,c,d){var z,y,x,w,v
+$iswL:true,
+static:{ol:function(a,b,c,d){var z,y,x,w,v
 z=b?"m":""
 y=c?"":"i"
 x=d?"g":""
 w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
 if(w instanceof RegExp)return w
 v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))},"$4","HU",8,0,null,106,[],107,[],108,[],109,[]]}},
+throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},
 AX:{
 "^":"a;zO,QK",
 t:function(a,b){var z=this.QK
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-VO:function(a,b){},
+Ko:function(a,b){},
 $isOd:true,
-static:{yx:function(a,b){var z=new H.AX(a,b)
-z.VO(a,b)
+static:{rj:function(a,b){var z=new H.AX(a,b)
+z.Ko(a,b)
 return z}}},
 KW:{
-"^":"mW;Gf,rv",
-gA:function(a){return new H.Pb(this.Gf,this.rv,null)},
+"^":"mW;rN,rv",
+gA:function(a){return new H.Pb(this.rN,this.rv,null)},
 $asmW:function(){return[P.Od]},
-$asQV:function(){return[P.Od]}},
+$ascX:function(){return[P.Od]}},
 Pb:{
-"^":"a;VV,rv,Wh",
+"^":"a;xz,rv,Wh",
 gl:function(){return this.Wh},
 G:function(){var z,y,x
 if(this.rv==null)return!1
@@ -2189,94 +2073,83 @@
 if(typeof z!=="number")return H.s(z)
 x=y+z
 if(this.Wh.QK.index===x)++x}else x=0
-z=this.VV.yk(this.rv,x)
+z=this.xz.yk(this.rv,x)
 this.Wh=z
 if(z==null){this.rv=null
 return!1}return!0}},
 tQ:{
 "^":"a;M,J9,zO",
-t:function(a,b){if(!J.de(b,0))H.vh(P.N(b))
+t:function(a,b){if(!J.xC(b,0))H.vh(P.N(b))
 return this.zO},
 $isOd:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
 "^":"",
 hV:{
-"^":["LP;fi%-304,dB%-85,KW%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gO9:[function(a){return a.fi},null,null,1,0,307,"busy",308,309],
-sO9:[function(a,b){a.fi=this.ct(a,C.S4,a.fi,b)},null,null,3,0,310,30,[],"busy",308],
-gFR:[function(a){return a.dB},null,null,1,0,115,"callback",308,311],
+"^":"LP;IF,Qw,cw,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gv8:function(a){return a.IF},
+sv8: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)},null,null,3,0,116,30,[],"callback",308],
-gph:[function(a){return a.KW},null,null,1,0,312,"label",308,311],
-sph:[function(a,b){a.KW=this.ct(a,C.y2,a.KW,b)},null,null,3,0,32,30,[],"label",308],
-pp:[function(a,b,c,d){var z=a.fi
+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)},
+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,313,118,[],199,[],289,[],"doAction"],
-"@":function(){return[C.F9]},
-static:{zy:[function(a){var z,y,x,w
+if(a.Qw!=null){a.IF=this.ct(a,C.S4,z,!0)
+this.LY(a,null).wM(new X.jE(a))}},"$3","gNa",6,0,54,22,23,55],
+static:{zy:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.fi=!1
-a.dB=null
-a.KW="action"
-a.SO=z
-a.B7=y
-a.X0=w
-C.Uy.ZL(a)
-C.Uy.oX(a)
-return a},null,null,0,0,115,"new ActionLinkElement$created"]}},
-"+ActionLinkElement":[314],
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.IF=!1
+a.Qw=null
+a.cw="action"
+a.on=z
+a.BA=y
+a.LL=w
+C.Gx.ZL(a)
+C.Gx.XI(a)
+return a}}},
 LP:{
-"^":"xc+Pi;",
+"^":"ir+Pi;",
 $isd3:true},
 jE:{
-"^":"Tp:115;a-85",
-$0:[function(){var z,y
-z=this.a
-y=J.RE(z)
-y.sfi(z,y.ct(z,C.S4,y.gfi(z),!1))},"$0",null,0,0,115,"call"],
-$isEH:true},
-"+ jE":[315]}],["app","package:observatory/app.dart",,G,{
+"^":"Xs:47;a",
+$0:[function(){var z=this.a
+z.IF=J.Q5(z,C.S4,z.IF,!1)},"$0",null,0,0,null,"call"],
+$isEH:true}}],["app","package:observatory/app.dart",,G,{
 "^":"",
-m7:[function(a){var z
-N.Jx("").To("Google Charts API loaded")
-z=J.UQ(J.UQ($.cM(),"google"),"visualization")
-$.NR=z
-return z},"$1","vN",2,0,116,117,[]],
-G0:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","ez",4,0,null,118,[],119,[]],
-ap:[function(a,b){var z
+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)},"$2","Bn",4,0,null,30,[],120,[]],
-av:[function(a){var z,y,x
+if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
+DD:[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.ap(y,3)
-for(;z=J.Wx(a),z.D(a,1000);){x=G.ap(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","Vj",2,0,121,122,[]],
-P0:[function(a){var z,y,x,w
-if(a==null)return"-"
-z=J.LL(J.vX(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","xo",2,0,10],
+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.jn.Y(z,3600000)
 x=C.jn.cU(z,60000)
 z=C.jn.Y(z,60000)
 w=C.jn.cU(z,1000)
 z=C.jn.Y(z,1000)
-if(y>0)return G.ap(y,2)+":"+G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)
-else return G.ap(x,2)+":"+G.ap(w,2)+"."+G.ap(z,3)},"$1","DQ",2,0,null,123,[]],
+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)},
 Xz:[function(a){var z=J.Wx(a)
 if(z.C(a,1024))return H.d(a)+"B"
 else if(z.C(a,1048576))return""+C.CD.yu(C.CD.UD(z.V(a,1024)))+"KB"
 else if(z.C(a,1073741824))return""+C.CD.yu(C.CD.UD(z.V(a,1048576)))+"MB"
 else if(z.C(a,1099511627776))return""+C.CD.yu(C.CD.UD(z.V(a,1073741824)))+"GB"
-else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","AF",2,0,121,124,[]],
-mG:[function(a){var z,y,x,w
+else return""+C.CD.yu(C.CD.UD(z.V(a,1099511627776)))+"TB"},"$1","Gt",2,0,10,11],
+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)
@@ -2286,450 +2159,1804 @@
 P.p9("")
 if(y!==0)return""+y+"h "+x+"m "+w+"s"
 if(x!==0)return""+x+"m "+w+"s"
-return""+w+"s"},"$1","N2",2,0,null,123,[]],
+return""+w+"s"},
 mL:{
-"^":["Pi;Z6<-316,zf>-317,Eb,AJ,fz,AP,fn",function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
-gF1:[function(a){return this.Eb},null,null,1,0,318,"isolate",308,309],
-sF1:[function(a,b){this.Eb=F.Wi(this,C.Z8,this.Eb,b)},null,null,3,0,319,30,[],"isolate",308],
-gvJ:[function(a){return this.AJ},null,null,1,0,320,"response",308,309],
-svJ:[function(a,b){this.AJ=F.Wi(this,C.mE,this.AJ,b)},null,null,3,0,321,30,[],"response",308],
-gKw:[function(){return this.fz},null,null,1,0,312,"args",308,309],
-sKw:[function(a){this.fz=F.Wi(this,C.Zg,this.fz,a)},null,null,3,0,32,30,[],"args",308],
+"^":"Pi;Z6,wv>,Eb,AJ,fz,AP,fn",
+god:function(a){return this.Eb},
+sod:function(a,b){this.Eb=F.Wi(this,C.rB,this.Eb,b)},
+gbA:function(a){return this.AJ},
+sbA:function(a,b){this.AJ=F.Wi(this,C.F3,this.AJ,b)},
 Da:function(){var z,y
 z=this.Z6
-z.sec(this)
+z.ec=this
 z.kI()
-z=this.zf
-y=z.gG2()
+z=this.wv
+y=z.G2
 H.VM(new P.Ik(y),[H.Kp(y,0)]).yI(this.gbf())
-z=z.gLi()
+z=z.Li
 H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())},
-kj:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gbf",2,0,322,171,[]],
-t1:[function(a){this.AJ=F.Wi(this,C.mE,this.AJ,a)
-this.Z6.Mp()},"$1","gXa",2,0,323,324,[]],
+kj:[function(a){this.AJ=F.Wi(this,C.F3,this.AJ,a)
+window.location.hash=""},"$1","gbf",2,0,56,19],
+t1:[function(a){this.AJ=F.Wi(this,C.F3,this.AJ,a)
+window.location.hash=""},"$1","gXa",2,0,57,58],
 US:function(){this.Da()},
 hq:function(){this.Da()}},
-ig:{
-"^":"a;Yb<",
+Kf:{
+"^":"a;Yb",
 goH:function(){return this.Yb.nQ("getNumberOfColumns")},
-gzU:function(a){return this.Yb.nQ("getNumberOfRows")},
-Gl:function(a,b){this.Yb.V7("addColumn",[a,b])},
-lb:function(){var z=this.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
-aJ:function(a,b){var z=[]
+gWT:function(a){return this.Yb.nQ("getNumberOfRows")},
+B7:function(){var z=this.Yb
+z.K9("removeRows",[0,z.nQ("getNumberOfRows")])},
+Id:function(a,b){var z=[]
 C.Nm.FV(z,J.kl(b,P.En()))
-this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])}},
+this.Yb.K9("addRow",[H.VM(new P.Tz(z),[null])])}},
 qu:{
 "^":"a;vR,bG",
-W2:function(a){var z=P.jT(this.bG)
-this.vR.V7("draw",[a.gYb(),z])}},
+Am:function(a){var z=P.ND(P.M0(this.bG))
+this.vR.K9("draw",[a.Yb,z])}},
 dZ:{
-"^":"Pi;ec?,JL,AP,fn",
-gjW:[function(){return this.JL},null,null,1,0,312,"currentHash",308,309],
-sjW:[function(a){this.JL=F.Wi(this,C.h1,this.JL,a)},null,null,3,0,32,30,[],"currentHash",308],
-kI:function(){var z=C.PP.aM(window)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
+"^":"Pi;ec,JL,AP,fn",
+kI:function(){var z=H.VM(new W.RO(window,C.yZ.Ph,!1),[null])
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(new G.Qe(this)),z.Sg),[H.Kp(z,0)]).Zz()
 if(window.location.hash==="")window.location.hash="#/vm"
 else this.df()},
-Mp:function(){window.location.hash=""},
 df:function(){var z,y,x
 z=window.location.hash
-z=F.Wi(this,C.h1,this.JL,z)
+z=F.Wi(this,C.M8,this.JL,z)
 this.JL=z
 if(!J.co(z,"#/"))return
 y=J.ZZ(this.JL,2).split("#")
 z=y.length
 if(0>=z)return H.e(y,0)
 x=z>1?y[1]:""
-if(z>2)N.Jx("").j2("Found more than 2 #-characters in "+H.d(this.JL))
-this.ec.zf.cv(J.ZZ(this.JL,2)).ml(new G.GH(this,x))},
-static:{"^":"K3D"}},
+if(z>2)N.QM("").j2("Found more than 2 #-characters in "+H.d(this.JL))
+this.ec.wv.ox(J.ZZ(this.JL,2)).ml(new G.wX(this,x))},
+static:{"^":"xp"}},
 Qe:{
-"^":"Tp:116;a",
-$1:[function(a){this.a.df()},"$1",null,2,0,null,325,[],"call"],
+"^":"Xs:30;a",
+$1:[function(a){this.a.df()},"$1",null,2,0,null,59,"call"],
 $isEH:true},
-GH:{
-"^":"Tp:116;a,b",
+wX:{
+"^":"Xs:30;a,b",
 $1:[function(a){var z,y
 z=this.a
 y=z.ec
-y.AJ=F.Wi(y,C.mE,y.AJ,a)
+y.AJ=F.Wi(y,C.F3,y.AJ,a)
 z=z.ec
-z.fz=F.Wi(z,C.Zg,z.fz,this.b)},"$1",null,2,0,null,101,[],"call"],
+z.fz=F.Wi(z,C.Za,z.fz,this.b)},"$1",null,2,0,null,60,"call"],
 $isEH:true},
 Y2:{
-"^":["Pi;eT>,yt<-326,wd>-327,oH<-328",null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]}],
-gyX:[function(a){return this.R7},null,null,1,0,312,"expander",308,309],
-Qx:function(a){return this.gyX(this).$0()},
-syX:[function(a,b){this.R7=F.Wi(this,C.Of,this.R7,b)},null,null,3,0,32,30,[],"expander",308],
-grm:[function(){return this.aZ},null,null,1,0,312,"expanderStyle",308,309],
-srm:[function(a){this.aZ=F.Wi(this,C.Jt,this.aZ,a)},null,null,3,0,32,30,[],"expanderStyle",308],
-goE:function(a){return this.cp},
-soE:function(a,b){var z=this.cp
-this.cp=b
-if(z!==b){z=this.R7
-if(b){this.R7=F.Wi(this,C.Of,z,"\u21b3")
-this.C4(0)}else{this.R7=F.Wi(this,C.Of,z,"\u2192")
-this.o8()}}},
-r8:function(){this.soE(0,!this.cp)
-return this.cp},
-k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Jt,this.aZ,"visibility:hidden;")},
+"^":"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
+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.cO()}}},
+r8:function(){this.soE(0,this.yq!==!0)
+return this.yq},
+k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
 $isY2:true},
 XN:{
-"^":["Pi;zU>-327,AP,fn",function(){return[C.J19]},null,null],
-rT:function(a){var z,y
-z=this.zU
-y=J.w1(z)
-y.V1(z)
-a.C4(0)
-y.FV(z,a.wd)},
-qU:function(a){var z,y,x
-z=this.zU
-y=J.U6(z)
-x=y.t(z,a)
-if(x.r8())y.oF(z,y.u8(z,x)+1,J.uw(x))
-else this.PP(x)},
-PP:function(a){var z,y,x,w,v
+"^":"Pi;WT>,AP,fn",
+FS:function(a){var z,y,x,w,v
 z=J.RE(a)
-y=J.q8(z.gwd(a))
-if(J.de(y,0))return
-if(typeof y!=="number")return H.s(y)
-x=0
-for(;x<y;++x)if(J.YV(J.UQ(z.gwd(a),x))===!0)this.PP(J.UQ(z.gwd(a),x))
+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))
 z.soE(a,!1)
-z=this.zU
+z=this.WT
 w=J.U6(z)
 v=w.u8(z,a)+1
 w.UZ(z,v,v+y)}},
-Kt:{
-"^":"a;ph>,xy",
-static:{r1:[function(a){return a!=null?J.AG(a):"<null>"},"$1","My",2,0,125,122,[]]}},
+YA:{
+"^":"a;ph>,xy<",
+static:{cR:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Tp",2,0,12]}},
 Ni:{
 "^":"a;UQ>",
 $isNi:true},
 Vz:{
-"^":"Pi;oH<,zU>,tW,pT,jV,AP,fn",
+"^":"Pi;oH<,WT>,tW,pT,jV,AP,fn",
 sxp:function(a){this.pT=a
 F.Wi(this,C.JB,0,1)},
 gxp:function(){return this.pT},
-np:function(a){H.rd(this.tW,new G.Nu(this))
-F.Wi(this,C.AH,0,1)},
-gIN:[function(){return this.tW},null,null,1,0,329,"sortedRows",309],
-lb:function(){C.Nm.sB(this.zU,0)
+Jd:function(a){var z=this.tW
+H.ZE(z,0,z.length-1,new G.BD(this))
+F.Wi(this,C.DW,0,1)},
+gGD:function(){return this.tW},
+B7:function(){C.Nm.sB(this.WT,0)
 C.Nm.sB(this.tW,0)},
-aJ:function(a,b){var z=this.zU
+Id:function(a,b){var z=this.WT
 this.tW.push(z.length)
 z.push(b)
-F.Wi(this,C.AH,0,1)},
+F.Wi(this,C.DW,0,1)},
 tM:[function(a,b){var z,y
-z=this.zU
+z=this.WT
 if(a>>>0!==a||a>=z.length)return H.e(z,a)
-z=J.U8(z[a])
-if(b>>>0!==b||b>=9)return H.e(z,b)
-y=z[b]
-return this.oH[b].xy.$1(y)},"$2","gls",4,0,330,331,[],332,[],"getFormattedValue",308],
-Qs:[function(a){var z,y
-if(!J.de(a,this.pT)){z=this.oH
-if(a>>>0!==a||a>=9)return H.e(z,a)
-return z[a].ph+"\u2003"}z=this.oH
-if(a>>>0!==a||a>=9)return H.e(z,a)
-z=z[a]
-y=this.jV?"\u25bc":"\u25b2"
-return z.ph+y},"$1","gpo",2,0,121,332,[],"getColumnLabel",308],
-TK:[function(a,b){var z=this.zU
+y=J.UQ(J.U8(z[a]),b)
+z=this.oH
+if(b>>>0!==b||b>=z.length)return H.e(z,b)
+return z[b].gxy().$1(y)},"$2","gwy",4,0,61,62,63],
+Qs:[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)
-z=J.U8(z[a])
-if(b>>>0!==b||b>=9)return H.e(z,b)
-return z[b]},"$2","gyY",4,0,333,331,[],332,[],"getValue",308]},
-Nu:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z,y,x,w,v,u
+return J.WB(J.Q4(z[a]),"\u2003")}z=this.oH
+if(a>>>0!==a||a>=z.length)return H.e(z,a)
+z=J.Q4(z[a])
+return J.WB(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,10,63],
+TK:[function(a,b){var z=this.WT
+if(a>>>0!==a||a>=z.length)return H.e(z,a)
+return J.UQ(J.U8(z[a]),b)},"$2","gyY",4,0,64,62,63]},
+BD:{
+"^":"Xs:50;a",
+$2:function(a,b){var z,y,x,w
 z=this.a
-y=z.zU
+y=z.WT
 if(a>>>0!==a||a>=y.length)return H.e(y,a)
-x=J.U8(y[a])
-w=z.pT
-if(w>>>0!==w||w>=9)return H.e(x,w)
-v=x[w]
+x=J.UQ(J.U8(y[a]),z.pT)
 if(b>>>0!==b||b>=y.length)return H.e(y,b)
-y=J.U8(y[b])
-w=z.pT
-if(w>>>0!==w||w>=9)return H.e(y,w)
-u=y[w]
-if(z.jV)return J.oE(u,v)
-else return J.oE(v,u)},"$2",null,4,0,null,334,[],335,[],"call"],
-$isEH:true}}],["app_bootstrap","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/index_devtools.html_bootstrap.dart",,E,{
+w=J.UQ(J.U8(y[b]),z.pT)
+if(z.jV)return J.oE(w,x)
+else return J.oE(x,w)},
+$isEH:true}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
 "^":"",
-De:[function(){$.x2=["package:observatory/src/elements/curly_block.dart","package:observatory/src/elements/observatory_element.dart","package:observatory/src/elements/service_ref.dart","package:observatory/src/elements/instance_ref.dart","package:observatory/src/elements/action_link.dart","package:observatory/src/elements/nav_bar.dart","package:observatory/src/elements/breakpoint_list.dart","package:observatory/src/elements/class_ref.dart","package:observatory/src/elements/eval_box.dart","package:observatory/src/elements/eval_link.dart","package:observatory/src/elements/field_ref.dart","package:observatory/src/elements/function_ref.dart","package:observatory/src/elements/library_ref.dart","package:observatory/src/elements/script_ref.dart","package:observatory/src/elements/class_view.dart","package:observatory/src/elements/code_ref.dart","package:observatory/src/elements/code_view.dart","package:observatory/src/elements/collapsible_content.dart","package:observatory/src/elements/error_view.dart","package:observatory/src/elements/field_view.dart","package:observatory/src/elements/script_inset.dart","package:observatory/src/elements/function_view.dart","package:observatory/src/elements/heap_map.dart","package:observatory/src/elements/isolate_ref.dart","package:observatory/src/elements/isolate_summary.dart","package:observatory/src/elements/isolate_view.dart","package:observatory/src/elements/instance_view.dart","package:observatory/src/elements/json_view.dart","package:observatory/src/elements/library_view.dart","package:observatory/src/elements/sliding_checkbox.dart","package:observatory/src/elements/isolate_profile.dart","package:observatory/src/elements/heap_profile.dart","package:observatory/src/elements/script_view.dart","package:observatory/src/elements/stack_frame.dart","package:observatory/src/elements/stack_trace.dart","package:observatory/src/elements/vm_view.dart","package:observatory/src/elements/service_view.dart","package:observatory/src/elements/response_viewer.dart","package:observatory/src/elements/observatory_application.dart","package:observatory/src/elements/service_exception_view.dart","package:observatory/src/elements/service_error_view.dart","package:observatory/src/elements/vm_ref.dart","main.dart"]
-$.uP=!1
-F.E2()},"$0","KU",0,0,126]},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
+Id:[function(){var z,y,x,w,v
+z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.j2,new E.Cv(),C.ET,new E.ed(),C.WC,new E.wa(),C.S4,new E.Or(),C.Ro,new E.YL(),C.AV,new E.wf(),C.C0,new E.Oa(),C.eZ,new E.emv(),C.bk,new E.Lbd(),C.lH,new E.QAa(),C.kG,new E.CvS(),C.OI,new E.edy(),C.XA,new E.waE(),C.i4,new E.Ore(),C.qt,new E.YLa(),C.p1,new E.wfa(),C.bJ,new E.Oaa(),C.ox,new E.e0(),C.WZ,new E.e1(),C.i0,new E.e2(),C.iE,new E.e3(),C.f4,new E.e4(),C.VK,new E.e5(),C.aH,new E.e6(),C.PI,new E.e7(),C.aK,new E.e8(),C.GP,new E.e9(),C.Gr,new E.e10(),C.tP,new E.e11(),C.yh,new E.e12(),C.Zb,new E.e13(),C.u7,new E.e14(),C.ne,new E.e15(),C.B0,new E.e16(),C.r1,new E.e17(),C.mr,new E.e18(),C.Ek,new E.e19(),C.Pn,new E.e20(),C.YT,new E.e21(),C.WQ,new E.e22(),C.Gd,new E.e23(),C.FP,new E.e24(),C.kF,new E.e25(),C.UD,new E.e26(),C.Aq,new E.e27(),C.DS,new E.e28(),C.C9,new E.e29(),C.VF,new E.e30(),C.uU,new E.e31(),C.YJ,new E.e32(),C.eF,new E.e33(),C.oI,new E.e34(),C.ST,new E.e35(),C.QH,new E.e36(),C.qX,new E.e37(),C.rE,new E.e38(),C.nf,new E.e39(),C.pO,new E.e40(),C.EI,new E.e41(),C.JB,new E.e42(),C.Uq,new E.e43(),C.A8,new E.e44(),C.Ql,new E.e45(),C.SI,new E.e46(),C.zS,new E.e47(),C.ak,new E.e48(),C.eo,new E.e49(),C.Ge,new E.e50(),C.He,new E.e51(),C.wq,new E.e52(),C.k6,new E.e53(),C.oj,new E.e54(),C.PJ,new E.e55(),C.Ms,new E.e56(),C.q2,new E.e57(),C.d2,new E.e58(),C.kN,new E.e59(),C.fn,new E.e60(),C.eJ,new E.e61(),C.iG,new E.e62(),C.Py,new E.e63(),C.uu,new E.e64(),C.qs,new E.e65(),C.h7,new E.e66(),C.I9,new E.e67(),C.C1,new E.e68(),C.a0,new E.e69(),C.Yg,new E.e70(),C.bR,new E.e71(),C.ai,new E.e72(),C.ob,new E.e73(),C.Iv,new E.e74(),C.Wg,new E.e75(),C.tD,new E.e76(),C.nZ,new E.e77(),C.Of,new E.e78(),C.pY,new E.e79(),C.Lk,new E.e80(),C.dK,new E.e81(),C.xf,new E.e82(),C.rB,new E.e83(),C.bz,new E.e84(),C.Jx,new E.e85(),C.b5,new E.e86(),C.Lc,new E.e87(),C.hf,new E.e88(),C.uk,new E.e89(),C.kA,new E.e90(),C.Wn,new E.e91(),C.ur,new E.e92(),C.VN,new E.e93(),C.EV,new E.e94(),C.VI,new E.e95(),C.eh,new E.e96(),C.SA,new E.e97(),C.kV,new E.e98(),C.vp,new E.e99(),C.DY,new E.e100(),C.wT,new E.e101(),C.SR,new E.e102(),C.t6,new E.e103(),C.rP,new E.e104(),C.pX,new E.e105(),C.VD,new E.e106(),C.NN,new E.e107(),C.UX,new E.e108(),C.YS,new E.e109(),C.pu,new E.e110(),C.So,new E.e111(),C.EK,new E.e112(),C.td,new E.e113(),C.Gn,new E.e114(),C.zO,new E.e115(),C.eH,new E.e116(),C.ap,new E.e117(),C.Ys,new E.e118(),C.zm,new E.e119(),C.XM,new E.e120(),C.Ic,new E.e121(),C.yG,new E.e122(),C.tW,new E.e123(),C.CG,new E.e124(),C.vb,new E.e125(),C.UL,new E.e126(),C.QK,new E.e127(),C.AO,new E.e128(),C.xP,new E.e129(),C.Wm,new E.e130(),C.GR,new E.e131(),C.KX,new E.e132(),C.ja,new E.e133(),C.Dj,new E.e134(),C.Gi,new E.e135(),C.X2,new E.e136(),C.F3,new E.e137(),C.UY,new E.e138(),C.Aa,new E.e139(),C.nY,new E.e140(),C.HD,new E.e141(),C.iU,new E.e142(),C.eN,new E.e143(),C.ue,new E.e144(),C.nh,new E.e145(),C.L2,new E.e146(),C.Gs,new E.e147(),C.bE,new E.e148(),C.YD,new E.e149(),C.PX,new E.e150(),C.N8,new E.e151(),C.EA,new E.e152(),C.oW,new E.e153(),C.hd,new E.e154(),C.XY,new E.e155(),C.kz,new E.e156(),C.DW,new E.e157(),C.PM,new E.e158(),C.Nv,new E.e159(),C.TW,new E.e160(),C.xS,new E.e161(),C.mi,new E.e162(),C.zz,new E.e163(),C.hO,new E.e164(),C.ei,new E.e165(),C.HK,new E.e166(),C.je,new E.e167(),C.hN,new E.e168(),C.Q1,new E.e169(),C.ID,new E.e170(),C.z6,new E.e171(),C.bc,new E.e172(),C.kw,new E.e173(),C.ep,new E.e174(),C.J2,new E.e175(),C.zU,new E.e176(),C.bn,new E.e177(),C.mh,new E.e178(),C.Fh,new E.e179(),C.jh,new E.e180(),C.xw,new E.e181(),C.zn,new E.e182(),C.RJ,new E.e183(),C.Tc,new E.e184()],null,null)
+y=P.EF([C.aP,new E.e185(),C.cg,new E.e186(),C.j2,new E.e187(),C.S4,new E.e188(),C.AV,new E.e189(),C.bk,new E.e190(),C.lH,new E.e191(),C.kG,new E.e192(),C.XA,new E.e193(),C.i4,new E.e194(),C.bJ,new E.e195(),C.WZ,new E.e196(),C.VK,new E.e197(),C.aH,new E.e198(),C.PI,new E.e199(),C.Gr,new E.e200(),C.tP,new E.e201(),C.yh,new E.e202(),C.Zb,new E.e203(),C.ne,new E.e204(),C.B0,new E.e205(),C.mr,new E.e206(),C.YT,new E.e207(),C.WQ,new E.e208(),C.Gd,new E.e209(),C.QH,new E.e210(),C.rE,new E.e211(),C.nf,new E.e212(),C.Ql,new E.e213(),C.ak,new E.e214(),C.eo,new E.e215(),C.Ge,new E.e216(),C.He,new E.e217(),C.oj,new E.e218(),C.Ms,new E.e219(),C.d2,new E.e220(),C.fn,new E.e221(),C.Py,new E.e222(),C.uu,new E.e223(),C.qs,new E.e224(),C.a0,new E.e225(),C.rB,new E.e226(),C.Lc,new E.e227(),C.hf,new E.e228(),C.uk,new E.e229(),C.kA,new E.e230(),C.ur,new E.e231(),C.EV,new E.e232(),C.eh,new E.e233(),C.SA,new E.e234(),C.kV,new E.e235(),C.vp,new E.e236(),C.SR,new E.e237(),C.t6,new E.e238(),C.UX,new E.e239(),C.YS,new E.e240(),C.td,new E.e241(),C.zO,new E.e242(),C.Ys,new E.e243(),C.XM,new E.e244(),C.Ic,new E.e245(),C.tW,new E.e246(),C.vb,new E.e247(),C.QK,new E.e248(),C.AO,new E.e249(),C.xP,new E.e250(),C.GR,new E.e251(),C.KX,new E.e252(),C.ja,new E.e253(),C.Dj,new E.e254(),C.X2,new E.e255(),C.F3,new E.e256(),C.UY,new E.e257(),C.Aa,new E.e258(),C.nY,new E.e259(),C.HD,new E.e260(),C.iU,new E.e261(),C.eN,new E.e262(),C.Gs,new E.e263(),C.bE,new E.e264(),C.YD,new E.e265(),C.PX,new E.e266(),C.XY,new E.e267(),C.PM,new E.e268(),C.Nv,new E.e269(),C.TW,new E.e270(),C.mi,new E.e271(),C.zz,new E.e272(),C.z6,new E.e273(),C.kw,new E.e274(),C.zU,new E.e275(),C.RJ,new E.e276()],null,null)
+x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.xE,C.Mt,C.oT,C.il,C.jR,C.Mt,C.bh,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.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.k5,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Wh,C.Mt,C.tU,C.Mt,C.ce,C.Mt,C.UJ,C.il,C.BV,C.Mt,C.Io,C.Mt,C.j4,C.Mt,C.TU,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.Zj,C.Mt,C.ms,C.Mt,C.FA,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.hG,C.Vh,C.Mt,C.Zt,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.hG,C.Mt,C.l4,C.al,C.il],null,null)
+w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.h1,C.hf,C.n6],null,null),C.yS,P.EF([C.UX,C.X4],null,null),C.OG,C.CM,C.xE,P.EF([C.XA,C.CO],null,null),C.oT,P.EF([C.i4,C.Qs,C.Wm,C.QW],null,null),C.jR,P.EF([C.i4,C.h9],null,null),C.bh,P.EF([C.PI,C.lg,C.Ms,C.Gl],null,null),C.Lg,P.EF([C.S4,C.FB,C.AV,C.h1,C.B0,C.Rf,C.r1,C.nP,C.mr,C.DC],null,null),C.KO,P.EF([C.yh,C.GE],null,null),C.wk,P.EF([C.AV,C.ti,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.h1,C.YT,C.V0,C.hf,C.n6,C.UY,C.rT],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.NA],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.VQ,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.Up,C.pO,C.au,C.Lc,C.Tt,C.AO,C.UE],null,null),C.iD,P.EF([C.QH,C.kt,C.qX,C.dO,C.PM,C.jv],null,null),C.Ju,P.EF([C.kG,C.dh,C.vb,C.eq,C.UL,C.mM],null,null),C.Wz,C.CM,C.k5,P.EF([C.fn,C.cV,C.XM,C.hL],null,null),C.qF,P.EF([C.vp,C.K9],null,null),C.nX,C.CM,C.Wh,P.EF([C.oj,C.dF],null,null),C.tU,P.EF([C.qs,C.ly],null,null),C.ce,P.EF([C.aH,C.hR,C.He,C.oV,C.vb,C.eq,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.bw,C.zz,C.lS],null,null),C.UJ,C.CM,C.BV,P.EF([C.bJ,C.iF,C.ox,C.Rh],null,null),C.Io,P.EF([C.rB,C.ZQ],null,null),C.j4,P.EF([C.rB,C.ZQ],null,null),C.TU,P.EF([C.rB,C.ZQ],null,null),C.CT,P.EF([C.rB,C.ZQ],null,null),C.mq,P.EF([C.rB,C.ZQ],null,null),C.Tq,P.EF([C.SR,C.HL,C.t6,C.b6,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.Ei],null,null),C.Ey,P.EF([C.XA,C.CO,C.uk,C.Mq],null,null),C.km,P.EF([C.rB,C.ZQ,C.bz,C.Bk,C.uk,C.Mq],null,null),C.vw,P.EF([C.uk,C.Mq,C.EV,C.Ei],null,null),C.Zj,P.EF([C.Ys,C.hK],null,null),C.ms,P.EF([C.cg,C.pU,C.uk,C.Mq,C.kV,C.Os],null,null),C.FA,P.EF([C.cg,C.pU,C.kV,C.Os],null,null),C.JW,P.EF([C.aP,C.xO,C.AV,C.h1,C.hf,C.n6],null,null),C.Mf,P.EF([C.uk,C.Mq],null,null),C.Dl,P.EF([C.j2,C.zJ,C.VK,C.m8],null,null),C.l4,C.CM,C.Vh,P.EF([C.j2,C.zJ],null,null),C.Zt,P.EF([C.WZ,C.Um,C.i0,C.GH,C.Gr,C.j3,C.SA,C.KI,C.tW,C.HM,C.CG,C.Ml,C.PX,C.Cj,C.N8,C.qE],null,null),C.Sb,P.EF([C.tW,C.HM,C.CG,C.Ml],null,null),C.Th,P.EF([C.PX,C.Cj,C.XY,C.ec,C.kz,C.db],null,null),C.wH,P.EF([C.yh,C.xQ],null,null),C.pK,P.EF([C.ne,C.l6],null,null),C.il,P.EF([C.uu,C.x3,C.xP,C.hI,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.No,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Nu,C.lH,C.A5,C.zU,C.IK],null,null),C.NR,P.EF([C.rE,C.Kv],null,null),C.vu,P.EF([C.kw,C.W9],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.yc,C.RJ,C.Ce],null,null)],null,null)
+v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.j2,"app",C.ET,"assertsEnabled",C.WC,"bpt",C.S4,"busy",C.Ro,"buttonClick",C.AV,"callback",C.C0,"change",C.eZ,"changeSort",C.bk,"checked",C.lH,"checkedText",C.kG,"classTable",C.OI,"classes",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.bJ,"counters",C.ox,"countersChanged",C.WZ,"coverage",C.i0,"coverageChanged",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.PI,"displayValue",C.aK,"doAction",C.GP,"element",C.Gr,"endPos",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",C.ne,"exception",C.B0,"expand",C.r1,"expandChanged",C.mr,"expanded",C.Ek,"expander",C.Pn,"expanderStyle",C.YT,"expr",C.WQ,"field",C.Gd,"firstTokenPos",C.FP,"formatSize",C.kF,"formatTime",C.UD,"formattedAddress",C.Aq,"formattedAverage",C.DS,"formattedCollections",C.C9,"formattedDeoptId",C.VF,"formattedExclusive",C.uU,"formattedExclusiveTicks",C.YJ,"formattedInclusive",C.eF,"formattedInclusiveTicks",C.oI,"formattedLine",C.ST,"formattedTotalCollectionTime",C.QH,"fragmentation",C.qX,"fragmentationChanged",C.rE,"frame",C.nf,"function",C.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.Uq,"getFormattedValue",C.A8,"getValue",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.ak,"hasParent",C.eo,"hashLink",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.wq,"hitStyle",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.Ms,"iconClass",C.q2,"idle",C.d2,"imp",C.kN,"imports",C.fn,"instance",C.eJ,"instruction",C.iG,"instructions",C.Py,"interface",C.uu,"internal",C.qs,"io",C.h7,"ioEnabled",C.I9,"isBool",C.C1,"isComment",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.pY,"isOptimized",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.kA,"lastTokenPos",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.SA,"lines",C.kV,"link",C.vp,"list",C.DY,"loading",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.So,"newHeapCapacity",C.EK,"newHeapUsed",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.eH,"oldHeapCapacity",C.ap,"oldHeapUsed",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.tW,"pos",C.CG,"posChanged",C.vb,"profile",C.UL,"profileChanged",C.QK,"qualified",C.AO,"qualifiedName",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",C.Dj,"refreshTime",C.Gi,"relativeHashLink",C.X2,"resetAccumulator",C.F3,"response",C.UY,"result",C.Aa,"results",C.nY,"resume",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.XY,"showCoverage",C.kz,"showCoverageChanged",C.DW,"sortedRows",C.PM,"status",C.Nv,"subclass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.hN,"tipTime",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.jh,"v",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName"],null,null),!1))
+$.j8=new O.LT(z,y,C.CM)
+$.Yv=new O.bY(x,w,!1)
+$.qe=v
+A.X1([new E.e277(),new E.e278(),new E.e279(),new E.e280(),new E.e281(),new E.e282(),new E.e283(),new E.e284(),new E.e285(),new E.e286(),new E.e287(),new E.e288(),new E.e289(),new E.e290(),new E.e291(),new E.e292(),new E.e293(),new E.e294(),new E.e295(),new E.e296(),new E.e297(),new E.e298(),new E.e299(),new E.e300(),new E.e301(),new E.e302(),new E.e303(),new E.e304(),new E.e305(),new E.e306(),new E.e307(),new E.e308(),new E.e309(),new E.e310(),new E.e311(),new E.e312(),new E.e313(),new E.e314(),new E.e315(),new E.e316(),new E.e317(),new E.e318(),new E.e319(),new E.e320(),new E.e321(),new E.e322(),new E.e323(),new E.e324(),new E.e325(),new E.e326(),new E.e327(),new E.e328(),new E.e329(),new E.e330(),new E.e331(),new E.e332(),new E.e333()],!0)},"$0","Tb",0,0,13],
+em:{
+"^":"Xs:30;",
+$1:function(a){return J.Jp(a)},
+$isEH:true},
+Lb:{
+"^":"Xs:30;",
+$1:function(a){return a.gYu()},
+$isEH:true},
+QA:{
+"^":"Xs:30;",
+$1:function(a){return J.Ln(a)},
+$isEH:true},
+Cv:{
+"^":"Xs:30;",
+$1:function(a){return J.un(a)},
+$isEH:true},
+ed:{
+"^":"Xs:30;",
+$1:function(a){return a.gA3()},
+$isEH:true},
+wa:{
+"^":"Xs:30;",
+$1:function(a){return a.gqr()},
+$isEH:true},
+Or:{
+"^":"Xs:30;",
+$1:function(a){return J.nG(a)},
+$isEH:true},
+YL:{
+"^":"Xs:30;",
+$1:function(a){return J.aA(a)},
+$isEH:true},
+wf:{
+"^":"Xs:30;",
+$1:function(a){return J.WT(a)},
+$isEH:true},
+Oa:{
+"^":"Xs:30;",
+$1:function(a){return J.Wp(a)},
+$isEH:true},
+emv:{
+"^":"Xs:30;",
+$1:function(a){return J.n9(a)},
+$isEH:true},
+Lbd:{
+"^":"Xs:30;",
+$1:function(a){return J.K0(a)},
+$isEH:true},
+QAa:{
+"^":"Xs:30;",
+$1:function(a){return J.PP(a)},
+$isEH:true},
+CvS:{
+"^":"Xs:30;",
+$1:function(a){return J.yz(a)},
+$isEH:true},
+edy:{
+"^":"Xs:30;",
+$1:function(a){return J.pP(a)},
+$isEH:true},
+waE:{
+"^":"Xs:30;",
+$1:function(a){return J.E3(a)},
+$isEH:true},
+Ore:{
+"^":"Xs:30;",
+$1:function(a){return J.on(a)},
+$isEH:true},
+YLa:{
+"^":"Xs:30;",
+$1:function(a){return J.SM(a)},
+$isEH:true},
+wfa:{
+"^":"Xs:30;",
+$1:function(a){return a.goH()},
+$isEH:true},
+Oaa:{
+"^":"Xs:30;",
+$1:function(a){return J.zD(a)},
+$isEH:true},
+e0:{
+"^":"Xs:30;",
+$1:function(a){return J.jd(a)},
+$isEH:true},
+e1:{
+"^":"Xs:30;",
+$1:function(a){return J.dy(a)},
+$isEH:true},
+e2:{
+"^":"Xs:30;",
+$1:function(a){return J.RC(a)},
+$isEH:true},
+e3:{
+"^":"Xs:30;",
+$1:function(a){return a.gSL()},
+$isEH:true},
+e4:{
+"^":"Xs:30;",
+$1:function(a){return a.guH()},
+$isEH:true},
+e5:{
+"^":"Xs:30;",
+$1:function(a){return J.mP(a)},
+$isEH:true},
+e6:{
+"^":"Xs:30;",
+$1:function(a){return J.BT(a)},
+$isEH:true},
+e7:{
+"^":"Xs:30;",
+$1:function(a){return J.yA(a)},
+$isEH:true},
+e8:{
+"^":"Xs:30;",
+$1:function(a){return J.vi(a)},
+$isEH:true},
+e9:{
+"^":"Xs:30;",
+$1:function(a){return a.gFL()},
+$isEH:true},
+e10:{
+"^":"Xs:30;",
+$1:function(a){return J.rw(a)},
+$isEH:true},
+e11:{
+"^":"Xs:30;",
+$1:function(a){return a.gw2()},
+$isEH:true},
+e12:{
+"^":"Xs:30;",
+$1:function(a){return J.w8(a)},
+$isEH:true},
+e13:{
+"^":"Xs:30;",
+$1:function(a){return J.ht(a)},
+$isEH:true},
+e14:{
+"^":"Xs:30;",
+$1:function(a){return J.yi(a)},
+$isEH:true},
+e15:{
+"^":"Xs:30;",
+$1:function(a){return J.Vl(a)},
+$isEH:true},
+e16:{
+"^":"Xs:30;",
+$1:function(a){return J.kE(a)},
+$isEH:true},
+e17:{
+"^":"Xs:30;",
+$1:function(a){return J.Ak(a)},
+$isEH:true},
+e18:{
+"^":"Xs:30;",
+$1:function(a){return J.Mz(a)},
+$isEH:true},
+e19:{
+"^":"Xs:30;",
+$1:function(a){return J.S9(a)},
+$isEH:true},
+e20:{
+"^":"Xs:30;",
+$1:function(a){return a.gty()},
+$isEH:true},
+e21:{
+"^":"Xs:30;",
+$1:function(a){return J.yn(a)},
+$isEH:true},
+e22:{
+"^":"Xs:30;",
+$1:function(a){return J.pm(a)},
+$isEH:true},
+e23:{
+"^":"Xs:30;",
+$1:function(a){return a.ghY()},
+$isEH:true},
+e24:{
+"^":"Xs:30;",
+$1:function(a){return J.WX(a)},
+$isEH:true},
+e25:{
+"^":"Xs:30;",
+$1:function(a){return J.Qv(a)},
+$isEH:true},
+e26:{
+"^":"Xs:30;",
+$1:function(a){return a.gZd()},
+$isEH:true},
+e27:{
+"^":"Xs:30;",
+$1:function(a){return J.lT(a)},
+$isEH:true},
+e28:{
+"^":"Xs:30;",
+$1:function(a){return J.M4(a)},
+$isEH:true},
+e29:{
+"^":"Xs:30;",
+$1:function(a){return a.gkA()},
+$isEH:true},
+e30:{
+"^":"Xs:30;",
+$1:function(a){return a.gGK()},
+$isEH:true},
+e31:{
+"^":"Xs:30;",
+$1:function(a){return a.gan()},
+$isEH:true},
+e32:{
+"^":"Xs:30;",
+$1:function(a){return a.gcQ()},
+$isEH:true},
+e33:{
+"^":"Xs:30;",
+$1:function(a){return a.gS7()},
+$isEH:true},
+e34:{
+"^":"Xs:30;",
+$1:function(a){return a.gP3()},
+$isEH:true},
+e35:{
+"^":"Xs:30;",
+$1:function(a){return J.PY(a)},
+$isEH:true},
+e36:{
+"^":"Xs:30;",
+$1:function(a){return J.bu(a)},
+$isEH:true},
+e37:{
+"^":"Xs:30;",
+$1:function(a){return J.VL(a)},
+$isEH:true},
+e38:{
+"^":"Xs:30;",
+$1:function(a){return J.zN(a)},
+$isEH:true},
+e39:{
+"^":"Xs:30;",
+$1:function(a){return J.FI(a)},
+$isEH:true},
+e40:{
+"^":"Xs:30;",
+$1:function(a){return J.WY(a)},
+$isEH:true},
+e41:{
+"^":"Xs:30;",
+$1:function(a){return a.gmu()},
+$isEH:true},
+e42:{
+"^":"Xs:30;",
+$1:function(a){return a.gCO()},
+$isEH:true},
+e43:{
+"^":"Xs:30;",
+$1:function(a){return a.gwy()},
+$isEH:true},
+e44:{
+"^":"Xs:30;",
+$1:function(a){return a.gyY()},
+$isEH:true},
+e45:{
+"^":"Xs:30;",
+$1:function(a){return J.wO(a)},
+$isEH:true},
+e46:{
+"^":"Xs:30;",
+$1:function(a){return a.gGf()},
+$isEH:true},
+e47:{
+"^":"Xs:30;",
+$1:function(a){return a.gUa()},
+$isEH:true},
+e48:{
+"^":"Xs:30;",
+$1:function(a){return J.Mb(a)},
+$isEH:true},
+e49:{
+"^":"Xs:30;",
+$1:function(a){return a.gHP()},
+$isEH:true},
+e50:{
+"^":"Xs:30;",
+$1:function(a){return J.z3(a)},
+$isEH:true},
+e51:{
+"^":"Xs:30;",
+$1:function(a){return J.YQ(a)},
+$isEH:true},
+e52:{
+"^":"Xs:30;",
+$1:function(a){return J.B9(a)},
+$isEH:true},
+e53:{
+"^":"Xs:30;",
+$1:function(a){return J.fA(a)},
+$isEH:true},
+e54:{
+"^":"Xs:30;",
+$1:function(a){return J.cd(a)},
+$isEH:true},
+e55:{
+"^":"Xs:30;",
+$1:function(a){return a.gL4()},
+$isEH:true},
+e56:{
+"^":"Xs:30;",
+$1:function(a){return J.pB(a)},
+$isEH:true},
+e57:{
+"^":"Xs:30;",
+$1:function(a){return a.gaj()},
+$isEH:true},
+e58:{
+"^":"Xs:30;",
+$1:function(a){return a.giq()},
+$isEH:true},
+e59:{
+"^":"Xs:30;",
+$1:function(a){return a.gBm()},
+$isEH:true},
+e60:{
+"^":"Xs:30;",
+$1:function(a){return J.xR(a)},
+$isEH:true},
+e61:{
+"^":"Xs:30;",
+$1:function(a){return a.gNI()},
+$isEH:true},
+e62:{
+"^":"Xs:30;",
+$1:function(a){return a.gva()},
+$isEH:true},
+e63:{
+"^":"Xs:30;",
+$1:function(a){return a.gKt()},
+$isEH:true},
+e64:{
+"^":"Xs:30;",
+$1:function(a){return J.ns(a)},
+$isEH:true},
+e65:{
+"^":"Xs:30;",
+$1:function(a){return J.Ew(a)},
+$isEH:true},
+e66:{
+"^":"Xs:30;",
+$1:function(a){return a.gwg()},
+$isEH:true},
+e67:{
+"^":"Xs:30;",
+$1:function(a){return J.Ja(a)},
+$isEH:true},
+e68:{
+"^":"Xs:30;",
+$1:function(a){return a.gUB()},
+$isEH:true},
+e69:{
+"^":"Xs:30;",
+$1:function(a){return J.is(a)},
+$isEH:true},
+e70:{
+"^":"Xs:30;",
+$1:function(a){return a.gkU()},
+$isEH:true},
+e71:{
+"^":"Xs:30;",
+$1:function(a){return J.wz(a)},
+$isEH:true},
+e72:{
+"^":"Xs:30;",
+$1:function(a){return J.FN(a)},
+$isEH:true},
+e73:{
+"^":"Xs:30;",
+$1:function(a){return J.ls(a)},
+$isEH:true},
+e74:{
+"^":"Xs:30;",
+$1:function(a){return J.yq(a)},
+$isEH:true},
+e75:{
+"^":"Xs:30;",
+$1:function(a){return J.SZ(a)},
+$isEH:true},
+e76:{
+"^":"Xs:30;",
+$1:function(a){return J.DL(a)},
+$isEH:true},
+e77:{
+"^":"Xs:30;",
+$1:function(a){return J.z4(a)},
+$isEH:true},
+e78:{
+"^":"Xs:30;",
+$1:function(a){return J.cU(a)},
+$isEH:true},
+e79:{
+"^":"Xs:30;",
+$1:function(a){return a.gYG()},
+$isEH:true},
+e80:{
+"^":"Xs:30;",
+$1:function(a){return J.UM(a)},
+$isEH:true},
+e81:{
+"^":"Xs:30;",
+$1:function(a){return J.ZN(a)},
+$isEH:true},
+e82:{
+"^":"Xs:30;",
+$1:function(a){return J.xa(a)},
+$isEH:true},
+e83:{
+"^":"Xs:30;",
+$1:function(a){return J.aT(a)},
+$isEH:true},
+e84:{
+"^":"Xs:30;",
+$1:function(a){return J.hb(a)},
+$isEH:true},
+e85:{
+"^":"Xs:30;",
+$1:function(a){return a.gi2()},
+$isEH:true},
+e86:{
+"^":"Xs:30;",
+$1:function(a){return a.gEB()},
+$isEH:true},
+e87:{
+"^":"Xs:30;",
+$1:function(a){return J.Iz(a)},
+$isEH:true},
+e88:{
+"^":"Xs:30;",
+$1:function(a){return J.Q4(a)},
+$isEH:true},
+e89:{
+"^":"Xs:30;",
+$1:function(a){return J.MQ(a)},
+$isEH:true},
+e90:{
+"^":"Xs:30;",
+$1:function(a){return a.gSK()},
+$isEH:true},
+e91:{
+"^":"Xs:30;",
+$1:function(a){return J.q8(a)},
+$isEH:true},
+e92:{
+"^":"Xs:30;",
+$1:function(a){return a.ghX()},
+$isEH:true},
+e93:{
+"^":"Xs:30;",
+$1:function(a){return a.gvU()},
+$isEH:true},
+e94:{
+"^":"Xs:30;",
+$1:function(a){return J.jl(a)},
+$isEH:true},
+e95:{
+"^":"Xs:30;",
+$1:function(a){return a.gRd()},
+$isEH:true},
+e96:{
+"^":"Xs:30;",
+$1:function(a){return J.zY(a)},
+$isEH:true},
+e97:{
+"^":"Xs:30;",
+$1:function(a){return J.de(a)},
+$isEH:true},
+e98:{
+"^":"Xs:30;",
+$1:function(a){return J.Ds(a)},
+$isEH:true},
+e99:{
+"^":"Xs:30;",
+$1:function(a){return J.cO(a)},
+$isEH:true},
+e100:{
+"^":"Xs:30;",
+$1:function(a){return a.gn0()},
+$isEH:true},
+e101:{
+"^":"Xs:30;",
+$1:function(a){return a.geH()},
+$isEH:true},
+e102:{
+"^":"Xs:30;",
+$1:function(a){return J.Yf(a)},
+$isEH:true},
+e103:{
+"^":"Xs:30;",
+$1:function(a){return J.kv(a)},
+$isEH:true},
+e104:{
+"^":"Xs:30;",
+$1:function(a){return J.QD(a)},
+$isEH:true},
+e105:{
+"^":"Xs:30;",
+$1:function(a){return J.z2(a)},
+$isEH:true},
+e106:{
+"^":"Xs:30;",
+$1:function(a){return J.ZL(a)},
+$isEH:true},
+e107:{
+"^":"Xs:30;",
+$1:function(a){return J.ba(a)},
+$isEH:true},
+e108:{
+"^":"Xs:30;",
+$1:function(a){return J.Zv(a)},
+$isEH:true},
+e109:{
+"^":"Xs:30;",
+$1:function(a){return J.tE(a)},
+$isEH:true},
+e110:{
+"^":"Xs:30;",
+$1:function(a){return J.yK(a)},
+$isEH:true},
+e111:{
+"^":"Xs:30;",
+$1:function(a){return a.gxs()},
+$isEH:true},
+e112:{
+"^":"Xs:30;",
+$1:function(a){return a.gCi()},
+$isEH:true},
+e113:{
+"^":"Xs:30;",
+$1:function(a){return J.Jj(a)},
+$isEH:true},
+e114:{
+"^":"Xs:30;",
+$1:function(a){return J.t8(a)},
+$isEH:true},
+e115:{
+"^":"Xs:30;",
+$1:function(a){return a.gL1()},
+$isEH:true},
+e116:{
+"^":"Xs:30;",
+$1:function(a){return a.gQB()},
+$isEH:true},
+e117:{
+"^":"Xs:30;",
+$1:function(a){return a.guq()},
+$isEH:true},
+e118:{
+"^":"Xs:30;",
+$1:function(a){return J.EC(a)},
+$isEH:true},
+e119:{
+"^":"Xs:30;",
+$1:function(a){return J.JG(a)},
+$isEH:true},
+e120:{
+"^":"Xs:30;",
+$1:function(a){return J.AF(a)},
+$isEH:true},
+e121:{
+"^":"Xs:30;",
+$1:function(a){return J.LB(a)},
+$isEH:true},
+e122:{
+"^":"Xs:30;",
+$1:function(a){return J.Kl(a)},
+$isEH:true},
+e123:{
+"^":"Xs:30;",
+$1:function(a){return J.io(a)},
+$isEH:true},
+e124:{
+"^":"Xs:30;",
+$1:function(a){return J.Ff(a)},
+$isEH:true},
+e125:{
+"^":"Xs:30;",
+$1:function(a){return J.ks(a)},
+$isEH:true},
+e126:{
+"^":"Xs:30;",
+$1:function(a){return J.CN(a)},
+$isEH:true},
+e127:{
+"^":"Xs:30;",
+$1:function(a){return J.Pr(a)},
+$isEH:true},
+e128:{
+"^":"Xs:30;",
+$1:function(a){return J.Sz(a)},
+$isEH:true},
+e129:{
+"^":"Xs:30;",
+$1:function(a){return J.Gc(a)},
+$isEH:true},
+e130:{
+"^":"Xs:30;",
+$1:function(a){return J.Dd(a)},
+$isEH:true},
+e131:{
+"^":"Xs:30;",
+$1:function(a){return J.Cm(a)},
+$isEH:true},
+e132:{
+"^":"Xs:30;",
+$1:function(a){return J.AK(a)},
+$isEH:true},
+e133:{
+"^":"Xs:30;",
+$1:function(a){return J.tF(a)},
+$isEH:true},
+e134:{
+"^":"Xs:30;",
+$1:function(a){return J.QX(a)},
+$isEH:true},
+e135:{
+"^":"Xs:30;",
+$1:function(a){return a.gw6()},
+$isEH:true},
+e136:{
+"^":"Xs:30;",
+$1:function(a){return J.iL(a)},
+$isEH:true},
+e137:{
+"^":"Xs:30;",
+$1:function(a){return J.k7(a)},
+$isEH:true},
+e138:{
+"^":"Xs:30;",
+$1:function(a){return J.uW(a)},
+$isEH:true},
+e139:{
+"^":"Xs:30;",
+$1:function(a){return J.W2(a)},
+$isEH:true},
+e140:{
+"^":"Xs:30;",
+$1:function(a){return J.UT(a)},
+$isEH:true},
+e141:{
+"^":"Xs:30;",
+$1:function(a){return J.jH(a)},
+$isEH:true},
+e142:{
+"^":"Xs:30;",
+$1:function(a){return J.jo(a)},
+$isEH:true},
+e143:{
+"^":"Xs:30;",
+$1:function(a){return a.gVc()},
+$isEH:true},
+e144:{
+"^":"Xs:30;",
+$1:function(a){return a.gpF()},
+$isEH:true},
+e145:{
+"^":"Xs:30;",
+$1:function(a){return J.oL(a)},
+$isEH:true},
+e146:{
+"^":"Xs:30;",
+$1:function(a){return a.gA6()},
+$isEH:true},
+e147:{
+"^":"Xs:30;",
+$1:function(a){return J.Ry(a)},
+$isEH:true},
+e148:{
+"^":"Xs:30;",
+$1:function(a){return J.UP(a)},
+$isEH:true},
+e149:{
+"^":"Xs:30;",
+$1:function(a){return J.fw(a)},
+$isEH:true},
+e150:{
+"^":"Xs:30;",
+$1:function(a){return J.fx(a)},
+$isEH:true},
+e151:{
+"^":"Xs:30;",
+$1:function(a){return J.Vi(a)},
+$isEH:true},
+e152:{
+"^":"Xs:30;",
+$1:function(a){return a.ghp()},
+$isEH:true},
+e153:{
+"^":"Xs:30;",
+$1:function(a){return J.P5(a)},
+$isEH:true},
+e154:{
+"^":"Xs:30;",
+$1:function(a){return a.gzS()},
+$isEH:true},
+e155:{
+"^":"Xs:30;",
+$1:function(a){return J.iY(a)},
+$isEH:true},
+e156:{
+"^":"Xs:30;",
+$1:function(a){return J.kS(a)},
+$isEH:true},
+e157:{
+"^":"Xs:30;",
+$1:function(a){return a.gGD()},
+$isEH:true},
+e158:{
+"^":"Xs:30;",
+$1:function(a){return J.Td(a)},
+$isEH:true},
+e159:{
+"^":"Xs:30;",
+$1:function(a){return a.gDo()},
+$isEH:true},
+e160:{
+"^":"Xs:30;",
+$1:function(a){return J.j1(a)},
+$isEH:true},
+e161:{
+"^":"Xs:30;",
+$1:function(a){return J.Aw(a)},
+$isEH:true},
+e162:{
+"^":"Xs:30;",
+$1:function(a){return J.dY(a)},
+$isEH:true},
+e163:{
+"^":"Xs:30;",
+$1:function(a){return J.OL(a)},
+$isEH:true},
+e164:{
+"^":"Xs:30;",
+$1:function(a){return a.gki()},
+$isEH:true},
+e165:{
+"^":"Xs:30;",
+$1:function(a){return a.gZn()},
+$isEH:true},
+e166:{
+"^":"Xs:30;",
+$1:function(a){return a.gvs()},
+$isEH:true},
+e167:{
+"^":"Xs:30;",
+$1:function(a){return a.gVh()},
+$isEH:true},
+e168:{
+"^":"Xs:30;",
+$1:function(a){return a.gZX()},
+$isEH:true},
+e169:{
+"^":"Xs:30;",
+$1:function(a){return J.SG(a)},
+$isEH:true},
+e170:{
+"^":"Xs:30;",
+$1:function(a){return J.eU(a)},
+$isEH:true},
+e171:{
+"^":"Xs:30;",
+$1:function(a){return a.gVF()},
+$isEH:true},
+e172:{
+"^":"Xs:30;",
+$1:function(a){return a.gkw()},
+$isEH:true},
+e173:{
+"^":"Xs:30;",
+$1:function(a){return J.K2(a)},
+$isEH:true},
+e174:{
+"^":"Xs:30;",
+$1:function(a){return J.uy(a)},
+$isEH:true},
+e175:{
+"^":"Xs:30;",
+$1:function(a){return a.gEy()},
+$isEH:true},
+e176:{
+"^":"Xs:30;",
+$1:function(a){return J.Kd(a)},
+$isEH:true},
+e177:{
+"^":"Xs:30;",
+$1:function(a){return J.Sl(a)},
+$isEH:true},
+e178:{
+"^":"Xs:30;",
+$1:function(a){return a.gJk()},
+$isEH:true},
+e179:{
+"^":"Xs:30;",
+$1:function(a){return J.Nl(a)},
+$isEH:true},
+e180:{
+"^":"Xs:30;",
+$1:function(a){return a.gFc()},
+$isEH:true},
+e181:{
+"^":"Xs:30;",
+$1:function(a){return a.gZ3()},
+$isEH:true},
+e182:{
+"^":"Xs:30;",
+$1:function(a){return a.gYe()},
+$isEH:true},
+e183:{
+"^":"Xs:30;",
+$1:function(a){return J.I2(a)},
+$isEH:true},
+e184:{
+"^":"Xs:30;",
+$1:function(a){return a.gzz()},
+$isEH:true},
+e185:{
+"^":"Xs:50;",
+$2:function(a,b){J.Ex(a,b)},
+$isEH:true},
+e186:{
+"^":"Xs:50;",
+$2:function(a,b){J.a8(a,b)},
+$isEH:true},
+e187:{
+"^":"Xs:50;",
+$2:function(a,b){J.oO(a,b)},
+$isEH:true},
+e188:{
+"^":"Xs:50;",
+$2:function(a,b){J.l7(a,b)},
+$isEH:true},
+e189:{
+"^":"Xs:50;",
+$2:function(a,b){J.kB(a,b)},
+$isEH:true},
+e190:{
+"^":"Xs:50;",
+$2:function(a,b){J.Ae(a,b)},
+$isEH:true},
+e191:{
+"^":"Xs:50;",
+$2:function(a,b){J.IX(a,b)},
+$isEH:true},
+e192:{
+"^":"Xs:50;",
+$2:function(a,b){J.WI(a,b)},
+$isEH:true},
+e193:{
+"^":"Xs:50;",
+$2:function(a,b){J.o0(a,b)},
+$isEH:true},
+e194:{
+"^":"Xs:50;",
+$2:function(a,b){J.fH(a,b)},
+$isEH:true},
+e195:{
+"^":"Xs:50;",
+$2:function(a,b){J.Fg(a,b)},
+$isEH:true},
+e196:{
+"^":"Xs:50;",
+$2:function(a,b){J.Zg(a,b)},
+$isEH:true},
+e197:{
+"^":"Xs:50;",
+$2:function(a,b){J.LM(a,b)},
+$isEH:true},
+e198:{
+"^":"Xs:50;",
+$2:function(a,b){J.qq(a,b)},
+$isEH:true},
+e199:{
+"^":"Xs:50;",
+$2:function(a,b){J.Pk(a,b)},
+$isEH:true},
+e200:{
+"^":"Xs:50;",
+$2:function(a,b){J.Yz(a,b)},
+$isEH:true},
+e201:{
+"^":"Xs:50;",
+$2:function(a,b){a.sw2(b)},
+$isEH:true},
+e202:{
+"^":"Xs:50;",
+$2:function(a,b){J.Qr(a,b)},
+$isEH:true},
+e203:{
+"^":"Xs:50;",
+$2:function(a,b){J.P6(a,b)},
+$isEH:true},
+e204:{
+"^":"Xs:50;",
+$2:function(a,b){J.BC(a,b)},
+$isEH:true},
+e205:{
+"^":"Xs:50;",
+$2:function(a,b){J.VJ(a,b)},
+$isEH:true},
+e206:{
+"^":"Xs:50;",
+$2:function(a,b){J.Qf(a,b)},
+$isEH:true},
+e207:{
+"^":"Xs:50;",
+$2:function(a,b){J.Sm(a,b)},
+$isEH:true},
+e208:{
+"^":"Xs:50;",
+$2:function(a,b){J.JZ(a,b)},
+$isEH:true},
+e209:{
+"^":"Xs:50;",
+$2:function(a,b){a.shY(b)},
+$isEH:true},
+e210:{
+"^":"Xs:50;",
+$2:function(a,b){J.Nf(a,b)},
+$isEH:true},
+e211:{
+"^":"Xs:50;",
+$2:function(a,b){J.Pl(a,b)},
+$isEH:true},
+e212:{
+"^":"Xs:50;",
+$2:function(a,b){J.Pq(a,b)},
+$isEH:true},
+e213:{
+"^":"Xs:50;",
+$2:function(a,b){J.ye(a,b)},
+$isEH:true},
+e214:{
+"^":"Xs:50;",
+$2:function(a,b){J.Nh(a,b)},
+$isEH:true},
+e215:{
+"^":"Xs:50;",
+$2:function(a,b){a.sHP(b)},
+$isEH:true},
+e216:{
+"^":"Xs:50;",
+$2:function(a,b){J.AI(a,b)},
+$isEH:true},
+e217:{
+"^":"Xs:50;",
+$2:function(a,b){J.nA(a,b)},
+$isEH:true},
+e218:{
+"^":"Xs:50;",
+$2:function(a,b){J.fb(a,b)},
+$isEH:true},
+e219:{
+"^":"Xs:50;",
+$2:function(a,b){J.tv(a,b)},
+$isEH:true},
+e220:{
+"^":"Xs:50;",
+$2:function(a,b){a.siq(b)},
+$isEH:true},
+e221:{
+"^":"Xs:50;",
+$2:function(a,b){J.Qy(a,b)},
+$isEH:true},
+e222:{
+"^":"Xs:50;",
+$2:function(a,b){a.sKt(b)},
+$isEH:true},
+e223:{
+"^":"Xs:50;",
+$2:function(a,b){J.Oo(a,b)},
+$isEH:true},
+e224:{
+"^":"Xs:50;",
+$2:function(a,b){J.vU(a,b)},
+$isEH:true},
+e225:{
+"^":"Xs:50;",
+$2:function(a,b){J.pj(a,b)},
+$isEH:true},
+e226:{
+"^":"Xs:50;",
+$2:function(a,b){J.uM(a,b)},
+$isEH:true},
+e227:{
+"^":"Xs:50;",
+$2:function(a,b){J.Er(a,b)},
+$isEH:true},
+e228:{
+"^":"Xs:50;",
+$2:function(a,b){J.GZ(a,b)},
+$isEH:true},
+e229:{
+"^":"Xs:50;",
+$2:function(a,b){J.hS(a,b)},
+$isEH:true},
+e230:{
+"^":"Xs:50;",
+$2:function(a,b){a.sSK(b)},
+$isEH:true},
+e231:{
+"^":"Xs:50;",
+$2:function(a,b){a.shX(b)},
+$isEH:true},
+e232:{
+"^":"Xs:50;",
+$2:function(a,b){J.cl(a,b)},
+$isEH:true},
+e233:{
+"^":"Xs:50;",
+$2:function(a,b){J.Jb(a,b)},
+$isEH:true},
+e234:{
+"^":"Xs:50;",
+$2:function(a,b){J.qr(a,b)},
+$isEH:true},
+e235:{
+"^":"Xs:50;",
+$2:function(a,b){J.jM(a,b)},
+$isEH:true},
+e236:{
+"^":"Xs:50;",
+$2:function(a,b){J.A4(a,b)},
+$isEH:true},
+e237:{
+"^":"Xs:50;",
+$2:function(a,b){J.wD(a,b)},
+$isEH:true},
+e238:{
+"^":"Xs:50;",
+$2:function(a,b){J.wJ(a,b)},
+$isEH:true},
+e239:{
+"^":"Xs:50;",
+$2:function(a,b){J.oJ(a,b)},
+$isEH:true},
+e240:{
+"^":"Xs:50;",
+$2:function(a,b){J.DF(a,b)},
+$isEH:true},
+e241:{
+"^":"Xs:50;",
+$2:function(a,b){J.mb(a,b)},
+$isEH:true},
+e242:{
+"^":"Xs:50;",
+$2:function(a,b){a.sL1(b)},
+$isEH:true},
+e243:{
+"^":"Xs:50;",
+$2:function(a,b){J.XF(a,b)},
+$isEH:true},
+e244:{
+"^":"Xs:50;",
+$2:function(a,b){J.SF(a,b)},
+$isEH:true},
+e245:{
+"^":"Xs:50;",
+$2:function(a,b){J.HF(a,b)},
+$isEH:true},
+e246:{
+"^":"Xs:50;",
+$2:function(a,b){J.Xg(a,b)},
+$isEH:true},
+e247:{
+"^":"Xs:50;",
+$2:function(a,b){J.CJ(a,b)},
+$isEH:true},
+e248:{
+"^":"Xs:50;",
+$2:function(a,b){J.P2(a,b)},
+$isEH:true},
+e249:{
+"^":"Xs:50;",
+$2:function(a,b){J.fv(a,b)},
+$isEH:true},
+e250:{
+"^":"Xs:50;",
+$2:function(a,b){J.kT(a,b)},
+$isEH:true},
+e251:{
+"^":"Xs:50;",
+$2:function(a,b){J.Sj(a,b)},
+$isEH:true},
+e252:{
+"^":"Xs:50;",
+$2:function(a,b){J.AJ(a,b)},
+$isEH:true},
+e253:{
+"^":"Xs:50;",
+$2:function(a,b){J.w7(a,b)},
+$isEH:true},
+e254:{
+"^":"Xs:50;",
+$2:function(a,b){J.ME(a,b)},
+$isEH:true},
+e255:{
+"^":"Xs:50;",
+$2:function(a,b){J.kX(a,b)},
+$isEH:true},
+e256:{
+"^":"Xs:50;",
+$2:function(a,b){J.S5(a,b)},
+$isEH:true},
+e257:{
+"^":"Xs:50;",
+$2:function(a,b){J.q0(a,b)},
+$isEH:true},
+e258:{
+"^":"Xs:50;",
+$2:function(a,b){J.EJ(a,b)},
+$isEH:true},
+e259:{
+"^":"Xs:50;",
+$2:function(a,b){J.iH(a,b)},
+$isEH:true},
+e260:{
+"^":"Xs:50;",
+$2:function(a,b){J.Hr(a,b)},
+$isEH:true},
+e261:{
+"^":"Xs:50;",
+$2:function(a,b){J.R6(a,b)},
+$isEH:true},
+e262:{
+"^":"Xs:50;",
+$2:function(a,b){a.sVc(b)},
+$isEH:true},
+e263:{
+"^":"Xs:50;",
+$2:function(a,b){J.By(a,b)},
+$isEH:true},
+e264:{
+"^":"Xs:50;",
+$2:function(a,b){J.M3(a,b)},
+$isEH:true},
+e265:{
+"^":"Xs:50;",
+$2:function(a,b){J.JV(a,b)},
+$isEH:true},
+e266:{
+"^":"Xs:50;",
+$2:function(a,b){J.ry(a,b)},
+$isEH:true},
+e267:{
+"^":"Xs:50;",
+$2:function(a,b){J.C5(a,b)},
+$isEH:true},
+e268:{
+"^":"Xs:50;",
+$2:function(a,b){J.Tx(a,b)},
+$isEH:true},
+e269:{
+"^":"Xs:50;",
+$2:function(a,b){a.sDo(b)},
+$isEH:true},
+e270:{
+"^":"Xs:50;",
+$2:function(a,b){J.H3(a,b)},
+$isEH:true},
+e271:{
+"^":"Xs:50;",
+$2:function(a,b){J.t3(a,b)},
+$isEH:true},
+e272:{
+"^":"Xs:50;",
+$2:function(a,b){J.GT(a,b)},
+$isEH:true},
+e273:{
+"^":"Xs:50;",
+$2:function(a,b){a.sVF(b)},
+$isEH:true},
+e274:{
+"^":"Xs:50;",
+$2:function(a,b){J.yO(a,b)},
+$isEH:true},
+e275:{
+"^":"Xs:50;",
+$2:function(a,b){J.ZU(a,b)},
+$isEH:true},
+e276:{
+"^":"Xs:50;",
+$2:function(a,b){J.Jn(a,b)},
+$isEH:true},
+e277:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e278:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e279:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e280:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e281:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e282:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("nav-bar",C.Zj)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e283:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e284:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e285:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e286:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e287:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e288:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e289:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e290:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e291:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e292:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e293:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e294:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e295:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e296:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e297:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e298:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e299:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e300:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e301:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("collapsible-content",C.bh)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e302:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e303:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e304:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("script-inset",C.Zt)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e305:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e306:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e307:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e308:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e309:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e310:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("io-http-server-view",C.Wh)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e311:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e312:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e313:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e314:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e315:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("isolate-shared-summary",C.TU)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e316:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("isolate-counter-chart",C.BV)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e317:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e318:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("instance-view",C.k5)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e319:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e320:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e321:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e322:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e323:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e324:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e325:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e326:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e327:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e328:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e329:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("response-viewer",C.Vh)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e330:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e331:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e332:{
+"^":"Xs:47;",
+$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
+$isEH:true},
+e333:{
+"^":"Xs:47;",
+$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,{
 "^":"",
-pz:{
-"^":["pv;BW%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grs:[function(a){return a.BW},null,null,1,0,337,"msg",308,311],
-srs:[function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},null,null,3,0,338,30,[],"msg",308],
-pA:[function(a,b){J.am(a.BW).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.jy]},
-static:{t4:[function(a){var z,y,x,w
+G6:{
+"^":"Vf;BW,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+grs:function(a){return a.BW},
+srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
+RF:[function(a,b){J.LE(a.BW).wM(b)},"$1","gvC",2,0,15,65],
+static:{Dw:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.J0.ZL(a)
-C.J0.oX(a)
-return a},null,null,0,0,115,"new BreakpointListElement$created"]}},
-"+BreakpointListElement":[340],
-pv:{
+C.J0.XI(a)
+return a}}},
+Vf:{
 "^":"uL+Pi;",
 $isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
 "^":"",
-Tg:{
-"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.tSc]},
-static:{rt:[function(a){var z,y,x,w
+eW:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{rt:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.oq.ZL(a)
-C.oq.oX(a)
-return a},null,null,0,0,115,"new ClassRefElement$created"]}},
-"+ClassRefElement":[342]}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
+a.on=z
+a.BA=y
+a.LL=w
+C.YZz.ZL(a)
+C.YZz.XI(a)
+return a}}}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
 "^":"",
-Jc:{
-"^":["Dsd;Om%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Om},null,null,1,0,337,"cls",308,311],
-sdG:[function(a,b){a.Om=this.ct(a,C.XA,a.Om,b)},null,null,3,0,338,30,[],"cls",308],
-vV:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
-Xe:[function(a,b){return J.QP(a.Om).cv(J.WB(J.F8(a.Om),"/retained"))},"$1","ghN",2,0,343,344,[],"retainedSize"],
-pA:[function(a,b){J.am(a.Om).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.aQx]},
-static:{zg:[function(a){var z,y,x,w
+aC:{
+"^":"Vfx;yB,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gRu:function(a){return a.yB},
+sRu:function(a,b){a.yB=this.ct(a,C.XA,a.yB,b)},
+vV:[function(a,b){return J.aT(a.yB).ox(J.WB(J.F8(a.yB),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZ2",2,0,66,67],
+S1:[function(a,b){return J.aT(a.yB).ox(J.WB(J.F8(a.yB),"/retained"))},"$1","ghN",2,0,66,68],
+RF:[function(a,b){J.LE(a.yB).wM(b)},"$1","gvC",2,0,15,65],
+static:{zB:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.ka.ZL(a)
-C.ka.oX(a)
-return a},null,null,0,0,115,"new ClassViewElement$created"]}},
-"+ClassViewElement":[345],
-Dsd:{
+C.ka.XI(a)
+return a}}},
+Vfx:{
 "^":"uL+Pi;",
 $isd3:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
 "^":"",
-CN:{
-"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.tY},null,null,1,0,346,"code",309],
-P9:[function(a,b){Q.xI.prototype.P9.call(this,a,b)
-this.ct(a,C.b1,0,1)},"$1","gLe",2,0,116,242,[],"refChanged"],
-"@":function(){return[C.H3]},
-static:{On:[function(a){var z,y,x,w
+VY:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gtT:function(a){return a.tY},
+Qj:[function(a,b){Q.xI.prototype.Qj.call(this,a,b)
+this.ct(a,C.i4,0,1)},"$1","gLe",2,0,30,34],
+static:{On:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.IK.ZL(a)
-C.IK.oX(a)
-return a},null,null,0,0,115,"new CodeRefElement$created"]}},
-"+CodeRefElement":[342]}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
+a.on=z
+a.BA=y
+a.LL=w
+C.tA.ZL(a)
+C.tA.XI(a)
+return a}}}}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
 "^":"",
 Be:{
-"^":["tuj;Xx%-347,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtT:[function(a){return a.Xx},null,null,1,0,346,"code",308,311],
-stT:[function(a,b){a.Xx=this.ct(a,C.b1,a.Xx,b)},null,null,3,0,348,30,[],"code",308],
-i4:[function(a){var z
-Z.uL.prototype.i4.call(this,a)
+"^":"Dsd;Xx,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gtT:function(a){return a.Xx},
+stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
+q0:function(a){var z
+Z.uL.prototype.q0.call(this,a)
 z=a.Xx
 if(z==null)return
-J.SK(z).ml(new F.hf())},"$0","gQd",0,0,126,"enteredView"],
-pA:[function(a,b){J.am(a.Xx).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-m2:[function(a,b){var z,y,x
+J.SK(z).ml(new F.Ma())},
+RF:[function(a,b){J.LE(a.Xx).wM(b)},"$1","gvC",2,0,15,65],
+m2:function(a,b){var z,y,x
 z=J.Vs(b).MW.getAttribute("data-jump-target")
 if(z==="")return
 y=H.BU(z,null,null)
 x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
 if(x==null)return
-return x},"$1","gnV",2,0,349,82,[],"_findJumpTarget"],
+return x},
 YI:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gff",6,0,350,21,[],351,[],82,[],"mouseOver"],
+J.pP(z).h(0,"highlight")},"$3","gKJ",6,0,69,1,70,71],
 ZC:[function(a,b,c,d){var z=this.m2(a,d)
 if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,350,21,[],351,[],82,[],"mouseOut"],
-"@":function(){return[C.xW]},
-static:{Fe:[function(a){var z,y,x,w
+J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,69,1,70,71],
+static:{f9:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.ux.ZL(a)
-C.ux.oX(a)
-return a},null,null,0,0,115,"new CodeViewElement$created"]}},
-"+CodeViewElement":[352],
-tuj:{
+C.ux.XI(a)
+return a}}},
+Dsd:{
 "^":"uL+Pi;",
 $isd3:true},
-hf:{
-"^":"Tp:348;",
-$1:[function(a){a.QW()},"$1",null,2,0,348,289,[],"call"],
-$isEH:true},
-"+ hf":[315]}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
+Ma:{
+"^":"Xs:72;",
+$1:[function(a){a.OF()},"$1",null,2,0,null,55,"call"],
+$isEH:true}}],["collapsible_content_element","package:observatory/src/elements/collapsible_content.dart",,R,{
 "^":"",
 i6:{
-"^":["Vct;zh%-305,HX%-305,Uy%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gAQ:[function(a){return a.zh},null,null,1,0,312,"iconClass",308,309],
-sAQ:[function(a,b){a.zh=this.ct(a,C.Di,a.zh,b)},null,null,3,0,32,30,[],"iconClass",308],
-gai:[function(a){return a.HX},null,null,1,0,312,"displayValue",308,309],
-sai:[function(a,b){a.HX=this.ct(a,C.Jw,a.HX,b)},null,null,3,0,32,30,[],"displayValue",308],
-gxj:[function(a){return a.Uy},null,null,1,0,307,"collapsed"],
-sxj:[function(a,b){a.Uy=b
-this.SS(a)},null,null,3,0,310,353,[],"collapsed"],
-i4:[function(a){Z.uL.prototype.i4.call(this,a)
-this.SS(a)},"$0","gQd",0,0,126,"enteredView"],
-jp:[function(a,b,c,d){a.Uy=a.Uy!==!0
-this.SS(a)
-this.SS(a)},"$3","gl8",6,0,350,21,[],351,[],82,[],"toggleDisplay"],
-SS:[function(a){var z,y
-z=a.Uy
-y=a.zh
-if(z===!0){a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-down")
-a.HX=this.ct(a,C.Jw,a.HX,"none")}else{a.zh=this.ct(a,C.Di,y,"glyphicon glyphicon-chevron-up")
-a.HX=this.ct(a,C.Jw,a.HX,"block")}},"$0","glg",0,0,126,"_refresh"],
-"@":function(){return[C.Gu]},
-static:{"^":"Vl<-305,DI<-305",Hv:[function(a){var z,y,x,w
+"^":"tuj;Xf,VA,P2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gDX:function(a){return a.Xf},
+sDX:function(a,b){a.Xf=this.ct(a,C.Ms,a.Xf,b)},
+gvu:function(a){return a.VA},
+svu:function(a,b){a.VA=this.ct(a,C.PI,a.VA,b)},
+q0:function(a){var z
+Z.uL.prototype.q0.call(this,a)
+z=a.Xf
+if(a.P2){a.Xf=this.ct(a,C.Ms,z,"glyphicon glyphicon-chevron-down")
+a.VA=this.ct(a,C.PI,a.VA,"none")}else{a.Xf=this.ct(a,C.Ms,z,"glyphicon glyphicon-chevron-up")
+a.VA=this.ct(a,C.PI,a.VA,"block")}},
+static:{"^":"ALz,DI",IT:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.zh="glyphicon glyphicon-chevron-down"
-a.HX="none"
-a.Uy=!0
-a.SO=z
-a.B7=y
-a.X0=w
-C.j8.ZL(a)
-C.j8.oX(a)
-return a},null,null,0,0,115,"new CollapsibleContentElement$created"]}},
-"+CollapsibleContentElement":[354],
-Vct:{
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Xf="glyphicon glyphicon-chevron-down"
+a.VA="none"
+a.P2=!0
+a.on=z
+a.BA=y
+a.LL=w
+C.T0.ZL(a)
+C.T0.XI(a)
+return a}}},
+tuj:{
 "^":"uL+Pi;",
 $isd3:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
 "^":"",
-lw:{
-"^":["Nr;GV%-304,Hu%-304,nx%-85,oM%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-goE:[function(a){return a.GV},null,null,1,0,307,"expanded",308,309],
-soE:[function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},null,null,3,0,310,30,[],"expanded",308],
-gO9:[function(a){return a.Hu},null,null,1,0,307,"busy",308,309],
-sO9:[function(a,b){a.Hu=this.ct(a,C.S4,a.Hu,b)},null,null,3,0,310,30,[],"busy",308],
-gFR:[function(a){return a.nx},null,null,1,0,115,"callback",308,311],
+JI:{
+"^":"Nr;GV,uo,nx,oM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+goE:function(a){return a.GV},
+soE:function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},
+gv8:function(a){return a.uo},
+sv8: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)},
-sFR:[function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},null,null,3,0,116,30,[],"callback",308],
-git:[function(a){return a.oM},null,null,1,0,307,"expand",308,311],
-sit:[function(a,b){a.oM=this.ct(a,C.dI,a.oM,b)},null,null,3,0,310,30,[],"expand",308],
-rL:[function(a,b){var z=a.oM
-a.GV=this.ct(a,C.mr,a.GV,z)},"$1","gzr",2,0,169,242,[],"expandChanged"],
-Ey:[function(a){var z=a.GV
+sFR:function(a,b){a.nx=this.ct(a,C.AV,a.nx,b)},
+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.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,15,34],
+Db:[function(a){var z=a.GV
 a.GV=this.ct(a,C.mr,z,z!==!0)
-a.Hu=this.ct(a,C.S4,a.Hu,!1)},"$0","goJ",0,0,126,"doneCallback"],
-AZ:[function(a,b,c,d){var z=a.Hu
+a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,13],
+AZ:[function(a,b,c,d){var z=a.uo
 if(z===!0)return
-if(a.nx!=null){a.Hu=this.ct(a,C.S4,z,!0)
-this.AV(a,a.GV!==!0,this.goJ(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gmd",6,0,313,118,[],199,[],289,[],"toggleExpand"],
-"@":function(){return[C.DKS]},
-static:{fR:[function(a){var z,y,x,w
+if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
+this.AV(a,a.GV!==!0,this.gN2(a))}else{z=a.GV
+a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,54,22,23,55],
+static:{p7:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.GV=!1
-a.Hu=!1
+a.uo=!1
 a.nx=null
 a.oM=!1
-a.SO=z
-a.B7=y
-a.X0=w
+a.on=z
+a.BA=y
+a.LL=w
 C.O0.ZL(a)
-C.O0.oX(a)
-return a},null,null,0,0,115,"new CurlyBlockElement$created"]}},
-"+CurlyBlockElement":[355],
+C.O0.XI(a)
+return a}}},
 Nr:{
-"^":"xc+Pi;",
-$isd3:true}}],["custom_element.polyfill","package:custom_element/polyfill.dart",,B,{
+"^":"ir+Pi;",
+$isd3:true}}],["dart._internal","dart:_internal",,H,{
 "^":"",
-G9:function(){var z,y
-z=$.cM()
-if(z==null)return!0
-y=J.UQ(z,"CustomElements")
-if(y==null)return"registerElement" in document
-return J.de(J.UQ(y,"ready"),!0)},
-wJ:{
-"^":"Tp:115;",
-$0:[function(){if(B.G9())return P.Ab(null,null)
-var z=H.VM(new W.RO(document,"WebComponentsReady",!1),[null])
-return z.gtH(z)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["dart._internal","dart:_internal",,H,{
-"^":"",
-bQ:[function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},"$2","Mn",4,0,null,127,[],128,[]],
-Ck:[function(a,b){var z
+bQ:function(a,b){var z
+for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},
+Ck:function(a,b){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.$1(z.lo)===!0)return!0
-return!1},"$2","cs",4,0,null,127,[],128,[]],
-n3:[function(a,b,c){var z
+return!1},
+n3:function(a,b,c){var z
 for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b=c.$2(b,z.lo)
-return b},"$3","cS",6,0,null,127,[],129,[],130,[]],
-mx:[function(a,b,c){var z,y,x
-for(y=0;x=$.RM(),y<x.length;++y)if(x[y]===a)return H.d(b)+"..."+H.d(c)
+return b},
+mx:function(a,b,c){var z,y,x
+for(y=0;x=$.ng(),y<x.length;++y)if(x[y]===a)return H.d(b)+"..."+H.d(c)
 z=P.p9("")
-try{$.RM().push(a)
+try{$.ng().push(a)
 z.KF(b)
 z.We(a,", ")
-z.KF(c)}finally{x=$.RM()
+z.KF(c)}finally{x=$.ng()
 if(0>=x.length)return H.e(x,0)
-x.pop()}return z.gvM()},"$3","l7",6,0,null,127,[],131,[],132,[]],
-rd:[function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,a.length-1,b)},"$2","xX",4,0,null,76,[],133,[]],
-K0:[function(a,b,c){var z=J.Wx(b)
+x.pop()}return z.gvM()},
+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))},"$3","Ze",6,0,null,76,[],134,[],135,[]],
-qG:[function(a,b,c,d,e){var z,y,x,w
-H.K0(a,b,c)
+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.xH(c,b)
-if(J.de(z,0))return
+if(J.xC(z,0))return
 if(J.u6(e,0))throw H.b(P.u(e))
 y=J.x(d)
-if(!!y.$isList){x=e
+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(P.w("Not enough elements"))
-H.tb(w,x,a,b,z)},"$5","it",10,0,null,76,[],134,[],135,[],113,[],136,[]],
-IC:[function(a,b,c){var z,y,x,w,v,u
+x=0}if(J.xZ(J.WB(x,z),J.q8(w)))throw H.b(H.ar())
+H.Gj(w,x,a,b,z)},
+IC:function(a,b,c){var z,y,x,w,v,u
 z=J.Wx(b)
 if(z.C(b,0)||z.D(b,a.length))throw H.b(P.TE(b,0,a.length))
 y=J.x(c)
@@ -2745,137 +3972,129 @@
 H.qG(a,z,w,a,b)
 for(z=y.gA(c);z.G();b=u){v=z.gl()
 u=J.WB(b,1)
-C.Nm.u(a,b,v)}},"$3","QB",6,0,null,76,[],15,[],127,[]],
-ed:[function(a,b,c){var z,y
+C.Nm.u(a,b,v)}},
+xr:function(a,b,c){var z,y
 if(b<0||b>a.length)throw H.b(P.TE(b,0,a.length))
-for(z=J.GP(c);z.G();b=y){y=b+1
-C.Nm.u(a,b,z.gl())}},"$3","Y1",6,0,null,76,[],15,[],127,[]],
-tb:[function(a,b,c,d,e){var z,y,x,w,v
+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")},
+Gj:function(a,b,c,d,e){var z,y,x,w,v
 z=J.Wx(b)
 if(z.C(b,d))for(y=J.xH(z.g(b,e),1),x=J.xH(J.WB(d,e),1),z=J.U6(a);w=J.Wx(y),w.F(y,b);y=w.W(y,1),x=J.xH(x,1))C.Nm.u(c,x,z.t(a,y))
-else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},"$5","e8",10,0,null,137,[],138,[],139,[],140,[],141,[]],
-TK:[function(a,b,c,d){var z
+else for(w=J.U6(a),x=d,y=b;v=J.Wx(y),v.C(y,z.g(b,e));y=v.g(y,1),x=J.WB(x,1))C.Nm.u(c,x,w.t(a,y))},
+TK:function(a,b,c,d){var z
 if(c>=a.length)return-1
-if(c<0)c=0
-for(z=c;z<d;++z){if(z<0||z>=a.length)return H.e(a,z)
-if(J.de(a[z],b))return z}return-1},"$4","vu",8,0,null,118,[],142,[],88,[],143,[]],
-lO:[function(a,b,c){var z,y
+for(z=c;z<d;++z){if(z>=a.length)return H.e(a,z)
+if(J.xC(a[z],b))return z}return-1},
+lO:function(a,b,c){var z,y
 if(typeof c!=="number")return c.C()
 if(c<0)return-1
 z=a.length
 if(c>=z)c=z-1
 for(y=c;y>=0;--y){if(y>=a.length)return H.e(a,y)
-if(J.de(a[y],b))return y}return-1},"$3","MW",6,0,null,118,[],142,[],88,[]],
-ZE:[function(a,b,c,d){if(J.Bl(J.xH(c,b),32))H.w9(a,b,c,d)
-else H.d4(a,b,c,d)},"$4","UR",8,0,null,118,[],144,[],145,[],133,[]],
-w9:[function(a,b,c,d){var z,y,x,w,v,u
-for(z=J.WB(b,1),y=J.U6(a);x=J.Wx(z),x.E(z,c);z=x.g(z,1)){w=y.t(a,z)
-v=z
-while(!0){u=J.Wx(v)
-if(!(u.D(v,b)&&J.z8(d.$2(y.t(a,u.W(v,1)),w),0)))break
-y.u(a,v,y.t(a,u.W(v,1)))
-v=u.W(v,1)}y.u(a,v,w)}},"$4","f7",8,0,null,118,[],144,[],145,[],133,[]],
-d4:[function(a,b,a0,a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c
-z=J.Wx(a0)
-y=J.Ts(J.WB(z.W(a0,b),1),6)
-x=J.Qc(b)
-w=x.g(b,y)
-v=z.W(a0,y)
-u=J.Ts(x.g(b,a0),2)
-t=J.Wx(u)
-s=t.W(u,y)
-r=t.g(u,y)
+if(J.xC(a[y],b))return y}return-1},
+ZE:function(a,b,c,d){if(c-b<=32)H.w9(a,b,c,d)
+else H.d4(a,b,c,d)},
+w9:function(a,b,c,d){var z,y,x,w,v
+for(z=b+1,y=J.U6(a);z<=c;++z){x=y.t(a,z)
+w=z
+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)}},
+d4: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)
+y=b+z
+x=c-z
+w=C.jn.cU(b+c,2)
+v=w-z
+u=w+z
 t=J.U6(a)
+s=t.t(a,y)
+r=t.t(a,v)
 q=t.t(a,w)
-p=t.t(a,s)
-o=t.t(a,u)
-n=t.t(a,r)
-m=t.t(a,v)
-if(J.z8(a1.$2(q,p),0)){l=p
+p=t.t(a,u)
+o=t.t(a,x)
+if(J.xZ(d.$2(s,r),0)){n=r
+r=s
+s=n}if(J.xZ(d.$2(p,o),0)){n=o
+o=p
+p=n}if(J.xZ(d.$2(s,q),0)){n=q
+q=s
+s=n}if(J.xZ(d.$2(r,q),0)){n=q
+q=r
+r=n}if(J.xZ(d.$2(s,p),0)){n=p
+p=s
+s=n}if(J.xZ(d.$2(q,p),0)){n=p
 p=q
-q=l}if(J.z8(a1.$2(n,m),0)){l=m
-m=n
-n=l}if(J.z8(a1.$2(q,o),0)){l=o
-o=q
-q=l}if(J.z8(a1.$2(p,o),0)){l=o
+q=n}if(J.xZ(d.$2(r,o),0)){n=o
+o=r
+r=n}if(J.xZ(d.$2(r,q),0)){n=q
+q=r
+r=n}if(J.xZ(d.$2(p,o),0)){n=o
 o=p
-p=l}if(J.z8(a1.$2(q,n),0)){l=n
-n=q
-q=l}if(J.z8(a1.$2(o,n),0)){l=n
-n=o
-o=l}if(J.z8(a1.$2(p,m),0)){l=m
-m=p
-p=l}if(J.z8(a1.$2(p,o),0)){l=o
-o=p
-p=l}if(J.z8(a1.$2(n,m),0)){l=m
-m=n
-n=l}t.u(a,w,q)
-t.u(a,u,o)
-t.u(a,v,m)
-t.u(a,s,t.t(a,b))
-t.u(a,r,t.t(a,a0))
-k=x.g(b,1)
-j=z.W(a0,1)
-if(J.de(a1.$2(p,n),0)){for(i=k;z=J.Wx(i),z.E(i,j);i=z.g(i,1)){h=t.t(a,i)
-g=a1.$2(h,p)
-x=J.x(g)
-if(x.n(g,0))continue
-if(x.C(g,0)){if(!z.n(i,k)){t.u(a,i,t.t(a,k))
-t.u(a,k,h)}k=J.WB(k,1)}else for(;!0;){g=a1.$2(t.t(a,j),p)
-x=J.Wx(g)
-if(x.D(g,0)){j=J.xH(j,1)
-continue}else{f=J.Wx(j)
-if(x.C(g,0)){t.u(a,i,t.t(a,k))
-e=J.WB(k,1)
-t.u(a,k,t.t(a,j))
-d=f.W(j,1)
-t.u(a,j,h)
-j=d
-k=e
-break}else{t.u(a,i,t.t(a,j))
-d=f.W(j,1)
-t.u(a,j,h)
-j=d
-break}}}}c=!0}else{for(i=k;z=J.Wx(i),z.E(i,j);i=z.g(i,1)){h=t.t(a,i)
-if(J.u6(a1.$2(h,p),0)){if(!z.n(i,k)){t.u(a,i,t.t(a,k))
-t.u(a,k,h)}k=J.WB(k,1)}else if(J.z8(a1.$2(h,n),0))for(;!0;)if(J.z8(a1.$2(t.t(a,j),n),0)){j=J.xH(j,1)
-if(J.u6(j,i))break
-continue}else{x=J.Wx(j)
-if(J.u6(a1.$2(t.t(a,j),p),0)){t.u(a,i,t.t(a,k))
-e=J.WB(k,1)
-t.u(a,k,t.t(a,j))
-d=x.W(j,1)
-t.u(a,j,h)
-j=d
-k=e}else{t.u(a,i,t.t(a,j))
-d=x.W(j,1)
-t.u(a,j,h)
-j=d}break}}c=!1}z=J.Wx(k)
-t.u(a,b,t.t(a,z.W(k,1)))
-t.u(a,z.W(k,1),p)
-x=J.Qc(j)
-t.u(a,a0,t.t(a,x.g(j,1)))
-t.u(a,x.g(j,1),n)
-H.ZE(a,b,z.W(k,2),a1)
-H.ZE(a,x.g(j,2),a0,a1)
-if(c)return
-if(z.C(k,w)&&x.D(j,v)){for(;J.de(a1.$2(t.t(a,k),p),0);)k=J.WB(k,1)
-for(;J.de(a1.$2(t.t(a,j),n),0);)j=J.xH(j,1)
-for(i=k;z=J.Wx(i),z.E(i,j);i=z.g(i,1)){h=t.t(a,i)
-if(J.de(a1.$2(h,p),0)){if(!z.n(i,k)){t.u(a,i,t.t(a,k))
-t.u(a,k,h)}k=J.WB(k,1)}else if(J.de(a1.$2(h,n),0))for(;!0;)if(J.de(a1.$2(t.t(a,j),n),0)){j=J.xH(j,1)
-if(J.u6(j,i))break
-continue}else{x=J.Wx(j)
-if(J.u6(a1.$2(t.t(a,j),p),0)){t.u(a,i,t.t(a,k))
-e=J.WB(k,1)
-t.u(a,k,t.t(a,j))
-d=x.W(j,1)
-t.u(a,j,h)
-j=d
-k=e}else{t.u(a,i,t.t(a,j))
-d=x.W(j,1)
-t.u(a,j,h)
-j=d}break}}H.ZE(a,k,j,a1)}else H.ZE(a,k,j,a1)},"$4","Hm",8,0,null,118,[],144,[],145,[],133,[]],
+p=n}t.u(a,y,s)
+t.u(a,w,q)
+t.u(a,x,o)
+t.u(a,v,t.t(a,b))
+t.u(a,u,t.t(a,c))
+m=b+1
+l=c-1
+if(J.xC(d.$2(r,p),0)){for(k=m;k<=l;++k){j=t.t(a,k)
+i=d.$2(j,r)
+h=J.x(i)
+if(h.n(i,0))continue
+if(h.C(i,0)){if(k!==m){t.u(a,k,t.t(a,m))
+t.u(a,m,j)}++m}else for(;!0;){i=d.$2(t.t(a,l),r)
+h=J.Wx(i)
+if(h.D(i,0)){--l
+continue}else{g=l-1
+if(h.C(i,0)){t.u(a,k,t.t(a,m))
+f=m+1
+t.u(a,m,t.t(a,l))
+t.u(a,l,j)
+l=g
+m=f
+break}else{t.u(a,k,t.t(a,l))
+t.u(a,l,j)
+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.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))
+f=m+1
+t.u(a,m,t.t(a,l))
+t.u(a,l,j)
+l=g
+m=f}else{t.u(a,k,t.t(a,l))
+t.u(a,l,j)
+l=g}break}}e=!1}h=m-1
+t.u(a,b,t.t(a,h))
+t.u(a,h,r)
+h=l+1
+t.u(a,c,t.t(a,h))
+t.u(a,h,p)
+H.ZE(a,b,m-2,d)
+H.ZE(a,l+2,c,d)
+if(e)return
+if(m<y&&l>x){for(;J.xC(d.$2(t.t(a,m),r),0);)++m
+for(;J.xC(d.$2(t.t(a,l),p),0);)--l
+for(k=m;k<=l;++k){j=t.t(a,k)
+if(J.xC(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.xC(d.$2(j,p),0))for(;!0;)if(J.xC(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))
+f=m+1
+t.u(a,m,t.t(a,l))
+t.u(a,l,j)
+l=g
+m=f}else{t.u(a,k,t.t(a,l))
+t.u(a,l,j)
+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)])},
@@ -2885,14 +4104,14 @@
 y=0
 for(;y<z;++y){b.$1(this.Zv(0,y))
 if(z!==this.gB(this))throw H.b(P.a4(this))}},
-gl0:function(a){return J.de(this.gB(this),0)},
-grZ:function(a){if(J.de(this.gB(this),0))throw H.b(P.w("No elements"))
+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.xH(this.gB(this),1))},
 tg:function(a,b){var z,y
 z=this.gB(this)
 if(typeof z!=="number")return H.s(z)
 y=0
-for(;y<z;++y){if(J.de(this.Zv(0,y),b))return!0
+for(;y<z;++y){if(J.xC(this.Zv(0,y),b))return!0
 if(z!==this.gB(this))throw H.b(P.a4(this))}return!1},
 Vr:function(a,b){var z,y
 z=this.gB(this)
@@ -2919,15 +4138,7 @@
 w.vM+=typeof u==="string"?u:H.d(u)
 if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
 ev:function(a,b){return P.mW.prototype.ev.call(this,this,b)},
-ez:[function(a,b){return H.VM(new H.A8(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"xP",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},128,[]],
-es:function(a,b,c){var z,y,x
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
-y=b
-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.q9(this,b,null,null)},
+ez:[function(a,b){return H.VM(new H.lJ(this,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.cX,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},46],
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(this,"aL",0)])
 C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
@@ -2948,12 +4159,12 @@
 gMa:function(){var z,y
 z=J.q8(this.l6)
 y=this.AN
-if(y==null||J.z8(y,z))return z
+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
+if(J.xZ(y,z))return z
 return y},
 gB:function(a){var z,y,x
 z=J.q8(this.l6)
@@ -2964,17 +4175,17 @@
 return J.xH(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.i4(this.l6,z)},
+return J.i9(this.l6,z)},
 eR:function(a,b){if(J.u6(b,0))throw H.b(P.N(b))
-return H.q9(this.l6,J.WB(this.SH,b),this.AN,null)},
+return H.j5(this.l6,J.WB(this.SH,b),this.AN,null)},
 qZ:function(a,b){var z,y,x
-if(J.u6(b,0))throw H.b(P.N(b))
+if(b<0)throw H.b(P.N(b))
 z=this.AN
 y=this.SH
-if(z==null)return H.q9(this.l6,y,J.WB(y,b),null)
+if(z==null)return H.j5(this.l6,y,J.WB(y,b),null)
 else{x=J.WB(y,b)
 if(J.u6(z,x))return this
-return H.q9(this.l6,y,x,null)}},
+return H.j5(this.l6,y,x,null)}},
 Hd:function(a,b,c,d){var z,y,x
 z=this.SH
 y=J.Wx(z)
@@ -2982,7 +4193,7 @@
 x=this.AN
 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:{q9:function(a,b,c,d){var z=H.VM(new H.nH(a,b,c),[d])
+static:{j5:function(a,b,c,d){var z=H.VM(new H.nH(a,b,c),[d])
 z.Hd(a,b,c,d)
 return z}}},
 a7:{
@@ -2992,7 +4203,7 @@
 z=this.l6
 y=J.U6(z)
 x=y.gB(z)
-if(!J.de(this.SW,x))throw H.b(P.a4(z))
+if(!J.xC(this.SW,x))throw H.b(P.a4(z))
 w=this.G7
 if(typeof x!=="number")return H.s(x)
 if(w>=x){this.lo=null
@@ -3001,15 +4212,14 @@
 i1:{
 "^":"mW;l6,T6",
 mb:function(a){return this.T6.$1(a)},
-gA:function(a){var z=new H.MH(null,J.GP(this.l6),this.T6)
+gA:function(a){var z=new H.MH(null,J.mY(this.l6),this.T6)
 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.MQ(this.l6))},
-Zv:function(a,b){return this.mb(J.i4(this.l6,b))},
 $asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]},
+$ascX:function(a,b){return[b]},
 static:{K1: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:{
@@ -3024,18 +4234,18 @@
 return!1},
 gl:function(){return this.lo},
 $asAC:function(a,b){return[b]}},
-A8:{
+lJ:{
 "^":"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.i4(this.CR,b))},
+Zv:function(a,b){return this.mb(J.i9(this.CR,b))},
 $asaL:function(a,b){return[b]},
 $asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]},
+$ascX:function(a,b){return[b]},
 $isyN:true},
 U5:{
 "^":"mW;l6,T6",
-gA:function(a){var z=new H.SO(J.GP(this.l6),this.T6)
+gA:function(a){var z=new H.SO(J.mY(this.l6),this.T6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 SO:{
@@ -3044,1325 +4254,194 @@
 G:function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
 return!1},
 gl:function(){return this.OI.gl()}},
-kV:{
+zs:{
 "^":"mW;l6,T6",
-gA:function(a){var z=new H.rR(J.GP(this.l6),this.T6,C.Gw,null)
+gA:function(a){var z=new H.rR(J.mY(this.l6),this.T6,C.Gw,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 $asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]}},
+$ascX:function(a,b){return[b]}},
 rR:{
-"^":"a;OI,T6,C2,lo",
+"^":"a;OI,T6,e0,lo",
 mb:function(a){return this.T6.$1(a)},
 gl:function(){return this.lo},
 G:function(){var z,y
-z=this.C2
+z=this.e0
 if(z==null)return!1
 for(y=this.OI;!z.G();){this.lo=null
-if(y.G()){this.C2=null
-z=J.GP(this.mb(y.gl()))
-this.C2=z}else return!1}this.lo=this.C2.gl()
+if(y.G()){this.e0=null
+z=J.mY(this.mb(y.gl()))
+this.e0=z}else return!1}this.lo=this.e0.gl()
 return!0}},
-ao:{
-"^":"mW;l6,Vg",
-gA:function(a){var z=this.l6
-z=new H.y9(z.gA(z),this.Vg)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-static:{Dw:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.u(b))
-if(!!a.$isyN)return H.VM(new H.YZ(a,b),[c])
-return H.VM(new H.ao(a,b),[c])}}},
-YZ:{
-"^":"ao;l6,Vg",
-gB:function(a){var z,y
-z=this.l6
-y=z.gB(z)
-z=this.Vg
-if(J.z8(y,z))return z
-return y},
-$isyN:true},
-y9:{
-"^":"AC;OI,GE",
-G:function(){var z=J.xH(this.GE,1)
-this.GE=z
-if(J.J5(z,0))return this.OI.G()
-this.GE=-1
-return!1},
-gl:function(){if(J.u6(this.GE,0))return
-return this.OI.gl()}},
-AM:{
-"^":"mW;l6,FT",
-eR:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
-return H.ke(this.l6,J.WB(this.FT,b),H.Kp(this,0))},
-gA:function(a){var z=this.l6
-z=new H.U1(z.gA(z),this.FT)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-jb:function(a,b,c){var z=this.FT
-if(typeof z!=="number"||Math.floor(z)!==z||J.u6(z,0))throw H.b(P.C3(z))},
-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.bk(a,b,c)},bk: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",
-gB:function(a){var z,y
-z=this.l6
-y=J.xH(z.gB(z),this.FT)
-if(J.J5(y,0))return y
-return 0},
-$isyN:true},
-U1:{
-"^":"AC;OI,FT",
-G:function(){var z,y,x
-z=this.OI
-y=0
-while(!0){x=this.FT
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-z.G();++y}this.FT=0
-return z.G()},
-gl:function(){return this.OI.gl()}},
-yq:{
+Xc:{
 "^":"a;",
 G:function(){return!1},
 gl:function(){return}},
-SU7:{
+Lj:{
 "^":"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"))},
+aP: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"))},
 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"))}},
-Tv:{
+Zl:{
 "^":"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"))},
 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"))},
+aP: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"))},
-GT:function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},
-np:function(a){return this.GT(a,null)},
+XP:function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},
+Jd:function(a){return this.XP(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)},
+vg: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"))},
-$isList:true,
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null},
-w2Y:{
-"^":"ar+Tv;",
-$isList:true,
+$iscX:true,
+$ascX:null},
+XC:{
+"^":"rm+Zl;",
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null},
+$iscX:true,
+$ascX:null},
 iK:{
 "^":"aL;CR",
 gB:function(a){return J.q8(this.CR)},
-Zv:function(a,b){var z,y
+Zv:function(a,b){var z,y,x
 z=this.CR
 y=J.U6(z)
-return y.Zv(z,J.xH(J.xH(y.gB(z),1),b))}},
+x=y.gB(z)
+if(typeof b!=="number")return H.s(b)
+return y.Zv(z,x-1-b)}},
 GD:{
-"^":"a;fN>",
+"^":"a;fN<",
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isGD&&J.de(this.fN,b.fN)},
+return!!J.x(b).$isGD&&J.xC(this.fN,b.fN)},
 giO:function(a){var z=J.v1(this.fN)
 if(typeof z!=="number")return H.s(z)
 return 536870911&664597*z},
 bu:function(a){return"Symbol(\""+H.d(this.fN)+"\")"},
 $isGD:true,
-$iswv:true,
-static:{"^":"RWj,ES1,quP,L3,Np,p1",u1:[function(a){var z,y
-z=J.U6(a)
-if(z.gl0(a)!==!0){y=$.bw().Ej
-if(typeof a!=="string")H.vh(P.u(a))
-y=y.test(a)}else y=!0
-if(y)return a
-if(z.nC(a,"_"))throw H.b(P.u("\""+H.d(a)+"\" is a private identifier"))
-throw H.b(P.u("\""+H.d(a)+"\" is not a valid (qualified) symbol name"))},"$1","kf",2,0,null,12,[]]}}}],["dart._js_mirrors","dart:_js_mirrors",,H,{
+$isIN:true,
+static:{"^":"RWj,ES1,quP,KGP,q3,CI"}}}],["dart._js_names","dart:_js_names",,H,{
 "^":"",
-TS:[function(a){return J.GL(a)},"$1","DP",2,0,null,146,[]],
-YC:[function(a){if(a==null)return
-return new H.GD(a)},"$1","Rc",2,0,null,12,[]],
-vn:[function(a){if(!!J.x(a).$isTp)return new H.Sz(a,4)
-else return new H.iu(a,4)},"$1","Yf",2,0,147,148,[]],
-jO:[function(a){var z,y
-z=$.Sl().t(0,a)
-y=J.x(a)
-if(y.n(a,"dynamic"))return $.P8()
-if(y.n(a,"void"))return $.oj()
-return H.tT(H.YC(z==null?a:z),a)},"$1","vC",2,0,null,149,[]],
-tT:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-z=J.U6(b)
-y=z.u8(b,"/")
-if(y>-1)b=z.yn(b,y+1)
-z=$.tY
-if(z==null){z=H.Pq()
-$.tY=z}x=z[b]
-if(x!=null)return x
-z=J.U6(b)
-w=z.u8(b,"<")
-if(w!==-1){v=H.jO(z.Nj(b,0,w)).gJi()
-x=new H.bl(v,z.Nj(b,w+1,J.xH(z.gB(b),1)),null,null,null,null,null,null,null,null,null,null,null,null,null,v.gIf())
-$.tY[b]=x
-return x}u=H.mN(b)
-if(u==null){t=init.functionAliases[b]
-if(t!=null){x=new H.ng(b,null,a)
-x.CM=new H.Ar(init.metadata[t],null,null,null,x)
-$.tY[b]=x
-return x}throw H.b(P.f("Cannot find class for: "+H.d(H.TS(a))))}s=H.SG(u)?u.constructor:u
-r=s["@"]
-if(r==null){q=null
-p=null}else{q=r["^"]
-z=J.x(q)
-if(!!z.$isList){p=z.Mu(q,1,z.gB(q)).br(0)
-q=z.t(q,0)}else p=null
-if(typeof q!=="string")q=""}z=J.uH(q,";")
-if(0>=z.length)return H.e(z,0)
-o=J.uH(z[0],"+")
-if(o.length>1&&$.Sl().t(0,b)==null)x=H.MJ(o,b)
-else{n=new H.Wf(b,u,q,p,H.Pq(),null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,a)
-m=s.prototype["<>"]
-if(m==null||m.length===0)x=n
-else{for(z=m.length,l="dynamic",k=1;k<z;++k)l+=",dynamic"
-x=new H.bl(n,l,null,null,null,null,null,null,null,null,null,null,null,null,null,n.If)}}$.tY[b]=x
-return x},"$2","ER",4,0,null,146,[],149,[]],
-Vv:[function(a){var z,y,x
-z=P.L5(null,null,null,null,null)
-for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(!x.gxV()&&!x.glT()&&!x.ghB())z.u(0,x.gIf(),x)}return z},"$1","yM",2,0,null,150,[]],
-Fk:[function(a){var z,y,x
-z=P.L5(null,null,null,null,null)
-for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.gxV())z.u(0,x.gIf(),x)}return z},"$1","Pj",2,0,null,150,[]],
-EK:[function(a,b){var z,y,x,w
-z=P.L5(null,null,null,null,null)
-for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.glT()){w=x.gIf()
-if(b.nb.t(0,w)!=null)continue
-z.u(0,x.gIf(),x)}}return z},"$2","rX",4,0,null,150,[],151,[]],
-vE:[function(a,b){var z,y,x,w,v
-z=P.L5(null,null,null,null,null)
-z.FV(0,b)
-for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();){x=y.lo
-if(x.ghB()){w=x.gIf().fN
-v=J.U6(w)
-if(!!J.x(z.t(0,H.YC(v.Nj(w,0,J.xH(v.gB(w),1))))).$isRY)continue}if(x.gxV())continue
-z.to(x.gIf(),new H.YX(x))}return z},"$2","un",4,0,null,150,[],152,[]],
-MJ:[function(a,b){var z,y,x,w
-z=[]
-for(y=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);y.G();)z.push(H.jO(y.lo))
-x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
-x.G()
-w=x.lo
-for(;x.G();)w=new H.BI(w,x.lo,null,null,H.YC(b))
-return w},"$2","R9",4,0,null,153,[],149,[]],
-w2:[function(a,b){var z,y,x
-z=J.U6(a)
-y=0
-while(!0){x=z.gB(a)
-if(typeof x!=="number")return H.s(x)
-if(!(y<x))break
-if(J.de(z.t(a,y).gIf(),H.YC(b)))return y;++y}throw H.b(P.u("Type variable not present in list."))},"$2","CE",4,0,null,155,[],12,[]],
-Jf:[function(a,b){var z,y,x,w,v,u,t
-z={}
-z.a=null
-for(y=a;y!=null;){x=J.x(y)
-if(!!x.$isMs){z.a=y
-break}if(!!x.$isrN)break
-y=y.gXP()}if(b==null)return $.P8()
-else{x=z.a
-if(x==null)w=H.Ko(b,null)
-else if(x.gHA())if(typeof b==="number"){v=init.metadata[b]
-u=x.gNy()
-return J.UQ(u,H.w2(u,J.O6(v)))}else w=H.Ko(b,null)
-else{z=new H.rh(z)
-if(typeof b==="number"){t=z.$1(b)
-if(!!J.x(t).$iscw)return t}w=H.Ko(b,new H.iW(z))}}if(w!=null)return H.jO(w)
-return P.re(C.yQ)},"$2","xN",4,0,null,156,[],11,[]],
-fb:[function(a,b){if(a==null)return b
-return H.YC(H.d(J.GL(J.Ba(a)))+"."+H.d(b.fN))},"$2","WS",4,0,null,156,[],157,[]],
-pj:[function(a){var z,y,x,w
-z=a["@"]
-if(z!=null)return z()
-if(typeof a!="function")return C.xD
-if("$metadataIndex" in a){y=a.$reflectionInfo.splice(a.$metadataIndex)
-y.fixed$length=init
-return H.VM(new H.A8(y,new H.ye()),[null,null]).br(0)}x=Function.prototype.toString.call(a)
-w=C.xB.cn(x,new H.VR(H.v4("\"[0-9,]*\";?[ \n\r]*}",!1,!0,!1),null,null))
-if(w===-1)return C.xD;++w
-return H.VM(new H.A8(H.VM(new H.A8(C.xB.Nj(x,w,C.xB.XU(x,"\"",w)).split(","),P.ya()),[null,null]),new H.O1()),[null,null]).br(0)},"$1","C7",2,0,null,158,[]],
-jw:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r
-z=J.x(b)
-if(!!z.$isList){y=H.Mk(z.t(b,0),",")
-x=z.Jk(b,1)}else{y=typeof b==="string"?H.Mk(b,","):[]
-x=null}for(z=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=x!=null,v=0;z.G();){u=z.lo
-if(w){t=v+1
-if(v>=x.length)return H.e(x,v)
-s=x[v]
-v=t}else s=null
-r=H.pS(u,s,a,c)
-if(r!=null)d.push(r)}},"$4","Sv",8,0,null,156,[],159,[],67,[],57,[]],
-Mk:[function(a,b){var z=J.U6(a)
-if(z.gl0(a)===!0)return H.VM([],[J.O])
-return z.Fr(a,b)},"$2","EO",4,0,null,14,[],106,[]],
-BF:[function(a){switch(a){case"==":case"[]":case"*":case"/":case"%":case"~/":case"+":case"<<":case">>":case">=":case">":case"<=":case"<":case"&":case"^":case"|":case"-":case"unary-":case"[]=":case"~":return!0
-default:return!1}},"$1","IX",2,0,null,12,[]],
-Y6:[function(a){var z,y
-z=J.x(a)
-if(z.n(a,"^")||z.n(a,"$methodsWithOptionalArguments"))return!0
-y=z.t(a,0)
-z=J.x(y)
-return z.n(y,"*")||z.n(y,"+")},"$1","uG",2,0,null,49,[]],
-Sn:{
-"^":"a;L5,F1>",
-gvU:function(){var z,y,x,w
-z=this.L5
-if(z!=null)return z
-y=P.L5(null,null,null,null,null)
-for(z=$.vK(),z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)for(x=J.GP(z.lo);x.G();){w=x.gl()
-y.u(0,w.gFP(),w)}z=H.VM(new H.Oh(y),[P.iD,P.D4])
-this.L5=z
-return z},
-static:{"^":"QG,Q3,Ct",dF:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=P.L5(null,null,null,J.O,[J.Q,P.D4])
-y=init.libraries
-if(y==null)return z
-for(x=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);x.G();){w=x.lo
-v=J.U6(w)
-u=v.t(w,0)
-t=P.hK(v.t(w,1))
-s=v.t(w,2)
-r=v.t(w,3)
-q=v.t(w,4)
-p=v.t(w,5)
-o=v.t(w,6)
-n=v.t(w,7)
-m=q==null?C.xD:q()
-J.wT(z.to(u,new H.nI()),new H.Uz(t,s,r,m,p,o,n,null,null,null,null,null,null,null,null,null,null,H.YC(u)))}return z},"$0","jc",0,0,null]}},
-nI:{
-"^":"Tp:115;",
-$0:[function(){return H.VM([],[P.D4])},"$0",null,0,0,null,"call"],
-$isEH:true},
-jU:{
-"^":"a;",
-bu:function(a){return this.gOO()},
-IB:function(a){throw H.b(P.SY(null))},
-$isQF:true},
-Lj:{
-"^":"jU;MA",
-gOO:function(){return"Isolate"},
-gcZ:function(){var z=$.Cm().gvU().nb
-return z.gUQ(z).XG(0,new H.mb())},
-$isQF:true},
-mb:{
-"^":"Tp:357;",
-$1:[function(a){return a.gGD()},"$1",null,2,0,null,356,[],"call"],
-$isEH:true},
-amu:{
-"^":"jU;If<",
-gUx:function(a){return H.fb(this.gXP(),this.gIf())},
-gq4:function(){return J.co(this.gIf().fN,"_")},
-bu:function(a){return this.gOO()+" on '"+H.d(this.gIf().fN)+"'"},
-jd:function(a,b){throw H.b(H.Ef("Should not call _invoke"))},
-$isNL:true,
-$isQF:true},
-cw:{
-"^":"EE;XP<,zn,Nz,LQ,If",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iscw&&J.de(this.If,b.If)&&this.XP.n(0,b.XP)},
-giO:function(a){var z,y
-z=J.v1(C.Gp.LU)
-if(typeof z!=="number")return H.s(z)
-y=this.XP
-return(1073741823&z^17*J.v1(this.If)^19*y.giO(y))>>>0},
-gOO:function(){return"TypeVariableMirror"},
-gFo:function(){return!1},
-$iscw:true,
-$istg:true,
-$isX9:true,
-$isNL:true,
-$isQF:true},
-EE:{
-"^":"amu;If",
-gOO:function(){return"TypeMirror"},
-gXP:function(){return},
-gc9:function(){return H.vh(P.SY(null))},
-gYj:function(){throw H.b(P.f("This type does not support reflectedType"))},
-gNy:function(){return C.dn},
-gw8:function(){return C.hU},
-gHA:function(){return!0},
-gJi:function(){return this},
-$isX9:true,
-$isNL:true,
-$isQF:true},
-Uz:{
-"^":"uh;FP<,aP,wP,le,LB,GD<,ae<,SD,zE,P8,mX,T1,fX,M2,uA,Db,xO,If",
-gOO:function(){return"LibraryMirror"},
-gUx:function(a){return this.If},
-gEO:function(){return this.gm8()},
-gqh:function(){var z,y,x
-z=this.P8
-if(z!=null)return z
-y=P.L5(null,null,null,null,null)
-for(z=J.GP(this.aP);z.G();){x=H.jO(z.gl())
-if(!!J.x(x).$isMs){x=x.gJi()
-if(!!x.$isWf){y.u(0,x.If,x)
-x.jE=this}}}z=H.VM(new H.Oh(y),[P.wv,P.Ms])
-this.P8=z
-return z},
-rN:function(a){var z,y
-z=this.gQH().nb.t(0,a)
-if(z==null)throw H.b(P.lr(this,a,[],null,null))
-if(!J.x(z).$isRS)return H.vn(z.IB(this))
-if(z.glT())return H.vn(z.IB(this))
-y=z.dl.$getter
-if(y==null)throw H.b(P.SY(null))
-return H.vn(y())},
-F2:function(a,b,c){var z,y,x
-z=this.gQH().nb.t(0,a)
-y=!!J.x(z).$isZk
-if(y&&!("$reflectable" in z.dl))H.Hz(a.gfN(a))
-if(z!=null)x=y&&z.hB
-else x=!0
-if(x)throw H.b(P.lr(this,a,b,c,null))
-if(y&&!z.lT)return H.vn(z.jd(b,c))
-return this.rN(a).F2(C.Ka,b,c)},
-CI:function(a,b){return this.F2(a,b,null)},
-gm8:function(){var z,y,x,w,v,u,t,s,r,q,p
-z=this.SD
-if(z!=null)return z
-y=H.VM([],[H.Zk])
-z=this.wP
-x=J.U6(z)
-w=this.ae
-v=0
-while(!0){u=x.gB(z)
-if(typeof u!=="number")return H.s(u)
-if(!(v<u))break
-c$0:{t=x.t(z,v)
-s=w[t]
-r=$.Sl().t(0,t)
-if(r==null||!!s.$getterStub)break c$0
-q=J.rY(r).nC(r,"new ")
-if(q){u=C.xB.yn(r,4)
-r=H.ys(u,"$",".")}p=H.S5(r,s,!q,q)
-y.push(p)
-p.jE=this}++v}this.SD=y
-return y},
-gTH:function(){var z,y
-z=this.zE
-if(z!=null)return z
-y=H.VM([],[P.RY])
-H.jw(this,this.LB,!0,y)
-this.zE=y
-return y},
-gQn:function(){var z,y,x
-z=this.mX
-if(z!=null)return z
-y=P.L5(null,null,null,null,null)
-for(z=this.gm8(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-if(!x.gxV())y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RS])
-this.mX=z
-return z},
-gF4:function(){var z=this.T1
-if(z!=null)return z
-z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
-this.T1=z
-return z},
-gM1:function(){var z=this.fX
-if(z!=null)return z
-z=H.VM(new H.Oh(P.L5(null,null,null,null,null)),[P.wv,P.RS])
-this.fX=z
-return z},
-gcc:function(){var z,y,x
-z=this.M2
-if(z!=null)return z
-y=P.L5(null,null,null,null,null)
-for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
-this.M2=z
-return z},
-gQH:function(){var z,y
-z=this.uA
-if(z!=null)return z
-z=this.gqh()
-y=P.L5(null,null,null,null,null)
-y.FV(0,z)
-z=new H.IB(y)
-this.gQn().nb.aN(0,z)
-this.gF4().nb.aN(0,z)
-this.gM1().nb.aN(0,z)
-this.gcc().nb.aN(0,z)
-z=H.VM(new H.Oh(y),[P.wv,P.QF])
-this.uA=z
-return z},
-gYK:function(){var z,y
-z=this.Db
-if(z!=null)return z
-y=P.L5(null,null,null,P.wv,P.NL)
-this.gQH().nb.aN(0,new H.oP(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
-this.Db=z
-return z},
-gc9:function(){var z=this.xO
-if(z!=null)return z
-z=H.VM(new P.Yp(J.kl(this.le,H.Yf())),[P.vr])
-this.xO=z
-return z},
-gXP:function(){return},
-$isD4:true,
-$isQF:true,
-$isNL:true},
-uh:{
-"^":"amu+M2;",
-$isQF:true},
-IB:{
-"^":"Tp:358;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
-$isEH:true},
-oP:{
-"^":"Tp:358;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
-$isEH:true},
-YX:{
-"^":"Tp:115;a",
-$0:[function(){return this.a},"$0",null,0,0,null,"call"],
-$isEH:true},
-BI:{
-"^":"Un;AY<,XW,BB,i1,If",
-gOO:function(){return"ClassMirror"},
-gIf:function(){var z,y
-z=this.BB
-if(z!=null)return z
-y=J.GL(J.Ba(this.AY))
-z=this.XW
-z=J.kE(y," with ")===!0?H.YC(H.d(y)+", "+H.d(J.GL(J.Ba(z)))):H.YC(H.d(y)+" with "+H.d(J.GL(J.Ba(z))))
-this.BB=z
-return z},
-gUx:function(a){return this.gIf()},
-gYK:function(){return this.XW.gYK()},
-F2:function(a,b,c){throw H.b(P.lr(this,a,b,c,null))},
-CI:function(a,b){return this.F2(a,b,null)},
-rN:function(a){throw H.b(P.lr(this,a,null,null,null))},
-gkZ:function(){return[this.XW]},
-gHA:function(){return!0},
-gJi:function(){return this},
-gNy:function(){throw H.b(P.SY(null))},
-gw8:function(){return C.hU},
-$isMs:true,
-$isQF:true,
-$isX9:true,
-$isNL:true},
-Un:{
-"^":"EE+M2;",
-$isQF:true},
-M2:{
-"^":"a;",
-$isQF:true},
-iu:{
-"^":"M2;Ax<,xq",
-gt5:function(a){return H.jO(J.bB(this.Ax).LU)},
-F2:function(a,b,c){return this.tu(a,0,b,c==null?C.CM:c)},
-CI:function(a,b){return this.F2(a,b,null)},
-Z7:function(a,b,c){var z,y,x,w,v,u,t,s
-z=this.Ax
-y=J.x(z)[a]
-if(y==null)throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))
-x=H.zh(y)
-b=P.F(b,!0,null)
-w=x.Rv
-if(w!==b.length)throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))
-v=P.L5(null,null,null,null,null)
-for(u=x.hG,t=0;t<u;++t){s=t+w
-v.u(0,x.XL(s),init.metadata[x.BX(0,s)])}c.aN(0,new H.vo(v))
-C.Nm.FV(b,v.gUQ(v))
-return H.vn(y.apply(z,b))},
-gK8:function(){var z,y,x
-z=$.eb
-y=this.Ax
-if(y==null)y=J.x(null)
-x=y.constructor[z]
-if(x==null){x=H.Pq()
-y.constructor[z]=x}return x},
-oD:function(a,b,c,d){var z,y
-z=J.GL(a)
-switch(b){case 1:return z
-case 2:return H.d(z)+"="
-case 0:if(!J.de(d.gB(d),0))return H.d(z)+"*"
-y=c.length
-return H.d(z)+":"+y+":0"}throw H.b(H.Ef("Could not compute reflective name for "+H.d(z)))},
-wQ:function(a,b,c,d,e){var z,y
-z=this.gK8()
-y=z[c]
-if(y==null){y=new H.LI(a,$.I6().t(0,c),b,d,C.xD,null).ZU(this.Ax)
-z[c]=y}return y},
-tu:function(a,b,c,d){var z,y,x,w
-z=this.oD(a,b,c,d)
-if(!J.de(d.gB(d),0))return this.Z7(z,c,d)
-y=this.wQ(a,b,z,c,d)
-if(y.gpf()){if(b===0){x=this.wQ(a,1,this.oD(a,1,C.xD,C.CM),C.xD,C.CM)
-w=!x.gpf()&&!x.gIt()}else w=!1
-if(w)return this.rN(a).F2(C.Ka,c,d)
-if(b===2)a=H.YC(H.d(J.GL(a))+"=")
-return H.vn(y.Bj(this.Ax,new H.LI(a,$.I6().t(0,z),b,c,[],null)))}else return H.vn(y.Bj(this.Ax,c))},
-rN:function(a){var z,y,x,w
-$loop$0:{z=this.xq
-if(typeof z=="number"||typeof a.$p=="undefined")break $loop$0
-y=a.$p(z)
-if(typeof y=="undefined")break $loop$0
-x=y(this.Ax)
-if(x===y.v)return y.m
-else{w=H.vn(x)
-y.v=x
-y.m=w
-return w}}return this.Dm(a)},
-Dm:function(a){var z,y,x,w,v,u,t
-z=this.tu(a,1,C.xD,C.CM)
-y=J.GL(a)
-x=this.gK8()[y]
-if(x.gpf())return z
-w=this.xq
-if(typeof w=="number"){w=J.xH(w,1)
-this.xq=w
-if(!J.de(w,0))return z
-w={}
-this.xq=w}v=typeof dart_precompiled!="function"
-if(typeof a.$p=="undefined")a.$p=this.ds(y,v)
-u=x.gPi()
-t=x.geK()?this.QN(u,v):this.x0(u,v)
-w[y]=t
-t.v=t.m=w
-return z},
-ds:function(a,b){if(b)return function(c){return eval(c)}("(function probe$"+H.d(a)+"(c){return c."+H.d(a)+"})")
-else return function(c){return function(d){return d[c]}}(a)},
-x0:function(a,b){if(!b)return function(c){return function(d){return d[c]()}}(a)
-return function(c){return eval(c)}("(function "+this.Ax.constructor.name+"$"+H.d(a)+"(o){return o."+H.d(a)+"()})")},
-QN:function(a,b){var z,y
-z=J.x(this.Ax)
-if(!b)return function(c,d){return function(e){return d[c](e)}}(a,z)
-y=z.constructor.name+"$"+H.d(a)
-return function(c){return eval(c)}("(function(i) {  function "+y+"(o){return i."+H.d(a)+"(o)}  return "+y+";})")(z)},
-n:function(a,b){var z,y
-if(b==null)return!1
-if(!!J.x(b).$isiu){z=this.Ax
-y=b.Ax
-y=z==null?y==null:z===y
-z=y}else z=!1
-return z},
-giO:function(a){return J.UN(H.CU(this.Ax),909522486)},
-bu:function(a){return"InstanceMirror on "+H.d(P.hl(this.Ax))},
-$isiu:true,
-$isvr:true,
-$isQF:true},
-vo:{
-"^":"Tp:359;a",
-$2:[function(a,b){var z,y
-z=J.GL(a)
-y=this.a
-if(y.x4(z))y.u(0,z,b)
-else throw H.b(H.WE("Invoking noSuchMethod with named arguments not implemented"))},"$2",null,4,0,null,146,[],30,[],"call"],
-$isEH:true},
-bl:{
-"^":"amu;NK,EZ,ut,Db,uA,b0,M2,T1,fX,FU,qu,qN,qm,i1,yF,If",
-gOO:function(){return"ClassMirror"},
-bu:function(a){var z,y,x
-z="ClassMirror on "+H.d(this.NK.gIf().fN)
-if(this.gw8()!=null){y=z+"<"
-x=this.gw8()
-z=y+x.zV(x,", ")+">"}return z},
-gCr:function(){for(var z=this.gw8(),z=z.gA(z);z.G();)if(!J.de(z.lo,$.P8()))return H.d(this.NK.gCr())+"<"+this.EZ+">"
-return this.NK.gCr()},
-gNy:function(){return this.NK.gNy()},
-gw8:function(){var z,y,x,w,v,u,t,s
-z=this.ut
-if(z!=null)return z
-y=[]
-z=new H.tB(y)
-x=this.EZ
-if(C.xB.u8(x,"<")===-1)H.bQ(x.split(","),new H.Tc(z))
-else{for(w=x.length,v=0,u="",t=0;t<w;++t){s=x[t]
-if(s===" ")continue
-else if(s==="<"){u+=s;++v}else if(s===">"){u+=s;--v}else if(s===",")if(v>0)u+=s
-else{z.$1(u)
-u=""}else u+=s}z.$1(u)}z=H.VM(new P.Yp(y),[null])
-this.ut=z
-return z},
-gEO:function(){var z=this.qu
-if(z!=null)return z
-z=this.NK.ly(this)
-this.qu=z
-return z},
-gEz:function(){var z=this.b0
-if(z!=null)return z
-z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
-this.b0=z
-return z},
-gcc:function(){var z,y,x
-z=this.M2
-if(z!=null)return z
-y=P.L5(null,null,null,null,null)
-for(z=this.NK.ws(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
-this.M2=z
-return z},
-gQH:function(){var z=this.uA
-if(z!=null)return z
-z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.NL])
-this.uA=z
-return z},
-gYK:function(){var z,y
-z=this.Db
-if(z!=null)return z
-y=P.L5(null,null,null,P.wv,P.NL)
-y.FV(0,this.gQH())
-y.FV(0,this.gEz())
-J.kH(this.NK.gNy(),new H.Ax(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
-this.Db=z
-return z},
-rN:function(a){return this.NK.rN(a)},
-gXP:function(){return this.NK.gXP()},
-gc9:function(){return this.NK.gc9()},
-gAY:function(){var z=this.qN
-if(z!=null)return z
-z=H.Jf(this,init.metadata[J.UQ(init.typeInformation[this.NK.gCr()],0)])
-this.qN=z
-return z},
-F2:function(a,b,c){return this.NK.F2(a,b,c)},
-CI:function(a,b){return this.F2(a,b,null)},
-gHA:function(){return!1},
-gJi:function(){return this.NK},
-gkZ:function(){var z=this.qm
-if(z!=null)return z
-z=this.NK.MR(this)
-this.qm=z
-return z},
-gq4:function(){return J.co(this.NK.gIf().fN,"_")},
-gUx:function(a){var z=this.NK
-return z.gUx(z)},
-gYj:function(){return new H.cu(this.gCr(),null)},
-gIf:function(){return this.NK.gIf()},
-$isbl:true,
-$isMs:true,
-$isQF:true,
-$isX9:true,
-$isNL:true},
-tB:{
-"^":"Tp:32;a",
-$1:[function(a){var z,y,x
-z=H.BU(a,null,new H.Oo())
-y=this.a
-if(J.de(z,-1))y.push(H.jO(J.rr(a)))
-else{x=init.metadata[z]
-y.push(new H.cw(P.re(x.gXP()),x,z,null,H.YC(J.O6(x))))}},"$1",null,2,0,null,360,[],"call"],
-$isEH:true},
-Oo:{
-"^":"Tp:116;",
-$1:[function(a){return-1},"$1",null,2,0,null,117,[],"call"],
-$isEH:true},
-Tc:{
-"^":"Tp:116;b",
-$1:[function(a){return this.b.$1(a)},"$1",null,2,0,null,95,[],"call"],
-$isEH:true},
-Ax:{
-"^":"Tp:116;a",
-$1:[function(a){this.a.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,361,[],"call"],
-$isEH:true},
-Wf:{
-"^":"vk;Cr<,Tx<,H8,Ht,pz,le,qN,qu,zE,b0,FU,T1,fX,M2,uA,Db,xO,qm,UF,i1,yF,jE,If",
-gOO:function(){return"ClassMirror"},
-gaB:function(){var z=this.Tx
-if(H.SG(z))return z.constructor
-else return z},
-gEz:function(){var z=this.b0
-if(z!=null)return z
-z=H.VM(new H.Oh(H.Fk(this.gEO())),[P.wv,P.RS])
-this.b0=z
-return z},
-ly:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=this.gaB().prototype
-y=H.kU(z)
-x=H.VM([],[H.Zk])
-for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){v=w.lo
-if(H.Y6(v))continue
-u=$.bx().t(0,v)
-if(u==null)continue
-t=z[v]
-if(t.$reflectable==2)continue
-s=H.S5(u,t,!1,!1)
-x.push(s)
-s.jE=a}y=H.kU(init.statics[this.Cr])
-for(w=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);w.G();){r=w.lo
-if(H.Y6(r))continue
-q=this.gXP().gae()[r]
-if("$reflectable" in q){p=q.$reflectionName
-if(p==null)continue
-o=C.xB.nC(p,"new ")
-if(o){n=C.xB.yn(p,4)
-p=H.ys(n,"$",".")}}else continue
-s=H.S5(p,q,!o,o)
-x.push(s)
-s.jE=a}return x},
-gEO:function(){var z=this.qu
-if(z!=null)return z
-z=this.ly(this)
-this.qu=z
-return z},
-ws:function(a){var z,y,x,w
-z=H.VM([],[P.RY])
-y=this.H8.split(";")
-if(1>=y.length)return H.e(y,1)
-x=y[1]
-y=this.Ht
-if(y!=null){x=[x]
-C.Nm.FV(x,y)}H.jw(a,x,!1,z)
-w=init.statics[this.Cr]
-if(w!=null)H.jw(a,w["^"],!0,z)
-return z},
-gTH:function(){var z=this.zE
-if(z!=null)return z
-z=this.ws(this)
-this.zE=z
-return z},
-ghp:function(){var z=this.FU
-if(z!=null)return z
-z=H.VM(new H.Oh(H.Vv(this.gEO())),[P.wv,P.RS])
-this.FU=z
-return z},
-gF4:function(){var z=this.T1
-if(z!=null)return z
-z=H.VM(new H.Oh(H.EK(this.gEO(),this.gcc())),[P.wv,P.RS])
-this.T1=z
-return z},
-gcc:function(){var z,y,x
-z=this.M2
-if(z!=null)return z
-y=P.L5(null,null,null,null,null)
-for(z=this.gTH(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=z.lo
-y.u(0,x.gIf(),x)}z=H.VM(new H.Oh(y),[P.wv,P.RY])
-this.M2=z
-return z},
-gQH:function(){var z=this.uA
-if(z!=null)return z
-z=H.VM(new H.Oh(H.vE(this.gEO(),this.gcc())),[P.wv,P.QF])
-this.uA=z
-return z},
-gYK:function(){var z,y
-z=this.Db
-if(z!=null)return z
-y=P.L5(null,null,null,P.wv,P.NL)
-z=new H.Ei(y)
-this.gQH().nb.aN(0,z)
-this.gEz().nb.aN(0,z)
-J.kH(this.gNy(),new H.Ci(y))
-z=H.VM(new H.Oh(y),[P.wv,P.NL])
-this.Db=z
-return z},
-Ve:function(a){var z,y
-z=this.gcc().nb.t(0,a)
-if(z!=null)return z.gFo()
-y=this.gF4().nb.t(0,a)
-return y!=null&&y.gFo()},
-rN:function(a){var z,y,x,w
-z=this.gcc().nb.t(0,a)
-if(z!=null&&z.gFo()){y=z.gcK()
-if(!(y in $))throw H.b(H.Ef("Cannot find \""+y+"\" in current isolate."))
-if(y in init.lazies)return H.vn($[init.lazies[y]]())
-else return H.vn($[y])}x=this.gF4().nb.t(0,a)
-if(x!=null&&x.gFo())return H.vn(x.jd(C.xD,C.CM))
-w=this.ghp().nb.t(0,a)
-if(w!=null&&w.gFo()){x=w.gdl().$getter
-if(x==null)throw H.b(P.SY(null))
-return H.vn(x())}throw H.b(P.lr(this,a,null,null,null))},
-gXP:function(){var z,y
-z=this.jE
-if(z==null){if(H.SG(this.Tx))this.jE=H.jO(C.nY.LU).gXP()
-else{z=$.vK()
-z=z.gUQ(z)
-y=new H.MH(null,J.GP(z.l6),z.T6)
-y.$builtinTypeInfo=[H.Kp(z,0),H.Kp(z,1)]
-for(;y.G();)for(z=J.GP(y.lo);z.G();)z.gl().gqh()}z=this.jE
-if(z==null)throw H.b(P.w("Class \""+H.d(H.TS(this.If))+"\" has no owner"))}return z},
-gc9:function(){var z=this.xO
-if(z!=null)return z
-z=this.le
-if(z==null){z=H.pj(this.gaB().prototype)
-this.le=z}z=H.VM(new P.Yp(J.kl(z,H.Yf())),[P.vr])
-this.xO=z
-return z},
-gAY:function(){var z,y,x,w,v,u
-z=this.qN
-if(z==null){y=init.typeInformation[this.Cr]
-if(y!=null){z=H.Jf(this,init.metadata[J.UQ(y,0)])
-this.qN=z}else{z=this.H8
-x=z.split(";")
-if(0>=x.length)return H.e(x,0)
-w=x[0]
-x=J.rY(w)
-v=x.Fr(w,"+")
-u=v.length
-if(u>1){if(u!==2)throw H.b(H.Ef("Strange mixin: "+z))
-z=H.jO(v[0])
-this.qN=z}else{z=x.n(w,"")?this:H.jO(w)
-this.qN=z}}}return J.de(z,this)?null:this.qN},
-F2:function(a,b,c){var z,y
-z=this.ghp().nb.t(0,a)
-y=z==null
-if(y&&this.Ve(a))return this.rN(a).F2(C.Ka,b,c)
-if(y||!z.gFo())throw H.b(P.lr(this,a,b,c,null))
-if(!z.tB())H.Hz(a.gfN(a))
-return H.vn(z.jd(b,c))},
-CI:function(a,b){return this.F2(a,b,null)},
-gHA:function(){return!0},
-gJi:function(){return this},
-MR:function(a){var z,y
-z=init.typeInformation[this.Cr]
-y=z!=null?H.VM(new H.A8(J.Ld(z,1),new H.t0(a)),[null,null]).br(0):C.Me
-return H.VM(new P.Yp(y),[P.Ms])},
-gkZ:function(){var z=this.qm
-if(z!=null)return z
-z=this.MR(this)
-this.qm=z
-return z},
-gNy:function(){var z,y,x,w,v
-z=this.UF
-if(z!=null)return z
-y=[]
-x=this.gaB().prototype["<>"]
-if(x==null)return y
-for(w=0;w<x.length;++w){z=x[w]
-v=init.metadata[z]
-y.push(new H.cw(this,v,z,null,H.YC(J.O6(v))))}z=H.VM(new P.Yp(y),[null])
-this.UF=z
-return z},
-gw8:function(){return C.hU},
-gYj:function(){if(!J.de(J.q8(this.gNy()),0))throw H.b(P.f("Declarations of generics have no reflected type"))
-return new H.cu(this.Cr,null)},
-$isWf:true,
-$isMs:true,
-$isQF:true,
-$isX9:true,
-$isNL:true},
-vk:{
-"^":"EE+M2;",
-$isQF:true},
-Ei:{
-"^":"Tp:358;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
-$isEH:true},
-Ci:{
-"^":"Tp:116;b",
-$1:[function(a){this.b.u(0,a.gIf(),a)
-return a},"$1",null,2,0,null,361,[],"call"],
-$isEH:true},
-t0:{
-"^":"Tp:362;a",
-$1:[function(a){return H.Jf(this.a,init.metadata[a])},"$1",null,2,0,null,334,[],"call"],
-$isEH:true},
-XJ:{
-"^":"amu;cK<,V5>,Fo<,n6,jE,Ay>,le,If",
-gOO:function(){return"VariableMirror"},
-gt5:function(a){return H.Jf(this.jE,init.metadata[this.Ay])},
-gXP:function(){return this.jE},
-gc9:function(){var z=this.le
-if(z==null){z=this.n6
-z=z==null?C.xD:z()
-this.le=z}return J.qA(J.kl(z,H.Yf()))},
-IB:function(a){return $[this.cK]},
-$isRY:true,
-$isNL:true,
-$isQF:true,
-static:{pS:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o
-z=J.uH(a,"-")
-y=z.length
-if(y===1)return
-if(0>=y)return H.e(z,0)
-x=z[0]
-y=J.U6(x)
-w=y.gB(x)
-v=J.Wx(w)
-u=H.GQ(y.j(x,v.W(w,1)))
-if(u===0)return
-t=C.jn.GG(u,2)===0
-s=y.Nj(x,0,v.W(w,1))
-r=y.u8(x,":")
-if(r>0){q=C.xB.Nj(s,0,r)
-s=y.yn(x,r+1)}else q=s
-p=d?$.Sl().t(0,q):$.bx().t(0,"g"+q)
-if(p==null)p=q
-if(t){o=H.YC(H.d(p)+"=")
-y=c.gEO()
-v=new H.a7(y,y.length,0,null)
-v.$builtinTypeInfo=[H.Kp(y,0)]
-for(;t=!0,v.G();)if(J.de(v.lo.gIf(),o)){t=!1
-break}}if(1>=z.length)return H.e(z,1)
-return new H.XJ(s,t,d,b,c,H.BU(z[1],null,null),null,H.YC(p))},GQ:[function(a){if(a>=60&&a<=64)return a-59
-if(a>=123&&a<=126)return a-117
-if(a>=37&&a<=43)return a-27
-return 0},"$1","Na",2,0,null,154,[]]}},
-Sz:{
-"^":"iu;Ax,xq",
-gMj:function(a){var z,y,x,w,v,u,t,s
-z=$.te
-y=this.Ax
-x=function(b){for(var r in b){if("$"==r.substring(0,1)&&r[1]>='0'&&r[1]<='9')return r}return null}(y)
-if(x==null)throw H.b(H.Ef("Cannot find callName on \""+H.d(y)+"\""))
-w=x.split("$")
-if(1>=w.length)return H.e(w,1)
-v=H.BU(w[1],null,null)
-w=J.x(y)
-if(!!w.$isv){u=y.gjm()
-H.eZ(y)
-t=$.bx().t(0,w.gRA(y))
-if(t==null)H.Hz(t)
-s=H.S5(t,u,!1,!1)}else s=new H.Zk(y[x],v,!1,!1,!0,!1,!1,null,null,null,null,H.YC(x))
-y.constructor[z]=s
-return s},
-bu:function(a){return"ClosureMirror on '"+H.d(P.hl(this.Ax))+"'"},
-$isvr:true,
-$isQF:true},
-Zk:{
-"^":"amu;dl<,Yq,lT<,hB<,Fo<,xV<,qx,jE,le,wM,H3,If",
-gOO:function(){return"MethodMirror"},
-gMP:function(){var z=this.H3
-if(z!=null)return z
-this.gc9()
-return this.H3},
-tB:function(){return"$reflectable" in this.dl},
-gXP:function(){return this.jE},
-gdw:function(){this.gc9()
-return this.wM},
-gc9:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h
-z=this.le
-if(z==null){z=this.dl
-y=H.pj(z)
-x=this.Yq
-if(typeof x!=="number")return H.s(x)
-w=Array(x)
-v=H.zh(z)
-if(v!=null){u=v.AM
-if(typeof u==="number"&&Math.floor(u)===u)t=new H.Ar(v.hl(null),null,null,null,this)
-else{z=this.gXP()
-t=z!=null&&!!J.x(z).$isD4?new H.Ar(v.hl(null),null,null,null,this.jE):new H.Ar(v.hl(this.jE.gJi().gTx()),null,null,null,this.jE)}if(this.xV)this.wM=this.jE
-else this.wM=t.gdw()
-s=v.Mo
-for(z=t.gMP(),z=z.gA(z),x=w.length,r=v.Rv,q=v.Rn,p=v.hG,o=0;z.G();o=h){n=z.lo
-m=v.XL(o)
-l=q[2*o+p+3+1]
-k=J.RE(n)
-if(o<r)j=new H.fu(this,k.gAy(n),!1,!1,null,l,H.YC(m))
-else{i=v.BX(0,o)
-j=new H.fu(this,k.gAy(n),!0,s,i,l,H.YC(m))}h=o+1
-if(o>=x)return H.e(w,o)
-w[o]=j}}this.H3=H.VM(new P.Yp(w),[P.Ys])
-z=H.VM(new P.Yp(J.kl(y,H.Yf())),[null])
-this.le=z}return z},
-jd:function(a,b){if(b!=null&&!J.de(b.gB(b),0))throw H.b(P.f("Named arguments are not implemented."))
-if(!this.Fo&&!this.xV)throw H.b(H.Ef("Cannot invoke instance method without receiver."))
-if(!J.de(this.Yq,a.length)||this.dl==null)throw H.b(P.lr(this.gXP(),this.If,a,b,null))
-return this.dl.apply($,P.F(a,!0,null))},
-IB:function(a){if(this.lT)return this.jd([],null)
-else throw H.b(P.SY("getField on "+a.bu(0)))},
-guU:function(){return!this.lT&&!this.hB&&!this.xV},
-$isZk:true,
-$isRS:true,
-$isNL:true,
-$isQF:true,
-static:{S5:function(a,b,c,d){var z,y,x,w,v,u,t
-z=a.split(":")
-if(0>=z.length)return H.e(z,0)
-a=z[0]
-y=H.BF(a)
-x=!y&&J.Eg(a,"=")
-w=z.length
-if(w===1){if(x){v=1
-u=!1}else{v=0
-u=!0}t=0}else{if(1>=w)return H.e(z,1)
-v=H.BU(z[1],null,null)
-if(2>=z.length)return H.e(z,2)
-t=H.BU(z[2],null,null)
-u=!1}w=H.YC(a)
-return new H.Zk(b,J.WB(v,t),u,x,c,d,y,null,null,null,null,w)}}},
-fu:{
-"^":"amu;XP<,Ay>,Q2<,Sh,BE,QY,If",
-gOO:function(){return"ParameterMirror"},
-gt5:function(a){return H.Jf(this.XP,this.Ay)},
-gFo:function(){return!1},
-gV5:function(a){return!1},
-gc9:function(){return J.qA(J.kl(this.QY,new H.wt()))},
-$isYs:true,
-$isRY:true,
-$isNL:true,
-$isQF:true},
-wt:{
-"^":"Tp:363;",
-$1:[function(a){return H.vn(init.metadata[a])},"$1",null,2,0,null,334,[],"call"],
-$isEH:true},
-ng:{
-"^":"amu;Cr<,CM,If",
-gP:function(a){return this.CM},
-gOO:function(){return"TypedefMirror"},
-gYj:function(){return H.vh(P.SY(null))},
-gJi:function(){return H.vh(P.SY(null))},
-gXP:function(){return H.vh(P.SY(null))},
-gc9:function(){return H.vh(P.SY(null))},
-$isrN:true,
-$isX9:true,
-$isNL:true,
-$isQF:true},
-TN:{
-"^":"a;",
-gYj:function(){return H.vh(P.SY(null))},
-gAY:function(){return H.vh(P.SY(null))},
-gkZ:function(){return H.vh(P.SY(null))},
-gYK:function(){return H.vh(P.SY(null))},
-F2:function(a,b,c){return H.vh(P.SY(null))},
-CI:function(a,b){return this.F2(a,b,null)},
-rN:function(a){return H.vh(P.SY(null))},
-gNy:function(){return H.vh(P.SY(null))},
-gw8:function(){return H.vh(P.SY(null))},
-gJi:function(){return H.vh(P.SY(null))},
-gIf:function(){return H.vh(P.SY(null))},
-gUx:function(a){return H.vh(P.SY(null))},
-gq4:function(){return H.vh(P.SY(null))},
-gc9:function(){return H.vh(P.SY(null))}},
-Ar:{
-"^":"TN;d9,o3,yA,zM,XP<",
-gHA:function(){return!0},
-gdw:function(){var z=this.yA
-if(z!=null)return z
-z=this.d9
-if(!!z.void){z=$.oj()
-this.yA=z
-return z}if(!("ret" in z)){z=$.P8()
-this.yA=z
-return z}z=H.Jf(this.XP,z.ret)
-this.yA=z
-return z},
-gMP:function(){var z,y,x,w,v,u
-z=this.zM
-if(z!=null)return z
-y=[]
-z=this.d9
-if("args" in z)for(x=z.args,x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]),w=0;x.G();w=v){v=w+1
-y.push(new H.fu(this,x.lo,!1,!1,null,C.iH,H.YC("argument"+w)))}else w=0
-if("opt" in z)for(x=z.opt,x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();w=v){v=w+1
-y.push(new H.fu(this,x.lo,!1,!1,null,C.iH,H.YC("argument"+w)))}if("named" in z)for(x=H.kU(z.named),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){u=x.lo
-y.push(new H.fu(this,z.named[u],!1,!1,null,C.iH,H.YC(u)))}z=H.VM(new P.Yp(y),[P.Ys])
-this.zM=z
-return z},
-bu:function(a){var z,y,x,w,v,u
-z=this.o3
-if(z!=null)return z
-z=this.d9
-if("args" in z)for(y=z.args,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x="FunctionTypeMirror on '(",w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,H.Ko(v,null))}else{x="FunctionTypeMirror on '("
-w=""}if("opt" in z){x+=w+"["
-for(y=z.opt,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){v=y.lo
-x=C.xB.g(x+w,H.Ko(v,null))}x+="]"}if("named" in z){x+=w+"{"
-for(y=H.kU(z.named),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w="";y.G();w=", "){u=y.lo
-x=C.xB.g(x+w+(H.d(u)+": "),H.Ko(z.named[u],null))}x+="}"}x+=") -> "
-if(!!z.void)x+="void"
-else x="ret" in z?C.xB.g(x,H.Ko(z.ret,null)):x+"dynamic"
-z=x+"'"
-this.o3=z
-return z},
-gah:function(){return H.vh(P.SY(null))},
-V7:function(a,b){return this.gah().$2(a,b)},
-nQ:function(a){return this.gah().$1(a)},
-$isMs:true,
-$isQF:true,
-$isX9:true,
-$isNL:true},
-rh:{
-"^":"Tp:364;a",
-$1:[function(a){var z,y,x
-z=init.metadata[a]
-y=this.a
-x=H.w2(y.a.gNy(),J.O6(z))
-return J.UQ(y.a.gw8(),x)},"$1",null,2,0,null,15,[],"call"],
-$isEH:true},
-iW:{
-"^":"Tp:121;b",
-$1:[function(a){var z,y
-z=this.b.$1(a)
-y=J.x(z)
-if(!!y.$iscw)return H.d(z.Nz)
-if(!y.$isWf&&!y.$isbl)if(y.n(z,$.P8()))return"dynamic"
-else if(y.n(z,$.oj()))return"void"
-else return"dynamic"
-return z.gCr()},"$1",null,2,0,null,15,[],"call"],
-$isEH:true},
-ye:{
-"^":"Tp:363;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,334,[],"call"],
-$isEH:true},
-O1:{
-"^":"Tp:363;",
-$1:[function(a){return init.metadata[a]},"$1",null,2,0,null,334,[],"call"],
-$isEH:true},
-Oh:{
-"^":"a;nb",
-gB:function(a){return this.nb.X5},
-gl0:function(a){return this.nb.X5===0},
-gor:function(a){return this.nb.X5!==0},
-t:function(a,b){return this.nb.t(0,b)},
-x4:function(a){return this.nb.x4(a)},
-di:function(a){return this.nb.di(a)},
-aN:function(a,b){return this.nb.aN(0,b)},
-gvc:function(){var z=this.nb
-return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gUQ:function(a){var z=this.nb
-return z.gUQ(z)},
-u:function(a,b,c){return H.kT()},
-FV:function(a,b){return H.kT()},
-Rz:function(a,b){H.kT()},
-V1:function(a){return H.kT()},
-$isZ0:true,
-static:{kT:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","lY",0,0,null]}}}],["dart._js_names","dart:_js_names",,H,{
-"^":"",
-hY:[function(a,b){var z,y,x,w,v,u,t
-z=H.kU(a)
-y=P.Fl(J.O,J.O)
-for(x=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),w=!b;x.G();){v=x.lo
-u=a[v]
-y.u(0,v,u)
-if(w){t=J.rY(v)
-if(t.nC(v,"g"))y.u(0,"s"+t.yn(v,1),u+"=")}}return y},"$2","Il",4,0,null,160,[],161,[]],
-YK:[function(a){var z=P.Fl(J.O,J.O)
-a.aN(0,new H.Xh(z))
-return z},"$1","OX",2,0,null,162,[]],
-kU:[function(a){var z=H.VM(function(b,c){var y=[]
+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},"$1","DF",2,0,null,158,[]],
-Xh:{
-"^":"Tp:366;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,149,[],365,[],"call"],
-$isEH:true}}],["dart.async","dart:async",,P,{
+return z}}],["dart.async","dart:async",,P,{
 "^":"",
-Oj:[function(){if($.jk().scheduleImmediate!=null)return P.Sx()
-return P.K7()},"$0","n9",0,0,null],
+C2: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","Sx",2,0,163,164,[]],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,163,164,[]],
-VH:[function(a,b){var z=H.N7()
+$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,14],
+Bz:[function(a){P.jL(C.RT,a)},"$1","K7",2,0,14],
+VH:function(a,b){var z=H.G3()
 z=H.KT(z,[z,z]).BD(a)
-if(z)return b.O8(a)
-else return b.cR(a)},"$2","zZ",4,0,null,165,[],166,[]],
-e4:function(a,b){var z=P.Dt(b)
-P.rT(C.ny,new P.ZC(a,z))
+if(z){b.toString
+return a}else{b.toString
+return a}},
+Iw:function(a,b){var z=P.Dt(b)
+P.ww(C.RT,new P.w4(a,z))
 return z},
-Cx:[function(){var z=$.S6
+Cx:function(){var z=$.S6
 for(;z!=null;){J.cG(z)
 z=z.gaw()
-$.S6=z}$.k8=null},"$0","BN",0,0,null],
+$.S6=z}$.k8=null},
 BG:[function(){var z
 try{P.Cx()}catch(z){H.Ru(z)
-$.ej().$1(P.qZ())
+$.ej().$1(P.rh())
 $.S6=$.S6.gaw()
-throw z}},"$0","qZ",0,0,126],
-IA:[function(a){var z,y
+throw z}},"$0","rh",0,0,13],
+IA:function(a){var z,y
 z=$.k8
 if(z==null){z=new P.OM(a,null)
 $.k8=z
 $.S6=z
-$.ej().$1(P.qZ())}else{y=new P.OM(a,null)
+$.ej().$1(P.rh())}else{y=new P.OM(a,null)
 z.aw=y
-$.k8=y}},"$1","e6",2,0,null,164,[]],
-rb:[function(a){var z
-if(J.de($.X3,C.NU)){$.X3.wr(a)
-return}z=$.X3
-z.wr(z.xi(a,!0))},"$1","Rf",2,0,null,164,[]],
+$.k8=y}},
+rb:function(a){var z=$.X3
+if(z===C.NU){z.toString
+P.Tk(z,null,z,a)
+return}P.Tk(z,null,z,z.xi(a,!0))},
 bK:function(a,b,c,d){var z
-if(c){z=H.VM(new P.dz(b,a,0,null,null,null,null),[d])
+if(c){z=H.VM(new P.zW(b,a,0,null,null,null,null),[d])
 z.SJ=z
-z.iE=z}else{z=H.VM(new P.DL(b,a,0,null,null,null,null),[d])
+z.iE=z}else{z=H.VM(new P.HX(b,a,0,null,null,null,null),[d])
 z.SJ=z
 z.iE=z}return z},
-ot:[function(a){var z,y,x,w,v
+ot:function(a){var z,y,x,w,v
 if(a==null)return
 try{z=a.$0()
 if(!!J.x(z).$isb8)return z
 return}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
-$.X3.hk(y,x)}},"$1","DC",2,0,null,168,[]],
-YE:[function(a){},"$1","bZ",2,0,169,30,[]],
-SZ:[function(a,b){$.X3.hk(a,b)},function(a){return P.SZ(a,null)},null,"$2","$1","AY",2,2,170,85,171,[],172,[]],
-dL:[function(){},"$0","v3",0,0,126],
-FE:[function(a,b,c){var z,y,x,w
+x=new H.oP(w,null)
+v=$.X3
+v.toString
+P.CK(v,null,v,y,x)}},
+YE:[function(a){},"$1","bZ",2,0,15,16],
+vF:[function(a,b){var z=$.X3
+z.toString
+P.CK(z,null,z,a,b)},function(a){return P.vF(a,null)},null,"$2","$1","Mm",2,2,17,18,19,20],
+dL:[function(){},"$0","v3",0,0,13],
+FE:function(a,b,c){var z,y,x,w
 try{b.$1(a.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
-c.$2(z,y)}},"$3","mc",6,0,null,173,[],174,[],175,[]],
-NX:[function(a,b,c,d){a.ed()
-b.K5(c,d)},"$4","QD",8,0,null,176,[],177,[],171,[],172,[]],
-TB:[function(a,b){return new P.uR(a,b)},"$2","cH",4,0,null,176,[],177,[]],
-Bb:[function(a,b,c){a.ed()
-b.rX(c)},"$3","E1",6,0,null,176,[],177,[],30,[]],
-rT:function(a,b){var z
-if(J.de($.X3,C.NU))return $.X3.uN(a,b)
-z=$.X3
-return z.uN(a,z.xi(b,!0))},
-jL:[function(a,b){var z=a.gVs()
-return H.cy(z<0?0:z,b)},"$2","et",4,0,null,178,[],164,[]],
-PJ:[function(a){var z=$.X3
+y=new H.oP(x,null)
+c.$2(z,y)}},
+NX:function(a,b,c,d){a.ed()
+b.K5(c,d)},
+TB:function(a,b){return new P.uR(a,b)},
+Bb:function(a,b,c){a.ed()
+b.rX(c)},
+ww:function(a,b){var z=$.X3
+if(z===C.NU){z.toString
+return P.h8(z,null,z,a,b)}return P.h8(z,null,z,a,z.xi(b,!0))},
+jL:function(a,b){var z=C.CD.cU(a.Fq,1000)
+return H.cy(z<0?0:z,b)},
+qi:function(a){var z=$.X3
 $.X3=a
-return z},"$1","kb",2,0,null,166,[]],
-L2:[function(a,b,c,d,e){a.Gr(new P.pK(d,e))},"$5","xP",10,0,179,180,[],181,[],166,[],171,[],172,[]],
-T8:[function(a,b,c,d){var z,y
-if(J.de($.X3,c))return d.$0()
-z=P.PJ(c)
+return z},
+CK:function(a,b,c,d,e){P.T8(a,null,a,new P.FO(d,e))},
+T8:function(a,b,c,d){var z,y
+if($.X3===c)return d.$0()
+z=P.qi(c)
 try{y=d.$0()
-return y}finally{$.X3=z}},"$4","AI",8,0,182,180,[],181,[],166,[],128,[]],
-V7:[function(a,b,c,d,e){var z,y
-if(J.de($.X3,c))return d.$1(e)
-z=P.PJ(c)
+return y}finally{$.X3=z}},
+V7:function(a,b,c,d,e){var z,y
+if($.X3===c)return d.$1(e)
+z=P.qi(c)
 try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","MM",10,0,183,180,[],181,[],166,[],128,[],184,[]],
-Qx:[function(a,b,c,d,e,f){var z,y
-if(J.de($.X3,c))return d.$2(e,f)
-z=P.PJ(c)
+return y}finally{$.X3=z}},
+Mu:function(a,b,c,d,e,f){var z,y
+if($.X3===c)return d.$2(e,f)
+z=P.qi(c)
 try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","l4",12,0,185,180,[],181,[],166,[],128,[],60,[],61,[]],
-Ee:[function(a,b,c,d){return d},"$4","EU",8,0,186,180,[],181,[],166,[],128,[]],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,187,180,[],181,[],166,[],128,[]],
-VI:[function(a,b,c,d){return d},"$4","uu",8,0,188,180,[],181,[],166,[],128,[]],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,189,180,[],181,[],166,[],128,[]],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,190,180,[],181,[],166,[],178,[],164,[]],
-XB:[function(a,b,c,d){H.qw(d)},"$4","YM",8,0,191,180,[],181,[],166,[],192,[]],
-CI:[function(a){J.O2($.X3,a)},"$1","Ib",2,0,193,192,[]],
-UA:[function(a,b,c,d,e){var z
-$.oK=P.Ib()
-z=P.Py(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","hn",10,0,194,180,[],181,[],166,[],195,[],196,[]],
+return y}finally{$.X3=z}},
+Tk:function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},
+h8:function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},
 C6:{
-"^":"Tp:115;a",
-$0:[function(){H.ox()
+"^":"Xs:47;a",
+$0:[function(){H.cv()
 this.a.$0()},"$0",null,0,0,null,"call"],
 $isEH:true},
 Ca:{
 "^":"a;kc>,I4<",
-$isGe:true},
+$isXS:true},
 Ik:{
 "^":"O9;Y8"},
-JI:{
-"^":"yU;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,Ri",
+f6:{
+"^":"oh;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,Ri",
 gY8:function(){return this.Y8},
 uR:function(a){var z=this.Ae
 if(typeof z!=="number")return z.i()
@@ -4379,17 +4458,16 @@
 gHj:function(){var z=this.Ae
 if(typeof z!=="number")return z.i()
 return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,126],
-LP:[function(){},"$0","gZ9",0,0,126],
-static:{"^":"FJ,RG,cP"}},
-WVu:{
+uO:[function(){},"$0","gp4",0,0,13],
+LP:[function(){},"$0","gZ9",0,0,13],
+static:{"^":"FJ,H6,id"}},
+WV:{
 "^":"a;iE@,SJ@",
-gRW:function(){return!1},
-gP4:function(){return(this.Gv&2)!==0},
-SL:function(){var z=this.Ip
+gUF:function(){return!1},
+im:function(){var z=this.yx
 if(z!=null)return z
 z=P.Dt(null)
-this.Ip=z
+this.yx=z
 return z},
 p1:function(a){var z,y
 z=a.gSJ()
@@ -4405,20 +4483,20 @@
 q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
 return new P.lj("Cannot add new events while doing an addStream")},
 h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WVu")},248,[]],
-fDe:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.fDe(a,null)},"JT","$2","$1","gGj",2,2,367,85,171,[],172,[]],
-cO:function(a){var z,y
+this.Iv(b)},"$1","ght",2,0,function(){return H.IG(function(a){return{func:"lU",void:true,args:[a]}},this.$receiver,"WV")},73],
+zw:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
+this.NA(a,b)},function(a){return this.zw(a,null)},"JT","$2","$1","gGj",2,2,74,18,19,20],
+S6:function(a){var z,y
 z=this.Gv
-if((z&4)!==0)return this.Ip
+if((z&4)!==0)return this.yx
 if(z>=4)throw H.b(this.q7())
 this.Gv=z|4
-y=this.SL()
-this.SY()
+y=this.im()
+this.Pl()
 return y},
-Rg:function(a,b){this.Iv(b)},
-V8:function(a,b){this.pb(a,b)},
-Qj:function(){var z=this.WX
+Rg:function(a){this.Iv(a)},
+V8:function(a,b){this.NA(a,b)},
+YB:function(){var z=this.WX
 this.WX=null
 this.Gv&=4294967287
 C.jN.tZ(z)},
@@ -4442,76 +4520,76 @@
 y=w}else y=y.giE()
 this.Gv&=4294967293
 if(this.iE===this)this.Of()},
-Of:function(){if((this.Gv&4)!==0&&this.Ip.Gv===0)this.Ip.OH(null)
+Of:function(){if((this.Gv&4)!==0&&this.yx.Gv===0)this.yx.OH(null)
 P.ot(this.QC)}},
-dz:{
-"^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
+zW:{
+"^":"WV;nL,QC,Gv,iE,SJ,WX,yx",
 Iv:function(a){var z=this.iE
 if(z===this)return
 if(z.giE()===this){this.Gv|=2
-this.iE.Rg(0,a)
+this.iE.Rg(a)
 this.Gv&=4294967293
 if(this.iE===this)this.Of()
 return}this.nE(new P.tK(this,a))},
-pb:function(a,b){if(this.iE===this)return
+NA:function(a,b){if(this.iE===this)return
 this.nE(new P.OR(this,a,b))},
-SY:function(){if(this.iE!==this)this.nE(new P.Bg(this))
-else this.Ip.OH(null)}},
+Pl:function(){if(this.iE!==this)this.nE(new P.eB(this))
+else this.yx.OH(null)}},
 tK:{
-"^":"Tp;a,b",
-$1:[function(a){a.Rg(0,this.b)},"$1",null,2,0,null,176,[],"call"],
+"^":"Xs;a,b",
+$1:function(a){a.Rg(this.b)},
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
+$signature:function(){return H.IG(function(a){return{func:"Xp",args:[[P.DR,a]]}},this.a,"zW")}},
 OR:{
-"^":"Tp;a,b,c",
-$1:[function(a){a.V8(this.b,this.c)},"$1",null,2,0,null,176,[],"call"],
+"^":"Xs;a,b,c",
+$1:function(a){a.V8(this.b,this.c)},
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"DU",args:[[P.KA,a]]}},this.a,"dz")}},
-Bg:{
-"^":"Tp;a",
-$1:[function(a){a.Qj()},"$1",null,2,0,null,176,[],"call"],
+$signature:function(){return H.IG(function(a){return{func:"Xp",args:[[P.DR,a]]}},this.a,"zW")}},
+eB:{
+"^":"Xs;a",
+$1:function(a){a.YB()},
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"WhE",args:[[P.JI,a]]}},this.a,"dz")}},
-DL:{
-"^":"WVu;nL,QC,Gv,iE,SJ,WX,Ip",
+$signature:function(){return H.IG(function(a){return{func:"qb",args:[[P.f6,a]]}},this.a,"zW")}},
+HX:{
+"^":"WV;nL,QC,Gv,iE,SJ,WX,yx",
 Iv:function(a){var z,y
-for(z=this.iE;z!==this;z=z.giE()){y=new P.LV(a,null)
+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.DS(a,b,null))},
-SY:function(){var z=this.iE
-if(z!==this)for(;z!==this;z=z.giE())z.w6(C.Wj)
-else this.Ip.OH(null)}},
+z.VI(y)}},
+NA:function(a,b){var z
+for(z=this.iE;z!==this;z=z.giE())z.VI(new P.WG(a,b,null))},
+Pl:function(){var z=this.iE
+if(z!==this)for(;z!==this;z=z.giE())z.VI(C.Wj)
+else this.yx.OH(null)}},
 b8:{
 "^":"a;",
 $isb8:true},
-ZC:{
-"^":"Tp:115;a,b",
+w4:{
+"^":"Xs:47;a,b",
 $0:[function(){var z,y,x,w
 try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
+y=new H.oP(x,null)
 this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
 $isEH:true},
 Pf0:{
 "^":"a;"},
 Zf:{
 "^":"Pf0;MM",
-oo:[function(a,b){var z=this.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.oo(a,null)},"tZ","$1","$0","gv6",0,2,368,85,30,[]],
+z.OH(b)},
 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,367,85,171,[],172,[]]},
+z.CG(a,b)},function(a){return this.w0(a,null)},"rC","$2","$1","gYJ",2,2,74,18,19,20]},
 vs:{
 "^":"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
+sVW: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},
@@ -4519,31 +4597,36 @@
 gIa:function(){return this.Gv===2?null:this.o4},
 Rx:function(a,b){var z,y
 z=$.X3
-y=H.VM(new P.vs(0,z,null,null,z.cR(a),null,P.VH(b,$.X3),null),[null])
+z.toString
+y=H.VM(new P.vs(0,z,null,null,a,null,P.VH(b,z),null),[null])
 this.au(y)
 return y},
 ml:function(a){return this.Rx(a,null)},
-yd:function(a,b){var z,y,x
+co:function(a,b){var z,y,x
 z=$.X3
 y=P.VH(a,z)
-x=H.VM(new P.vs(0,z,null,null,null,$.X3.cR(b),y,null),[null])
+$.X3.toString
+x=H.VM(new P.vs(0,z,null,null,null,b,y,null),[null])
 this.au(x)
 return x},
-OA:function(a){return this.yd(a,null)},
-YM:function(a){var z,y
+OA:function(a){return this.co(a,null)},
+wM:function(a){var z,y
 z=$.X3
-y=new P.vs(0,z,null,null,null,null,null,z.Al(a))
+z.toString
+y=new P.vs(0,z,null,null,null,null,null,a)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 this.au(y)
 return y},
 gDL:function(){return this.jk},
 gcG:function(){return this.jk},
-Am:function(a){this.Gv=4
+At: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)
+au:function(a){var z
+if(this.Gv>=4){z=this.Lj
+z.toString
+P.Tk(z,null,z,new P.da(this,a))}else{a.sBQ(this.jk)
 this.jk=a}},
 L3:function(){var z,y,x
 z=this.jk
@@ -4555,379 +4638,357 @@
 if(!!z.$isb8)if(!!z.$isvs)P.A9(a,this)
 else P.k3(a,this)
 else{y=this.L3()
-this.Am(a)
+this.At(a)
 P.HZ(this,y)}},
 R8:function(a){var z=this.L3()
-this.Am(a)
+this.At(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,170,85,171,[],172,[]],
+P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,17,18,19,20],
 OH:function(a){var z
 if(a==null);else{z=J.x(a)
 if(!!z.$isb8){if(!!z.$isvs){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.rH(this,a))}else P.A9(a,this)}else P.k3(a,this)
+z=this.Lj
+z.toString
+P.Tk(z,null,z,new P.pZ(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.cX(this,a))},
-CG:function(a,b){if(this.Gv!==0)H.vh(P.w("Future already completed"))
+z=this.Lj
+z.toString
+P.Tk(z,null,z,new P.jq(this,a))},
+CG:function(a,b){var z
+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)},
+z=this.Lj
+z.toString
+P.Tk(z,null,z,new P.In(this,a,b))},
 L7:function(a,b){this.OH(a)},
+X8:function(a,b,c){this.CG(a,b)},
 $isvs:true,
 $isb8:true,
-static:{"^":"ewM,JE,C3n,oN1,NK",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},Ab:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
+static:{"^":"ewM,JE,C3n,Xh,NKU",Dt:function(a){return H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[a])},PG:function(a,b){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[b])
 z.L7(a,b)
 return z},Vu:function(a,b,c){var z=H.VM(new P.vs(0,$.X3,null,null,null,null,null,null),[c])
 z.X8(a,b,c)
-return z},k3:[function(a,b){b.swG(!0)
-a.Rx(new P.pV(b),new P.U7(b))},"$2","KP",4,0,null,33,[],82,[]],A9:[function(a,b){b.swG(!0)
+return z},k3:function(a,b){b.sVW(!0)
+a.Rx(new P.pV(b),new P.U7(b))},A9:function(a,b){b.sVW(!0)
 if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},"$2","dd",4,0,null,33,[],82,[]],yE:[function(a,b){var z
+else a.au(b)},yE:function(a,b){var z
 do{z=b.gBQ()
 b.sBQ(null)
 P.HZ(a,b)
 if(z!=null){b=z
-continue}else break}while(!0)},"$2","cN",4,0,null,33,[],167,[]],HZ:[function(a,b){var z,y,x,w,v,u,t,s,r,q
+continue}else break}while(!0)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q,p
 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())
+y=z.e.gLj()
+x=J.w8(v)
+u=v.gI4()
+y.toString
+P.CK(y,null,y,x,u)
 return}if(b==null)return
 if(b.gBQ()!=null){P.yE(z.e,b)
 return}x.b=!0
-u=z.e.gWj()?z.e.gDL():null
-x.c=u
+t=z.e.gWj()?z.e.gDL():null
+x.c=t
 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())
-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(s!=null)$.X3=s
+if(!y||b.gO1()!=null||b.gIa()!=null){s=b.gLj()
+if(w){u=z.e.gLj()
+u.toString
+s.toString
+u=s==null?u!=null:s!==u}else u=!1
+if(u){v=z.e.gcG()
+y=z.e.gLj()
+x=J.w8(v)
+u=v.gI4()
+y.toString
+P.CK(y,null,y,x,u)
+return}r=$.X3
+if(r==null?s!=null:r!==s)$.X3=s
+else r=null
+if(y){if(b.gO1()!=null)x.b=new P.rq(x,b,t,s).$0()}else new P.RW(z,x,b,s).$0()
+if(b.gIa()!=null)new P.YP(z,x,w,b,s).$0()
+if(r!=null)$.X3=r
 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).$isvs)if(r.Gv>=4){b.swG(!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()
+y=(t==null?y!=null:t!==y)&&!!J.x(y).$isb8}else y=!1
+if(y){q=x.c
+if(!!J.x(q).$isvs)if(q.Gv>=4){b.sVW(!0)
+z.e=q
+y=q
+continue}else P.A9(q,b)
+else P.k3(q,b)
+return}}if(x.b===!0){p=b.L3()
+b.At(x.c)}else{p=b.L3()
 v=x.c
 b.E6(J.w8(v),v.gI4())}z.e=b
 y=b
-b=q}},"$2","XX",4,0,null,33,[],167,[]]}},
+b=p}}}},
 da:{
-"^":"Tp:115;a,b",
+"^":"Xs:47;a,b",
 $0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 pV:{
-"^":"Tp:116;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,30,[],"call"],
+"^":"Xs:30;a",
+$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,16,"call"],
 $isEH:true},
 U7:{
-"^":"Tp:369;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
+"^":"Xs:75;b",
+$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,18,19,20,"call"],
 $isEH:true},
-rH:{
-"^":"Tp:115;a,b",
+pZ:{
+"^":"Xs:47;a,b",
 $0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
-cX:{
-"^":"Tp:115;c,d",
+jq:{
+"^":"Xs:47;c,d",
 $0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
-ZL:{
-"^":"Tp:115;a,b,c",
+In:{
+"^":"Xs:47;a,b,c",
 $0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
 $isEH:true},
 rq:{
-"^":"Tp:307;b,d,e,f",
-$0:[function(){var z,y,x,w
-try{this.b.c=this.f.FI(this.d.gO1(),this.e)
-return!0}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
+"^":"Xs:76;b,d,e,f",
+$0:function(){var z,y,x,w,v
+try{x=this.f
+w=this.d.gO1()
+x.toString
+this.b.c=P.V7(x,null,x,w,this.e)
+return!0}catch(v){x=H.Ru(v)
+z=x
+y=new H.oP(v,null)
 this.b.c=new P.Ca(z,y)
-return!1}},"$0",null,0,0,null,"call"],
+return!1}},
 $isEH:true},
 RW:{
-"^":"Tp:126;c,b,UI,bK",
-$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+"^":"Xs:13;c,b,UI,bK",
+$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
 z=this.c.e.gcG()
 r=this.UI
 y=r.gyK()
 x=!0
-if(y!=null)try{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
+if(y!=null)try{q=this.bK
+p=J.w8(z)
+q.toString
+x=P.V7(q,null,q,y,p)}catch(o){r=H.Ru(o)
 w=r
-v=new H.XO(q,null)
+v=new H.oP(o,null)
 r=J.w8(z)
-p=w
-o=(r==null?p==null:r===p)?z:new P.Ca(w,v)
+q=w
+n=(r==null?q==null:r===q)?z:new P.Ca(w,v)
 r=this.b
-r.c=o
+r.c=n
 r.b=!1
 return}u=r.go7()
 if(x===!0&&u!=null){try{r=u
-p=H.N7()
-p=H.KT(p,[p,p]).BD(r)
-n=this.bK
+q=H.G3()
+q=H.KT(q,[q,q]).BD(r)
+p=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)
+if(q){r=J.w8(z)
+q=z.gI4()
+p.toString
+m.c=P.Mu(p,null,p,u,r,q)}else{r=J.w8(z)
+p.toString
+m.c=P.V7(p,null,p,u,r)}}catch(o){r=H.Ru(o)
 t=r
-s=new H.XO(q,null)
+s=new H.oP(o,null)
 r=J.w8(z)
-p=t
-o=(r==null?p==null:r===p)?z:new P.Ca(t,s)
+q=t
+n=(r==null?q==null:r===q)?z:new P.Ca(t,s)
 r=this.b
-r.c=o
+r.c=n
 r.b=!1
 return}this.b.b=!0}else{r=this.b
 r.c=z
-r.b=!1}},"$0",null,0,0,null,"call"],
+r.b=!1}},
 $isEH:true},
-RT:{
-"^":"Tp:126;c,b,Gq,Rm,w3",
-$0:[function(){var z,y,x,w,v,u
+YP:{
+"^":"Xs:13;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)
-y=v
-x=new H.XO(w,null)
-if(this.Gq){v=J.w8(this.c.e.gcG())
-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()
-else u.c=new P.Ca(y,x)
-u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
-v.swG(!0)
+try{w=this.w3
+v=this.Rm.gIa()
+w.toString
+z.a=P.T8(w,null,w,v)}catch(u){w=H.Ru(u)
+y=w
+x=new H.oP(u,null)
+if(this.Gq){w=J.w8(this.c.e.gcG())
+v=y
+v=w==null?v==null:w===v
+w=v}else w=!1
+v=this.b
+if(w)v.c=this.c.e.gcG()
+else v.c=new P.Ca(y,x)
+v.b=!1}if(!!J.x(z.a).$isb8){w=this.Rm
+w.sVW(!0)
 this.b.d=!0
-z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},"$0",null,0,0,null,"call"],
+z.a.Rx(new P.jZ(this.c,w),new P.FZ(z,w))}},
 $isEH:true},
 jZ:{
-"^":"Tp:116;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,370,[],"call"],
+"^":"Xs:30;c,HZ",
+$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,77,"call"],
 $isEH:true},
 FZ:{
-"^":"Tp:369;a,mG",
+"^":"Xs:75;a,mG",
 $2:[function(a,b){var z,y
 z=this.a
 if(!J.x(z.a).$isvs){y=P.Dt(null)
 z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,85,171,[],172,[],"call"],
+y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,18,19,20,"call"],
 $isEH:true},
 OM:{
 "^":"a;FR>,aw@",
 Ki:function(a){return this.FR.$0()}},
-qh:{
+cb:{
 "^":"a;",
-ez:[function(a,b){return H.VM(new P.t3(b,this),[H.ip(this,"qh",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.qh,args:[{func:"Lf",args:[a]}]}},this.$receiver,"qh")},371,[]],
-Ft:[function(a,b){return H.VM(new P.aW(b,this),[H.ip(this,"qh",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.qh,args:[{func:"Xy",ret:P.QV,args:[a]}]}},this.$receiver,"qh")},371,[]],
+ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"bp",ret:P.cb,args:[{func:"Lf",args:[a]}]}},this.$receiver,"cb")},78],
+Ft:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"cb",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"xv",ret:P.cb,args:[{func:"Xy",ret:P.cX,args:[a]}]}},this.$receiver,"cb")},78],
 tg:function(a,b){var z,y
 z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.YJ(y),y.gaq())
+z.a=this.KR(new P.tG(z,this,b,y),!0,new P.kb(y),y.gaq())
 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.ib(y),y.gaq())
 return y},
 Vr:function(a,b){var z,y
 z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.Jp(z,this,b,y),!0,new P.eN(y),y.gaq())
+z.a=this.KR(new P.Ee(z,this,b,y),!0,new P.Ia(y),y.gaq())
 return y},
 gB:function(a){var z,y
 z={}
-y=P.Dt(J.bU)
+y=P.Dt(P.KN)
 z.a=0
-this.KR(new P.B5(z),!0,new P.PI(z,y),y.gaq())
+this.KR(new P.uO(z),!0,new P.hh(z,y),y.gaq())
 return y},
 gl0:function(a){var z,y
 z={}
-y=P.Dt(J.kn)
+y=P.Dt(P.a2)
 z.a=null
-z.a=this.KR(new P.j4(z,y),!0,new P.i9(y),y.gaq())
-return y},
-br:function(a){var z,y
-z=H.VM([],[H.ip(this,"qh",0)])
-y=P.Dt([J.Q,H.ip(this,"qh",0)])
-this.KR(new P.VV(this,z),!0,new P.Dy(z,y),y.gaq())
-return y},
-qZ:function(a,b){var z=H.VM(new P.Zz(b,this),[null])
-z.K6(this,b,null)
-return z},
-eR:function(a,b){var z=H.VM(new P.dq(b,this),[null])
-z.U6(this,b,null)
-return z},
-gtH:function(a){var z,y
-z={}
-y=P.Dt(H.ip(this,"qh",0))
-z.a=null
-z.a=this.KR(new P.lU(z,this,y),!0,new P.OC(y),y.gaq())
+z.a=this.KR(new P.iS(z,y),!0,new P.qg(y),y.gaq())
 return y},
 grZ:function(a){var z,y
 z={}
-y=P.Dt(H.ip(this,"qh",0))
+y=P.Dt(H.ip(this,"cb",0))
 z.a=null
 z.b=!1
 this.KR(new P.UH(z,this),!0,new P.Z5(z,y),y.gaq())
 return y},
-Zv:function(a,b){var z,y
-z={}
-z.a=b
-if(typeof b!=="number"||Math.floor(b)!==b||J.u6(b,0))throw H.b(P.u(z.a))
-y=P.Dt(H.ip(this,"qh",0))
-z.b=null
-z.b=this.KR(new P.j5(z,this,y),!0,new P.ii(z,y),y.gaq())
-return y},
-$isqh:true},
-Sd:{
-"^":"Tp;a,b,c,d",
+$iscb:true},
+tG:{
+"^":"Xs;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.jv(this.c,a),new P.bi(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
+P.FE(new P.BE(this.c,a),new P.Oh(z,y),P.TB(z.a,y))},"$1",null,2,0,null,79,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
-jv:{
-"^":"Tp:115;e,f",
-$0:[function(){return J.de(this.f,this.e)},"$0",null,0,0,null,"call"],
+$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
+BE:{
+"^":"Xs:47;e,f",
+$0:function(){return J.xC(this.f,this.e)},
 $isEH:true},
-bi:{
-"^":"Tp:310;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,372,[],"call"],
+Oh:{
+"^":"Xs:80;a,UI",
+$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-YJ:{
-"^":"Tp:115;bK",
+kb:{
+"^":"Xs:47;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
 lz:{
-"^":"Tp;a,b,c,d",
-$1:[function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,142,[],"call"],
+"^":"Xs;a,b,c,d",
+$1:[function(a){P.FE(new P.at(this.c,a),new P.mj(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,79,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
-Rl:{
-"^":"Tp:115;e,f",
-$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
+$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
+at:{
+"^":"Xs:47;e,f",
+$0:function(){return this.e.$1(this.f)},
 $isEH:true},
-Jb:{
-"^":"Tp:116;",
-$1:[function(a){},"$1",null,2,0,null,117,[],"call"],
+mj:{
+"^":"Xs:30;",
+$1:function(a){},
 $isEH:true},
-M4:{
-"^":"Tp:115;UI",
+ib:{
+"^":"Xs:47;UI",
 $0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Jp:{
-"^":"Tp;a,b,c,d",
+Ee:{
+"^":"Xs;a,b,c,d",
 $1:[function(a){var z,y
 z=this.a
 y=this.d
-P.FE(new P.h7(this.c,a),new P.pr(z,y),P.TB(z.a,y))},"$1",null,2,0,null,142,[],"call"],
+P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,79,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
-h7:{
-"^":"Tp:115;e,f",
-$0:[function(){return this.e.$1(this.f)},"$0",null,0,0,null,"call"],
+$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
+WN:{
+"^":"Xs:47;e,f",
+$0:function(){return this.e.$1(this.f)},
 $isEH:true},
-pr:{
-"^":"Tp:310;a,UI",
-$1:[function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},"$1",null,2,0,null,372,[],"call"],
+XPB:{
+"^":"Xs:80;a,UI",
+$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
 $isEH:true},
-eN:{
-"^":"Tp:115;bK",
+Ia:{
+"^":"Xs:47;bK",
 $0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
 $isEH:true},
-B5:{
-"^":"Tp:116;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,117,[],"call"],
+uO:{
+"^":"Xs:30;a",
+$1:[function(a){++this.a.a},"$1",null,2,0,null,81,"call"],
 $isEH:true},
-PI:{
-"^":"Tp:115;a,b",
+hh:{
+"^":"Xs:47;a,b",
 $0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
 $isEH:true},
-j4:{
-"^":"Tp:116;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,117,[],"call"],
+iS:{
+"^":"Xs:30;a,b",
+$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,81,"call"],
 $isEH:true},
-i9:{
-"^":"Tp:115;c",
+qg:{
+"^":"Xs:47;c",
 $0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
 $isEH:true},
-VV:{
-"^":"Tp;a,b",
-$1:[function(a){this.b.push(a)},"$1",null,2,0,null,248,[],"call"],
-$isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.a,"qh")}},
-Dy:{
-"^":"Tp:115;c,d",
-$0:[function(){this.d.rX(this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
-lU:{
-"^":"Tp;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,30,[],"call"],
-$isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
-OC:{
-"^":"Tp:115;d",
-$0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
-$isEH:true},
 UH:{
-"^":"Tp;a,b",
+"^":"Xs;a,b",
 $1:[function(a){var z=this.a
 z.b=!0
-z.a=a},"$1",null,2,0,null,30,[],"call"],
+z.a=a},"$1",null,2,0,null,16,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
+$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
 Z5:{
-"^":"Tp:115;a,c",
+"^":"Xs:47;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"],
 $isEH:true},
-j5:{
-"^":"Tp;a,b,c",
-$1:[function(a){var z=this.a
-if(J.de(z.a,0)){P.Bb(z.b,this.c,a)
-return}z.a=J.xH(z.a,1)},"$1",null,2,0,null,30,[],"call"],
-$isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"Lf",args:[a]}},this.b,"qh")}},
-ii:{
-"^":"Tp:115;a,d",
-$0:[function(){this.d.Lp(new P.bJ("value "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
-$isEH:true},
 MO:{
 "^":"a;",
 $isMO:true},
 O9:{
-"^":"aN;",
+"^":"ez;",
 w4:function(a){var z,y,x,w
 z=this.Y8
 if((z.Gv&4)!==0)H.vh(P.w("Subscribing to closed stream"))
 y=$.X3
 x=a?1:0
-w=H.VM(new P.JI(null,null,null,z,null,null,null,y,x,null,null),[H.Kp(z,0)])
+w=H.VM(new P.f6(null,null,null,z,null,null,null,y,x,null,null),[H.Kp(z,0)])
 w.SJ=w
 w.iE=w
 x=z.SJ
@@ -4944,68 +5005,69 @@
 if(!J.x(b).$isO9)return!1
 return b.Y8===this.Y8},
 $isO9:true},
-yU:{
-"^":"KA;Y8<",
+oh:{
+"^":"DR;Y8<",
 tA:function(){return this.gY8().j0(this)},
-uO:[function(){this.gY8()},"$0","gp4",0,0,126],
-LP:[function(){this.gY8()},"$0","gZ9",0,0,126]},
-nP:{
+uO:[function(){this.gY8()},"$0","gp4",0,0,13],
+LP:[function(){this.gY8()},"$0","gZ9",0,0,13]},
+oK:{
 "^":"a;"},
-KA:{
+DR:{
 "^":"a;pN,o7<,Bd,Lj<,Gv,lz,Ri",
-fe:function(a){this.pN=this.Lj.cR(a)},
-fm:function(a,b){if(b==null)b=P.AY()
+yl:function(a){this.Lj.toString
+this.pN=a},
+fm:function(a,b){if(b==null)b=P.Mm()
 this.o7=P.VH(b,this.Lj)},
 y5:function(a){if(a==null)a=P.v3()
-this.Bd=this.Lj.Al(a)},
-TJ:function(a,b){var z,y,x
+this.Lj.toString
+this.Bd=a},
+Fv:[function(a,b){var z,y
 z=this.Gv
 if((z&8)!==0)return
-y=(z+128|4)>>>0
-this.Gv=y
-if(z<128&&this.Ri!=null){x=this.Ri
-if(x.Gv===1)x.Gv=3}if((z&4)===0&&(y&32)===0)this.J7(this.gp4())},
-yy:function(a){return this.TJ(a,null)},
-QE:function(a){var z=this.Gv
+this.Gv=(z+128|4)>>>0
+if(b!=null)b.wM(this.gDQ(this))
+if(z<128&&this.Ri!=null){y=this.Ri
+if(y.Gv===1)y.Gv=3}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,82,18,83],
+ue:[function(a){var z=this.Gv
 if((z&8)!==0)return
 if(z>=128){z-=128
 this.Gv=z
 if(z<128)if((z&64)!==0&&this.Ri.N6!=null)this.Ri.t2(this)
 else{z=(z&4294967291)>>>0
 this.Gv=z
-if((z&32)===0)this.J7(this.gZ9())}}},
+if((z&32)===0)this.J7(this.gZ9())}}},"$0","gDQ",0,0,13],
 ed:function(){var z=(this.Gv&4294967279)>>>0
 this.Gv=z
 if((z&8)!==0)return this.lz
-this.Ek()
+this.tk()
 return this.lz},
-gRW:function(){return this.Gv>=128},
-Ek:function(){var z,y
+gUF:function(){return this.Gv>=128},
+tk:function(){var z,y
 z=(this.Gv|8)>>>0
 this.Gv=z
 if((z&64)!==0){y=this.Ri
 if(y.Gv===1)y.Gv=3}if((z&32)===0)this.Ri=null
 this.lz=this.tA()},
-Rg:function(a,b){var z=this.Gv
+Rg:function(a){var z=this.Gv
 if((z&8)!==0)return
-if(z<32)this.Iv(b)
-else this.w6(H.VM(new P.LV(b,null),[null]))},
+if(z<32)this.Iv(a)
+else this.VI(H.VM(new P.fZ(a,null),[null]))},
 V8:function(a,b){var z=this.Gv
 if((z&8)!==0)return
-if(z<32)this.pb(a,b)
-else this.w6(new P.DS(a,b,null))},
-Qj:function(){var z=this.Gv
+if(z<32)this.NA(a,b)
+else this.VI(new P.WG(a,b,null))},
+YB:function(){var z=this.Gv
 if((z&8)!==0)return
 z=(z|2)>>>0
 this.Gv=z
-if(z<32)this.SY()
-else this.w6(C.Wj)},
-uO:[function(){},"$0","gp4",0,0,126],
-LP:[function(){},"$0","gZ9",0,0,126],
+if(z<32)this.Pl()
+else this.VI(C.Wj)},
+uO:[function(){},"$0","gp4",0,0,13],
+LP:[function(){},"$0","gZ9",0,0,13],
 tA:function(){},
-w6:function(a){var z,y
+VI:function(a){var z,y
 z=this.Ri
-if(z==null){z=new P.Qk(null,null,0)
+if(z==null){z=new P.ny(null,null,0)
 this.Ri=z}z.h(0,a)
 y=this.Gv
 if((y&64)===0){y=(y|64)>>>0
@@ -5013,19 +5075,19 @@
 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.Lj.M8(this.pN,a)
 this.Gv=(this.Gv&4294967263)>>>0
 this.Kl((z&4)!==0)},
-pb:function(a,b){var z,y
+NA:function(a,b){var z,y
 z=this.Gv
-y=new P.Vo(this,a,b)
+y=new P.x1(this,a,b)
 if((z&1)!==0){this.Gv=(z|16)>>>0
-this.Ek()
+this.tk()
 y.$0()}else{y.$0()
 this.Kl((z&4)!==0)}},
-SY:function(){this.Ek()
+Pl:function(){this.tk()
 this.Gv=(this.Gv|16)>>>0
-new P.qB(this).$0()},
+new P.qQ(this).$0()},
 J7:function(a){var z=this.Gv
 this.Gv=(z|32)>>>0
 a.$0()
@@ -5048,70 +5110,74 @@
 z=(this.Gv&4294967263)>>>0
 this.Gv=z}if((z&64)!==0&&z<128)this.Ri.t2(this)},
 $isMO:true,
-static:{"^":"ry,bG,Q9,wd,yJ,Dr,HX,GC,bsZ"}},
-Vo:{
-"^":"Tp:126;a,b,c",
-$0:[function(){var z,y,x,w,v
+static:{"^":"Xx,bG,nS,Ir,yJ,Dr,JAK,GC,Pj"}},
+x1:{
+"^":"Xs:13;a,b,c",
+$0:function(){var z,y,x,w,v,u
 z=this.a
 y=z.Gv
 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)
+x=$.X3
+y.toString
+x.toString
+if(x==null?y!=null:x!==y)P.CK(x,null,x,this.b,this.c)
 else{x=z.o7
-w=H.N7()
+w=H.G3()
 w=H.KT(w,[w,w]).BD(x)
-v=this.b
-if(w)y.z8(x,v,this.c)
-else y.m1(x,v)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+v=z.o7
+u=this.b
+if(w)y.z8(v,u,this.c)
+else y.M8(v,u)}z.Gv=(z.Gv&4294967263)>>>0},
 $isEH:true},
-qB:{
-"^":"Tp:126;a",
-$0:[function(){var z,y
+qQ:{
+"^":"Xs:13;a",
+$0:function(){var z,y
 z=this.a
 y=z.Gv
 if((y&16)===0)return
 z.Gv=(y|42)>>>0
 z.Lj.bH(z.Bd)
-z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
+z.Gv=(z.Gv&4294967263)>>>0},
 $isEH:true},
-aN:{
-"^":"qh;",
+ez:{
+"^":"cb;",
 KR:function(a,b,c,d){var z=this.w4(!0===b)
-z.fe(a)
+z.yl(a)
 z.fm(0,d)
 z.y5(c)
 return z},
-yI:function(a){return this.KR(a,null,null,null)},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
+yI:function(a){return this.KR(a,null,null,null)},
 w4:function(a){var z,y
 z=$.X3
 y=a?1:0
-y=new P.KA(null,null,null,z,y,null,null)
+y=new P.DR(null,null,null,z,y,null,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y}},
 fIm:{
 "^":"a;aw@"},
-LV:{
+fZ:{
 "^":"fIm;P>,aw",
 dP:function(a){a.Iv(this.P)}},
-DS:{
+WG:{
 "^":"fIm;kc>,I4<,aw",
-dP:function(a){a.pb(this.kc,this.I4)}},
+dP:function(a){a.NA(this.kc,this.I4)}},
 JF:{
 "^":"a;",
-dP:function(a){a.SY()},
+dP:function(a){a.Pl()},
 gaw:function(){return},
 saw:function(a){throw H.b(P.w("No events after a done."))}},
-ht:{
+r5:{
 "^":"a;",
 t2:function(a){var z=this.Gv
 if(z===1)return
 if(z>=1){this.Gv=1
-return}P.rb(new P.CR(this,a))
+return}P.rb(new P.Vd(this,a))
 this.Gv=1}},
-CR:{
-"^":"Tp:115;a,b",
+Vd:{
+"^":"Xs:47;a,b",
 $0:[function(){var z,y
 z=this.a
 y=z.Gv
@@ -5119,8 +5185,8 @@
 if(y===3)return
 z.TO(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Qk:{
-"^":"ht;zR,N6,Gv",
+ny:{
+"^":"r5;zR,N6,Gv",
 gl0:function(a){return this.N6==null},
 h:function(a,b){var z=this.N6
 if(z==null){this.N6=b
@@ -5135,342 +5201,180 @@
 V1:function(a){if(this.Gv===1)this.Gv=3
 this.N6=null
 this.zR=null}},
-v1y:{
-"^":"Tp:115;a,b,c",
-$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
+dR:{
+"^":"Xs:47;a,b,c",
+$0:function(){return this.a.K5(this.b,this.c)},
 $isEH:true},
 uR:{
-"^":"Tp:373;a,b",
-$2:[function(a,b){return P.NX(this.a,this.b,a,b)},"$2",null,4,0,null,171,[],172,[],"call"],
+"^":"Xs:84;a,b",
+$2:function(a,b){return P.NX(this.a,this.b,a,b)},
 $isEH:true},
 Q0:{
-"^":"Tp:115;a,b",
-$0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
+"^":"Xs:47;a,b",
+$0:function(){return this.a.rX(this.b)},
 $isEH:true},
-YR:{
-"^":"qh;",
+og:{
+"^":"cb;",
 KR:function(a,b,c,d){var z,y,x,w,v
 b=!0===b
-z=H.ip(this,"YR",0)
-y=H.ip(this,"YR",1)
+z=H.ip(this,"og",0)
+y=H.ip(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.fe(a)
+v.nb(this,b,z,y)
+v.yl(a)
 v.fm(0,d)
 v.y5(c)
 return v},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)},
-Ml:function(a,b){b.Rg(0,a)},
-$asqh:function(a,b){return[b]}},
+ut:function(a,b){b.Rg(a)},
+$ascb:function(a,b){return[b]}},
 fB:{
-"^":"KA;UY,Ee,pN,o7,Bd,Lj,Gv,lz,Ri",
-Rg:function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.Rg.call(this,this,b)},
+"^":"DR;UY,WS,pN,o7,Bd,Lj,Gv,lz,Ri",
+Rg:function(a){if((this.Gv&2)!==0)return
+P.DR.prototype.Rg.call(this,a)},
 V8:function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.V8.call(this,a,b)},
-uO:[function(){var z=this.Ee
+P.DR.prototype.V8.call(this,a,b)},
+uO:[function(){var z=this.WS
 if(z==null)return
-z.yy(0)},"$0","gp4",0,0,126],
-LP:[function(){var z=this.Ee
+z.yy(0)},"$0","gp4",0,0,13],
+LP:[function(){var z=this.WS
 if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,126],
-tA:function(){var z=this.Ee
-if(z!=null){this.Ee=null
+z.ue(0)},"$0","gZ9",0,0,13],
+tA:function(){var z=this.WS
+if(z!=null){this.WS=null
 z.ed()}return},
-vx:[function(a){this.UY.Ml(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"kA",void:true,args:[a]}},this.$receiver,"fB")},248,[]],
-xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,374,171,[],172,[]],
-nn:[function(){this.Qj()},"$0","gH1",0,0,126],
-S8:function(a,b,c,d){var z,y
+vx:[function(a){this.UY.ut(a,this)},"$1","gOa",2,0,function(){return H.IG(function(a,b){return{func:"wa",void:true,args:[a]}},this.$receiver,"fB")},73],
+xL:[function(a,b){this.V8(a,b)},"$2","gRE",4,0,85,19,20],
+fE:[function(){this.YB()},"$0","gH1",0,0,13],
+nb:function(a,b,c,d){var z,y
 z=this.gOa()
 y=this.gRE()
-this.Ee=this.UY.Sb.zC(z,this.gH1(),y)},
-$asKA:function(a,b){return[b]},
+this.WS=this.UY.Sb.zC(z,this.gH1(),y)},
+$asDR:function(a,b){return[b]},
 $asMO:function(a,b){return[b]}},
 nO:{
-"^":"YR;qs,Sb",
-Dr:function(a){return this.qs.$1(a)},
-Ml:function(a,b){var z,y,x,w,v
+"^":"og;qs,Sb",
+wW:function(a){return this.qs.$1(a)},
+ut: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.wW(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 b.V8(y,x)
-return}if(z===!0)J.QM(b,a)},
-$asYR:function(a){return[a,a]},
-$asqh:null},
-t3:{
-"^":"YR;TN,Sb",
+return}if(z===!0)b.Rg(a)},
+$asog:function(a){return[a,a]},
+$ascb:null},
+c9:{
+"^":"og;TN,Sb",
 kn:function(a){return this.TN.$1(a)},
-Ml:function(a,b){var z,y,x,w,v
+ut:function(a,b){var z,y,x,w,v
 z=null
 try{z=this.kn(a)}catch(w){v=H.Ru(w)
 y=v
-x=new H.XO(w,null)
+x=new H.oP(w,null)
 b.V8(y,x)
-return}J.QM(b,z)}},
-aW:{
-"^":"YR;pK,Sb",
+return}b.Rg(z)}},
+Bg:{
+"^":"og;pK,Sb",
 GW:function(a){return this.pK.$1(a)},
-Ml:function(a,b){var z,y,x,w,v
-try{for(w=J.GP(this.GW(a));w.G();){z=w.gl()
-J.QM(b,z)}}catch(v){w=H.Ru(v)
+ut:function(a,b){var z,y,x,w,v
+try{for(w=J.mY(this.GW(a));w.G();){z=w.gl()
+b.Rg(z)}}catch(v){w=H.Ru(v)
 y=w
-x=new H.XO(v,null)
+x=new H.oP(v,null)
 b.V8(y,x)}}},
-Zz:{
-"^":"YR;Em,Sb",
-Ml:function(a,b){var z
-if(J.z8(this.Em,0)){b.Rg(0,a)
-z=J.xH(this.Em,1)
-this.Em=z
-if(J.de(z,0))b.Qj()}},
-K6:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))},
-$asYR:function(a){return[a,a]},
-$asqh:null},
-dq:{
-"^":"YR;Em,Sb",
-Ml:function(a,b){if(J.z8(this.Em,0)){this.Em=J.xH(this.Em,1)
-return}b.Rg(0,a)},
-U6:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.u(b))},
-$asYR:function(a){return[a,a]},
-$asqh:null},
-tU:{
-"^":"a;"},
-aY:{
-"^":"a;"},
-zG:{
-"^":"a;E2<,cP<,Jl<,pU<,Fh<,Xp<,fb<,rb<,Zq<,rF,JS>,iq<",
-hk:function(a,b){return this.E2.$2(a,b)},
-Gr:function(a){return this.cP.$1(a)},
-FI:function(a,b){return this.Jl.$2(a,b)},
-mg:function(a,b,c){return this.pU.$3(a,b,c)},
-Al:function(a){return this.Fh.$1(a)},
-cR:function(a){return this.Xp.$1(a)},
-O8:function(a){return this.fb.$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)},
-Ch:function(a,b){return this.JS.$1(b)},
-iT:function(a){return this.iq.$1$specification(a)}},
-e4y:{
-"^":"a;"},
-dl:{
-"^":"a;"},
-Id:{
-"^":"a;oh",
-gLj:function(){return this.oh},
-c1:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gE2()==null;)z=z.geT(z)
-return y.gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
-Vn:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gcP()==null;)z=z.geT(z)
-return y.gcP().$4(z,new P.Id(z.geT(z)),a,b)},
-qG:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gJl()==null;)z=z.geT(z)
-return y.gJl().$5(z,new P.Id(z.geT(z)),a,b,c)},
-nA:function(a,b,c,d){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gpU()==null;)z=z.geT(z)
-return y.gpU().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
-TE:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gFh(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-V6:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gXp(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-mz:function(a,b){var z,y
-z=this.oh
-for(;y=z.gWY().gfb(),y==null;)z=z.geT(z)
-return y.$4(z,new P.Id(z.geT(z)),a,b)},
-RK:function(a,b){var z,y,x
-z=this.oh
-for(;y=z.gWY(),y.grb()==null;)z=z.geT(z)
-x=z.geT(z)
-y.grb().$4(z,new P.Id(x),a,b)},
-dJ:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gZq()==null;)z=z.geT(z)
-return y.gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
-RB:function(a,b,c){var z,y
-z=this.oh
-for(;y=z.gWY(),y.gJS(y)==null;)z=z.geT(z)
-y.gJS(y).$4(z,new P.Id(z.geT(z)),b,c)},
-ld:function(a,b,c){var z,y,x
-z=this.oh
-for(;y=z.gWY(),y.giq()==null;)z=z.geT(z)
-x=z.geT(z)
-return y.giq().$5(z,new P.Id(x),a,b,c)}},
-WH:{
+fZi:{
 "^":"a;",
-fC:function(a){return this.gC5()===a.gC5()},
 bH: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
+M8: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.K5(this,z)},
 ce:function(a){return this.xi(a,!0)},
-oj:function(a,b){var z=this.cR(a)
+Nf:function(a,b){var z=this.wY(a)
 if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},
-PT:function(a,b){var z=this.O8(a)
-if(b)return new P.dv(this,z)
-else return new P.ph(this,z)}},
+else return new P.Hs(this,z)}},
 TF:{
-"^":"Tp:115;a,b",
+"^":"Xs:47;a,b",
 $0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
 K5:{
-"^":"Tp:115;c,d",
+"^":"Xs:47;c,d",
 $0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
 $isEH:true},
 Cg:{
-"^":"Tp:116;a,b",
-$1:[function(a){return this.a.m1(this.b,a)},"$1",null,2,0,null,184,[],"call"],
+"^":"Xs:30;a,b",
+$1:[function(a){return this.a.M8(this.b,a)},"$1",null,2,0,null,86,"call"],
 $isEH:true},
 Hs:{
-"^":"Tp:116;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,184,[],"call"],
+"^":"Xs:30;c,d",
+$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,86,"call"],
 $isEH:true},
-dv:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
-$isEH:true},
-ph:{
-"^":"Tp:300;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,60,[],61,[],"call"],
-$isEH:true},
-uo:{
-"^":"WH;eT>,WY<,R1",
-gC5:function(){return this.eT.gC5()},
-t:function(a,b){var z,y
-z=this.R1
-y=z.t(0,b)
-if(y!=null||z.x4(b))return y
-return this.eT.t(0,b)},
-hk:function(a,b){return new P.Id(this).c1(this,a,b)},
-c6:function(a,b){return new P.Id(this).ld(this,a,b)},
-iT:function(a){return this.c6(a,null)},
-Gr:function(a){return new P.Id(this).Vn(this,a)},
-FI:function(a,b){return new P.Id(this).qG(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)},
-cR: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)}},
-pK:{
-"^":"Tp:115;a,b",
-$0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
+FO:{
+"^":"Xs:47;a,b",
+$0:function(){P.IA(new P.eM(this.a,this.b))},
 $isEH:true},
 eM:{
-"^":"Tp:115;c,d",
+"^":"Xs:47;c,d",
 $0:[function(){var z,y
 z=this.c
-P.JS("Uncaught Error: "+H.d(z))
+P.mp("Uncaught Error: "+H.d(z))
 y=this.d
-if(y==null&&!!J.x(z).$isGe)y=z.gI4()
-if(y!=null)P.JS("Stack Trace: \n"+H.d(y)+"\n")
+if(y==null&&!!J.x(z).$isXS)y=z.gI4()
+if(y!=null)P.mp("Stack Trace: \n"+H.d(y)+"\n")
 throw H.b(z)},"$0",null,0,0,null,"call"],
 $isEH:true},
-Uez:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
-$isEH:true},
-AHi:{
-"^":"a;",
-gE2:function(){return P.xP()},
-hk:function(a,b){return this.gE2().$2(a,b)},
-gcP:function(){return P.AI()},
-Gr:function(a){return this.gcP().$1(a)},
-gJl:function(){return P.MM()},
-FI:function(a,b){return this.gJl().$2(a,b)},
-gpU:function(){return P.l4()},
-mg:function(a,b,c){return this.gpU().$3(a,b,c)},
-gFh:function(){return P.EU()},
-Al:function(a){return this.gFh().$1(a)},
-gXp:function(){return P.zi()},
-cR:function(a){return this.gXp().$1(a)},
-gfb:function(){return P.uu()},
-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.KF()},
-uN:function(a,b){return this.gZq().$2(a,b)},
-gJS:function(a){return P.YM()},
-Ch:function(a,b){return this.gJS(this).$1(b)},
-giq:function(){return P.hn()},
-iT:function(a){return this.giq().$1$specification(a)}},
-R8:{
-"^":"WH;",
+R81:{
+"^":"fZi;",
 geT:function(a){return},
-gWY:function(){return C.v8},
-gC5:function(){return this},
-fC:function(a){return a.gC5()===this},
 t:function(a,b){return},
-hk:function(a,b){return P.L2(this,null,this,a,b)},
-c6:function(a,b){return P.UA(this,null,this,a,b)},
-iT:function(a){return this.c6(a,null)},
+hk:function(a,b){return P.CK(this,null,this,a,b)},
 Gr:function(a){return P.T8(this,null,this,a)},
 FI:function(a,b){return P.V7(this,null,this,a,b)},
-mg:function(a,b,c){return P.Qx(this,null,this,a,b,c)},
+mg:function(a,b,c){return P.Mu(this,null,this,a,b,c)},
 Al: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,{
+wY:function(a){return a}}}],["dart.collection","dart:collection",,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])},
-jB:[function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z},"$0","A5",0,0,null],
-TQ:[function(a,b){return J.de(a,b)},"$2","Jo",4,0,198,118,[],199,[]],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,200,118,[]],
-Py:function(a,b,c,d,e){var z
-if(a==null){z=new P.k6(0,null,null,null,null)
+Ou:[function(a,b){return J.xC(a,b)},"$2","bd",4,0,21,22,23],
+T9:[function(a){return J.v1(a)},"$1","py",2,0,24,22],
+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.MP(a,b,c,d,e)},
-UD:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
+RN:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
+op:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
 yv:function(a){return H.VM(new P.YO(0,null,null,null,null),[a])},
-FO:[function(a){var z,y
-if($.xb().tg(0,a))return"(...)"
+m4:function(a,b,c){var z,y
+if($.xb().tg(0,a))return b+"..."+c
 $.xb().h(0,a)
 z=[]
-try{P.Vr(a,z)}finally{$.xb().Rz(0,a)}y=P.p9("(")
+try{P.eG(a,z)}finally{$.xb().Rz(0,a)}y=P.p9(b)
 y.We(z,", ")
-y.KF(")")
-return y.vM},"$1","Zw",2,0,null,127,[]],
-Vr:[function(a,b){var z,y,x,w,v,u,t,s,r,q
+y.KF(c)
+return y.vM},
+eG:function(a,b){var z,y,x,w,v,u,t,s,r,q
 z=a.gA(a)
 y=0
 x=0
@@ -5502,21 +5406,21 @@
 if(q==null){y+=5
 q="..."}}if(q!=null)b.push(q)
 b.push(u)
-b.push(v)},"$2","zE",4,0,null,127,[],201,[]],
+b.push(v)},
 L5:function(a,b,c,d,e){return H.VM(new P.YB(0,null,null,null,null,null,0),[d,e])},
-Ls:function(a,b,c,d){return H.VM(new P.b6(0,null,null,null,null,null,0),[d])},
-vW:[function(a){var z,y,x,w
+Ls:function(a,b,c,d){return H.VM(new P.D0(0,null,null,null,null,null,0),[d])},
+vW:function(a){var z,y,x,w
 z={}
 for(x=0;w=$.tw(),x<w.length;++x)if(w[x]===a)return"{...}"
 y=P.p9("")
 try{$.tw().push(a)
 y.KF("{")
 z.a=!0
-J.kH(a,new P.LG(z,y))
+J.kH(a,new P.W0(z,y))
 y.KF("}")}finally{z=$.tw()
 if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},"$1","DH",2,0,null,202,[]],
-k6:{
+z.pop()}return y.gvM()},
+bA:{
 "^":"a;X5,vv,OX,OB,wV",
 gB:function(a){return this.X5},
 gl0:function(a){return this.X5===0},
@@ -5530,10 +5434,7 @@
 Zt:function(a){var z=this.OB
 if(z==null)return!1
 return this.aH(z[this.nm(a)],a)>=0},
-di:function(a){var z=this.Ig()
-z.toString
-return H.Ck(z,new P.ce(this,a))},
-FV:function(a,b){J.kH(b,new P.DJ(this))},
+FV:function(a,b){H.bQ(b,new P.DJ(this))},
 t:function(a,b){var z,y,x,w
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)y=null
@@ -5550,13 +5451,13 @@
 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(z==null){z=P.a0()
+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
-if(y==null){y=P.a0()
+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
-if(z==null){z=P.a0()
+if(z==null){z=P.SQ()
 this.OB=z}y=this.nm(a)
 x=z[y]
 if(x==null){P.cW(z,y,[a,b]);++this.X5
@@ -5615,30 +5516,26 @@
 aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;y+=2)if(J.de(a[y],b))return y
+for(y=0;y<z;y+=2)if(J.xC(a[y],b))return y
 return-1},
 $isZ0:true,
-static:{vL:[function(a,b){var z=a[b]
-return z===a?null:z},"$2","ME",4,0,null,197,[],49,[]],cW:[function(a,b,c){if(c==null)a[b]=a
-else a[b]=c},"$3","rn",6,0,null,197,[],49,[],30,[]],a0:[function(){var z=Object.create(null)
+static:{vL:function(a,b){var z=a[b]
+return z===a?null:z},cW:function(a,b,c){if(c==null)a[b]=a
+else a[b]=c},SQ:function(){var z=Object.create(null)
 P.cW(z,"<non-identifier-key>",z)
 delete z["<non-identifier-key>"]
-return z},"$0","l1",0,0,null]}},
+return z}}},
 oi:{
-"^":"Tp:116;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,375,[],"call"],
-$isEH:true},
-ce:{
-"^":"Tp:116;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,375,[],"call"],
+"^":"Xs:30;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,87,"call"],
 $isEH:true},
 DJ:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Xs;a",
+$2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
-$signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"k6")}},
+$signature:function(){return H.IG(function(a,b){return{func:"vP",args:[a,b]}},this.a,"bA")}},
 PL:{
-"^":"k6;X5,vv,OX,OB,wV",
+"^":"bA;X5,vv,OX,OB,wV",
 nm:function(a){return H.CU(a)&0x3ffffff},
 aH:function(a,b){var z,y,x
 if(a==null)return-1
@@ -5646,30 +5543,30 @@
 for(y=0;y<z;y+=2){x=a[y]
 if(x==null?b==null:x===b)return y}return-1}},
 Fq:{
-"^":"k6;y9,Q6,ac,X5,vv,OX,OB,wV",
-WV:function(a,b){return this.y9.$2(a,b)},
+"^":"bA;m6,Q6,hg,X5,vv,OX,OB,wV",
+C2:function(a,b){return this.m6.$2(a,b)},
 H5:function(a){return this.Q6.$1(a)},
-Ef:function(a){return this.ac.$1(a)},
+Ef:function(a){return this.hg.$1(a)},
 t:function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.Dl.call(this,b)},
-u:function(a,b,c){P.k6.prototype.ms.call(this,b,c)},
+return P.bA.prototype.Dl.call(this,b)},
+u:function(a,b,c){P.bA.prototype.ms.call(this,b,c)},
 x4:function(a){if(this.Ef(a)!==!0)return!1
-return P.k6.prototype.Zt.call(this,a)},
+return P.bA.prototype.Zt.call(this,a)},
 Rz:function(a,b){if(this.Ef(b)!==!0)return
-return P.k6.prototype.bB.call(this,b)},
+return P.bA.prototype.bB.call(this,b)},
 nm:function(a){return this.H5(a)&0x3ffffff},
 aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;y+=2)if(this.WV(a[y],b)===!0)return y
+for(y=0;y<z;y+=2)if(this.C2(a[y],b)===!0)return y
 return-1},
 bu:function(a){return P.vW(this)},
 static:{MP:function(a,b,c,d,e){var z=new P.jG(d)
 return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
 jG:{
-"^":"Tp:116;a",
-$1:[function(a){var z=H.XY(a,this.a)
-return z},"$1",null,2,0,null,122,[],"call"],
+"^":"Xs:30;a",
+$1:function(a){var z=H.IU(a,this.a)
+return z},
 $isEH:true},
 fG:{
 "^":"mW;Fb",
@@ -5714,8 +5611,7 @@
 Zt:function(a){var z=this.OB
 if(z==null)return!1
 return this.aH(z[this.nm(a)],a)>=0},
-di:function(a){return H.VM(new P.i5(this),[H.Kp(this,0)]).Vr(0,new P.ou(this,a))},
-FV:function(a,b){J.kH(b,new P.S9(this))},
+FV:function(a,b){J.kH(b,new P.pk(this))},
 t:function(a,b){var z,y,x
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
 if(z==null)return
@@ -5733,13 +5629,13 @@
 return y[x].gS4()},
 u:function(a,b,c){var z,y
 if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){z=P.Qs()
+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
-if(y==null){y=P.Qs()
+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
-if(z==null){z=P.Qs()
+if(z==null){z=P.Jc()
 this.OB=z}y=this.nm(a)
 x=z[y]
 if(x==null)z[y]=[this.pE(a,b)]
@@ -5787,7 +5683,7 @@
 delete a[b]
 return z.gS4()},
 pE:function(a,b){var z,y
-z=new P.db(a,b,null,null)
+z=new P.aj(a,b,null,null)
 if(this.H9==null){this.lX=z
 this.H9=z}else{y=this.lX
 z.zQ=y
@@ -5807,29 +5703,25 @@
 aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;++y)if(J.de(a[y].gkh(),b))return y
+for(y=0;y<z;++y)if(J.xC(a[y].gkh(),b))return y
 return-1},
 bu:function(a){return P.vW(this)},
 $isFo:true,
 $isZ0:true,
-static:{Qs:[function(){var z=Object.create(null)
+static:{Jc:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z},"$0","Bs",0,0,null]}},
+return z}}},
 a1:{
-"^":"Tp:116;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,375,[],"call"],
+"^":"Xs:30;a",
+$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,87,"call"],
 $isEH:true},
-ou:{
-"^":"Tp:116;a,b",
-$1:[function(a){return J.de(this.a.t(0,a),this.b)},"$1",null,2,0,null,375,[],"call"],
-$isEH:true},
-S9:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+pk:{
+"^":"Xs;a",
+$2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
-db:{
+aj:{
 "^":"a;kh<,S4@,DG@,zQ@"},
 i5:{
 "^":"mW;Fb",
@@ -5860,8 +5752,8 @@
 return!1}else{this.fD=z.gkh()
 this.zq=this.zq.gDG()
 return!0}}}},
-Rr:{
-"^":"lN;",
+jg:{
+"^":"u3T;X5,vv,OX,OB,DM",
 gA:function(a){var z=new P.oz(this,this.Zl(),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
@@ -5875,12 +5767,12 @@
 bk:function(a){var z=this.OB
 if(z==null)return!1
 return this.aH(z[this.nm(a)],a)>=0},
-hV:function(a){var z
+iQ:function(a){var z
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
-return this.AD(a)},
-AD:function(a){var z,y,x
+return this.dn(a)},
+dn:function(a){var z,y,x
 z=this.OB
 if(z==null)return
 y=z[this.nm(a)]
@@ -5898,20 +5790,21 @@
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
 this.OX=y
-x=y}return this.cA(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
+x=y}return this.cA(x,b)}else return this.NZ(b)},
+NZ:function(a){var z,y,x
 z=this.OB
 if(z==null){z=P.jB()
-this.OB=z}y=this.nm(b)
+this.OB=z}y=this.nm(a)
 x=z[y]
-if(x==null)z[y]=[b]
-else{if(this.aH(x,b)>=0)return!1
-x.push(b)}++this.X5
+if(x==null)z[y]=[a]
+else{if(this.aH(x,a)>=0)return!1
+x.push(a)}++this.X5
 this.DM=null
 return!0},
 FV:function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},
 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
@@ -5957,14 +5850,17 @@
 aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;++y)if(J.de(a[y],b))return y
+for(y=0;y<z;++y)if(J.xC(a[y],b))return y
 return-1},
-$isz5:true,
 $isyN:true,
-$isQV:true,
-$asQV:null},
+$iscX:true,
+$ascX:null,
+static:{jB:function(){var z=Object.create(null)
+z["<non-identifier-key>"]=z
+delete z["<non-identifier-key>"]
+return z}}},
 YO:{
-"^":"Rr;X5,vv,OX,OB,DM",
+"^":"jg;X5,vv,OX,OB,DM",
 nm:function(a){return H.CU(a)&0x3ffffff},
 aH:function(a,b){var z,y,x
 if(a==null)return-1
@@ -5983,8 +5879,8 @@
 return!1}else{this.fD=z[y]
 this.zi=y+1
 return!0}}},
-b6:{
-"^":"lN;X5,vv,OX,OB,H9,lX,zN",
+D0:{
+"^":"u3T;X5,vv,OX,OB,H9,lX,zN",
 gA:function(a){var z=H.VM(new P.zQ(this,this.zN,null,null),[null])
 z.zq=z.O2.H9
 return z},
@@ -6000,12 +5896,12 @@
 bk:function(a){var z=this.OB
 if(z==null)return!1
 return this.aH(z[this.nm(a)],a)>=0},
-hV:function(a){var z
+iQ:function(a){var z
 if(!(typeof a==="string"&&a!=="__proto__"))z=typeof a==="number"&&(a&0x3ffffff)===a
 else z=!0
 if(z)return this.tg(0,a)?a:null
-else return this.AD(a)},
-AD:function(a){var z,y,x
+else return this.dn(a)},
+dn:function(a){var z,y,x
 z=this.OB
 if(z==null)return
 y=z[this.nm(a)]
@@ -6032,17 +5928,15 @@
 y["<non-identifier-key>"]=y
 delete y["<non-identifier-key>"]
 this.OX=y
-x=y}return this.cA(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
+x=y}return this.cA(x,b)}else return this.NZ(b)},
+NZ:function(a){var z,y,x
 z=this.OB
 if(z==null){z=P.T2()
-this.OB=z}y=this.nm(b)
+this.OB=z}y=this.nm(a)
 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},
-FV:function(a,b){var z
-for(z=J.GP(b);z.G();)this.h(0,z.gl())},
+if(x==null)z[y]=[this.xf(a)]
+else{if(this.aH(x,a)>=0)return!1
+x.push(this.xf(a))}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)},
@@ -6072,7 +5966,7 @@
 delete a[b]
 return!0},
 xf:function(a){var z,y
-z=new P.ef(a,null,null)
+z=new P.tj(a,null,null)
 if(this.H9==null){this.lX=z
 this.H9=z}else{y=this.lX
 z.zQ=y
@@ -6092,17 +5986,16 @@
 aH:function(a,b){var z,y
 if(a==null)return-1
 z=a.length
-for(y=0;y<z;++y)if(J.de(a[y].gGc(),b))return y
+for(y=0;y<z;++y)if(J.xC(a[y].gGc(),b))return y
 return-1},
-$isz5:true,
 $isyN:true,
-$isQV:true,
-$asQV:null,
-static:{T2:[function(){var z=Object.create(null)
+$iscX:true,
+$ascX:null,
+static:{T2:function(){var z=Object.create(null)
 z["<non-identifier-key>"]=z
 delete z["<non-identifier-key>"]
-return z},"$0","um",0,0,null]}},
-ef:{
+return z}}},
+tj:{
 "^":"a;Gc<,DG@,zQ@"},
 zQ:{
 "^":"a;O2,zN,zq,fD",
@@ -6115,32 +6008,21 @@
 this.zq=this.zq.gDG()
 return!0}}}},
 Yp:{
-"^":"w2Y;G4",
-gB:function(a){return J.q8(this.G4)},
-t:function(a,b){return J.i4(this.G4,b)}},
-lN:{
-"^":"mW;",
-tt:function(a,b){var z,y,x,w,v
-if(b){z=H.VM([],[H.Kp(this,0)])
-C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
-y.fixed$length=init
-z=H.VM(y,[H.Kp(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
-v=x+1
-if(x>=z.length)return H.e(z,x)
-z[x]=w}return z},
-br:function(a){return this.tt(a,!0)},
-bu:function(a){return H.mx(this,"{","}")},
-$isz5:true,
-$isyN:true,
-$isQV:true,
-$asQV:null},
+"^":"XC;G4",
+gB:function(a){return this.G4.length},
+t:function(a,b){var z=this.G4
+if(b>>>0!==b||b>=z.length)return H.e(z,b)
+return z[b]}},
+u3T:{
+"^":"Vj;",
+bu:function(a){return P.m4(this,"{","}")}},
 mW:{
 "^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"kY",ret:P.QV,args:[{func:"mL",args:[a]}]}},this.$receiver,"mW")},128,[]],
+ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"Uy",ret:P.cX,args:[{func:"YM",args:[a]}]}},this.$receiver,"mW")},46],
 ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-Ft:[function(a,b){return H.VM(new H.kV(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.QV,args:[{func:"E7",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},128,[]],
+Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"RS",ret:P.cX,args:[{func:"tr",ret:P.cX,args:[a]}]}},this.$receiver,"mW")},46],
 tg:function(a,b){var z
-for(z=this.gA(this);z.G();)if(J.de(z.gl(),b))return!0
+for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
 return!1},
 aN:function(a,b){var z
 for(z=this.gA(this);z.G();)b.$1(z.gl())},
@@ -6165,190 +6047,129 @@
 return y},
 gl0:function(a){return!this.gA(this).G()},
 gor:function(a){return this.gl0(this)!==!0},
-qZ:function(a,b){return H.Dw(this,b,H.ip(this,"mW",0))},
-eR:function(a,b){return H.ke(this,b,H.ip(this,"mW",0))},
 grZ:function(a){var z,y
 z=this.gA(this)
-if(!z.G())throw H.b(P.w("No elements"))
+if(!z.G())throw H.b(H.DU())
 do y=z.gl()
 while(z.G())
 return y},
-qA:function(a,b,c){var z,y
-for(z=this.gA(this);z.G();){y=z.gl()
-if(b.$1(y)===!0)return y}throw H.b(P.w("No matching element"))},
-XG:function(a,b){return this.qA(a,b,null)},
 Zv:function(a,b){var z,y,x,w
 if(typeof b!=="number"||Math.floor(b)!==b||b<0)throw H.b(P.N(b))
 for(z=this.gA(this),y=b;z.G();){x=z.gl()
 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.FO(this)},
-$isQV:true,
-$asQV:null},
-ar:{
+bu:function(a){return P.m4(this,"(",")")},
+$iscX:true,
+$ascX:null},
+rm:{
 "^":"a+lD;",
-$isList:true,
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null},
+$iscX:true,
+$ascX:null},
 lD:{
 "^":"a;",
 gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
 Zv:function(a,b){return this.t(a,b)},
 aN:function(a,b){var z,y
 z=this.gB(a)
-if(typeof z!=="number")return H.s(z)
-y=0
-for(;y<z;++y){b.$1(this.t(a,y))
+for(y=0;y<z;++y){b.$1(this.t(a,y))
 if(z!==this.gB(a))throw H.b(P.a4(a))}},
-gl0:function(a){return J.de(this.gB(a),0)},
+gl0:function(a){return this.gB(a)===0},
 gor:function(a){return!this.gl0(a)},
-grZ:function(a){if(J.de(this.gB(a),0))throw H.b(P.w("No elements"))
-return this.t(a,J.xH(this.gB(a),1))},
-tg:function(a,b){var z,y,x,w
+grZ:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
+return this.t(a,this.gB(a)-1)},
+tg:function(a,b){var z,y
 z=this.gB(a)
-y=J.x(z)
-x=0
-while(!0){w=this.gB(a)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-if(J.de(this.t(a,x),b))return!0
-if(!y.n(z,this.gB(a)))throw H.b(P.a4(a));++x}return!1},
+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},
 Vr:function(a,b){var z,y
 z=this.gB(a)
-if(typeof z!=="number")return H.s(z)
-y=0
-for(;y<z;++y){if(b.$1(this.t(a,y))===!0)return!0
+for(y=0;y<z;++y){if(b.$1(this.t(a,y))===!0)return!0
 if(z!==this.gB(a))throw H.b(P.a4(a))}return!1},
 zV:function(a,b){var z
-if(J.de(this.gB(a),0))return""
+if(this.gB(a)===0)return""
 z=P.p9("")
 z.We(a,b)
 return z.vM},
 ev:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"MQ",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lD")},128,[]],
-Ft:[function(a,b){return H.VM(new H.kV(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},128,[]],
-eR:function(a,b){return H.q9(a,b,null,null)},
+ez:[function(a,b){return H.VM(new H.lJ(a,b),[null,null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"uY",ret:P.cX,args:[{func:"K6",args:[a]}]}},this.$receiver,"lD")},46],
+Ft:[function(a,b){return H.VM(new H.zs(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"JY",ret:P.cX,args:[{func:"VL",ret:P.cX,args:[a]}]}},this.$receiver,"lD")},46],
+eR:function(a,b){return H.j5(a,b,null,null)},
 tt:function(a,b){var z,y,x
 if(b){z=H.VM([],[H.ip(a,"lD",0)])
-C.Nm.sB(z,this.gB(a))}else{y=this.gB(a)
-if(typeof y!=="number")return H.s(y)
-y=Array(y)
+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)])}x=0
-while(!0){y=this.gB(a)
-if(typeof y!=="number")return H.s(y)
-if(!(x<y))break
-y=this.t(a,x)
+z=H.VM(y,[H.ip(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;++x}return z},
+z[x]=y}return z},
 br:function(a){return this.tt(a,!0)},
 h:function(a,b){var z=this.gB(a)
-this.sB(a,J.WB(z,1))
+this.sB(a,z+1)
 this.u(a,z,b)},
 FV:function(a,b){var z,y,x
-for(z=J.GP(b);z.G();){y=z.gl()
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();){y=z.lo
 x=this.gB(a)
-this.sB(a,J.WB(x,1))
+this.sB(a,x+1)
 this.u(a,x,y)}},
-Rz:function(a,b){var z,y
-z=0
-while(!0){y=this.gB(a)
-if(typeof y!=="number")return H.s(y)
-if(!(z<y))break
-if(J.de(this.t(a,z),b)){this.YW(a,z,J.xH(this.gB(a),1),a,z+1)
-this.sB(a,J.xH(this.gB(a),1))
-return!0}++z}return!1},
 V1:function(a){this.sB(a,0)},
-GT:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,J.xH(this.gB(a),1),b)},
-np:function(a){return this.GT(a,null)},
+XP:function(a,b){if(b==null)b=P.n4()
+H.ZE(a,0,this.gB(a)-1,b)},
+Jd:function(a){return this.XP(a,null)},
 pZ: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)))},
-D6:function(a,b,c){var z,y,x,w
-c=this.gB(a)
-this.pZ(a,b,c)
-z=J.xH(c,b)
-y=H.VM([],[H.ip(a,"lD",0)])
-C.Nm.sB(y,z)
-if(typeof z!=="number")return H.s(z)
-x=0
-for(;x<z;++x){w=this.t(a,b+x)
-if(x>=y.length)return H.e(y,x)
-y[x]=w}return y},
-Jk:function(a,b){return this.D6(a,b,null)},
 Mu:function(a,b,c){this.pZ(a,b,c)
-return H.q9(a,b,c,null)},
+return H.j5(a,b,c,null)},
 UZ:function(a,b,c){var z
 this.pZ(a,b,c)
 z=c-b
-this.YW(a,b,J.xH(this.gB(a),z),a,c)
-this.sB(a,J.xH(this.gB(a),z))},
-YW:function(a,b,c,d,e){var z,y,x,w,v,u
-z=J.Wx(b)
-if(z.C(b,0)||z.D(b,this.gB(a)))H.vh(P.TE(b,0,this.gB(a)))
-z=J.Wx(c)
-if(z.C(c,b)||z.D(c,this.gB(a)))H.vh(P.TE(c,b,this.gB(a)))
-y=z.W(c,b)
-if(J.de(y,0))return
+this.YW(a,b,this.gB(a)-z,a,c)
+this.sB(a,this.gB(a)-z)},
+YW:function(a,b,c,d,e){var z,y,x,w,v
+if(b<0||b>this.gB(a))H.vh(P.TE(b,0,this.gB(a)))
+if(c<b||c>this.gB(a))H.vh(P.TE(c,b,this.gB(a)))
+z=c-b
+if(z===0)return
 if(e<0)throw H.b(P.u(e))
-z=J.x(d)
-if(!!z.$isList){x=e
-w=d}else{w=z.eR(d,e).tt(0,!1)
-x=0}if(typeof y!=="number")return H.s(y)
-z=J.U6(w)
-v=z.gB(w)
-if(typeof v!=="number")return H.s(v)
-if(x+y>v)throw H.b(P.w("Not enough elements"))
-if(typeof b!=="number")return H.s(b)
-if(x<b)for(u=y-1;u>=0;--u)this.u(a,b+u,z.t(w,x+u))
-else for(u=0;u<y;++u)this.u(a,b+u,z.t(w,x+u))},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-XU:function(a,b,c){var z,y
-z=this.gB(a)
-if(typeof z!=="number")return H.s(z)
-if(c>=z)return-1
-if(c<0)c=0
-y=c
-while(!0){z=this.gB(a)
-if(typeof z!=="number")return H.s(z)
-if(!(y<z))break
-if(J.de(this.t(a,y),b))return y;++y}return-1},
+y=J.x(d)
+if(!!y.$isWO){x=e
+w=d}else{w=y.eR(d,e).tt(0,!1)
+x=0}y=J.U6(w)
+if(x+z>y.gB(w))throw H.b(P.w("Not enough elements"))
+if(x<b)for(v=z-1;v>=0;--v)this.u(a,b+v,y.t(w,x+v))
+else for(v=0;v<z;++v)this.u(a,b+v,y.t(w,x+v))},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+XU:function(a,b,c){var z
+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},
 u8:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){var z,y
-c=J.xH(this.gB(a),1)
-for(z=c;y=J.Wx(z),y.F(z,0);z=y.W(z,1))if(J.de(this.t(a,z),b))return z
+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
 return-1},
 cn:function(a,b){return this.Pk(a,b,null)},
-xe:function(a,b,c){var z=this.gB(a)
-if(typeof z!=="number")return H.s(z)
-z=b>z
-if(z)throw H.b(P.TE(b,0,this.gB(a)))
+aP:function(a,b,c){if(b>this.gB(a))throw H.b(P.TE(b,0,this.gB(a)))
 if(b===this.gB(a)){this.h(a,c)
-return}this.sB(a,J.WB(this.gB(a),1))
+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
-if(b>=0){z=this.gB(a)
-if(typeof z!=="number")return H.s(z)
-z=b>z}else z=!0
-if(z)throw H.b(P.TE(b,0,this.gB(a)))
+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,J.WB(this.gB(a),y))
-if(typeof y!=="number")return H.s(y)
+this.sB(a,this.gB(a)+y)
 this.YW(a,b+y,this.gB(a),a,b)
 this.Mh(a,b,c)},
 Mh:function(a,b,c){var z,y
 z=J.x(c)
-if(!!z.$isList){z=z.gB(c)
-if(typeof z!=="number")return H.s(z)
-this.zB(a,b,b+z,c)}else for(z=z.gA(c);z.G();b=y){y=b+1
+if(!!z.$isWO)this.vg(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){var z
 if($.xb().tg(0,a))return"[...]"
@@ -6357,24 +6178,24 @@
 z.KF("[")
 z.We(a,", ")
 z.KF("]")}finally{$.xb().Rz(0,a)}return z.gvM()},
-$isList:true,
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null},
-LG:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.a
+$iscX:true,
+$ascX:null},
+W0:{
+"^":"Xs:50;a,b",
+$2:function(a,b){var z=this.a
 if(!z.a)this.b.KF(", ")
 z.a=!1
 z=this.b
 z.KF(a)
 z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,376,[],122,[],"call"],
+z.KF(b)},
 $isEH:true},
 Sw:{
 "^":"mW;v5,av,eZ,qT",
-gA:function(a){var z=new P.o0(this,this.eZ,this.qT,this.av,null)
+gA:function(a){var z=new P.KG(this,this.eZ,this.qT,this.av,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 aN:function(a,b){var z,y,x
@@ -6384,71 +6205,54 @@
 b.$1(x[y])
 if(z!==this.qT)H.vh(P.a4(this))}},
 gl0:function(a){return this.av===this.eZ},
-gB:function(a){return J.mQ(J.xH(this.eZ,this.av),this.v5.length-1)},
-grZ:function(a){var z,y
+gB:function(a){return(this.eZ-this.av&this.v5.length-1)>>>0},
+grZ:function(a){var z,y,x
 z=this.av
 y=this.eZ
 if(z===y)throw H.b(P.w("No elements"))
 z=this.v5
-y=J.mQ(J.xH(y,1),this.v5.length-1)
-if(y>=z.length)return H.e(z,y)
-return z[y]},
-Zv:function(a,b){var z,y,x
-z=J.Wx(b)
-if(z.C(b,0)||z.D(b,this.gB(this)))throw H.b(P.TE(b,0,this.gB(this)))
-z=this.v5
-y=this.av
-if(typeof b!=="number")return H.s(b)
 x=z.length
-y=(y+b&x-1)>>>0
+y=(y-1&x-1)>>>0
 if(y<0||y>=x)return H.e(z,y)
 return z[y]},
 tt:function(a,b){var z,y
 if(b){z=H.VM([],[H.Kp(this,0)])
 C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
 y.fixed$length=init
-z=H.VM(y,[H.Kp(this,0)])}this.wR(z)
+z=H.VM(y,[H.Kp(this,0)])}this.GP(z)
 return z},
 br:function(a){return this.tt(a,!0)},
-h:function(a,b){this.NZ(0,b)},
+h:function(a,b){this.NZ(b)},
 FV:function(a,b){var z,y,x,w,v,u,t,s,r
-z=J.x(b)
-if(!!z.$isList){y=z.gB(b)
-x=this.gB(this)
-if(typeof y!=="number")return H.s(y)
-z=x+y
+z=b.length
+y=this.gB(this)
+x=y+z
 w=this.v5
 v=w.length
-if(z>=v){u=P.ua(z)
+if(x>=v){u=P.Pd(x)
 if(typeof u!=="number")return H.s(u)
 w=Array(u)
 w.fixed$length=init
 t=H.VM(w,[H.Kp(this,0)])
-this.eZ=this.wR(t)
+this.eZ=this.GP(t)
 this.v5=t
 this.av=0
-H.qG(t,x,z,b,0)
-this.eZ=J.WB(this.eZ,y)}else{z=this.eZ
-if(typeof z!=="number")return H.s(z)
-s=v-z
-if(y<s){H.qG(w,z,z+y,b,0)
-this.eZ=J.WB(this.eZ,y)}else{r=y-s
-H.qG(w,z,z+s,b,0)
-z=this.v5
-H.qG(z,0,r,b,s)
-this.eZ=r}}++this.qT}else for(z=z.gA(b);z.G();)this.NZ(0,z.gl())},
-Rz:function(a,b){var z,y
-for(z=this.av;z!==this.eZ;z=(z+1&this.v5.length-1)>>>0){y=this.v5
-if(z<0||z>=y.length)return H.e(y,z)
-if(J.de(y[z],b)){this.bB(z);++this.qT
-return!0}}return!1},
+H.qG(t,y,x,b,0)
+this.eZ+=z}else{x=this.eZ
+s=v-x
+if(z<s){H.qG(w,x,x+z,b,0)
+this.eZ+=z}else{r=z-s
+H.qG(w,x,x+s,b,0)
+x=this.v5
+H.qG(x,0,r,b,s)
+this.eZ=r}}++this.qT},
 V1:function(a){var z,y,x,w,v
 z=this.av
 y=this.eZ
 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.eZ=0
 this.av=0;++this.qT}},
-bu:function(a){return H.mx(this,"{","}")},
+bu:function(a){return P.m4(this,"{","}")},
 AR:function(){var z,y,x,w
 z=this.av
 if(z===this.eZ)throw H.b(P.w("No elements"));++this.qT
@@ -6459,33 +6263,16 @@
 y[z]=null
 this.av=(z+1&x-1)>>>0
 return w},
-NZ:function(a,b){var z,y
+NZ:function(a){var z,y,x
 z=this.v5
 y=this.eZ
-if(y>>>0!==y||y>=z.length)return H.e(z,y)
-z[y]=b
-y=(y+1&this.v5.length-1)>>>0
-this.eZ=y
-if(this.av===y)this.VW();++this.qT},
-bB:function(a){var z,y,x,w,v,u,t,s
-z=this.v5.length-1
-if((a-this.av&z)>>>0<J.mQ(J.xH(this.eZ,a),z)){for(y=this.av,x=this.v5,w=x.length,v=a;v!==y;v=u){u=(v-1&z)>>>0
-if(u<0||u>=w)return H.e(x,u)
-t=x[u]
-if(v<0||v>=w)return H.e(x,v)
-x[v]=t}if(y>=w)return H.e(x,y)
-x[y]=null
-this.av=(y+1&z)>>>0
-return(a+1&z)>>>0}else{y=J.mQ(J.xH(this.eZ,1),z)
-this.eZ=y
-for(x=this.v5,w=x.length,v=a;v!==y;v=s){s=(v+1&z)>>>0
-if(s<0||s>=w)return H.e(x,s)
-t=x[s]
-if(v<0||v>=w)return H.e(x,v)
-x[v]=t}if(y>=w)return H.e(x,y)
-x[y]=null
-return a}},
-VW:function(){var z,y,x,w
+x=z.length
+if(y<0||y>=x)return H.e(z,y)
+z[y]=a
+x=(y+1&x-1)>>>0
+this.eZ=x
+if(this.av===x)this.M9();++this.qT},
+M9:function(){var z,y,x,w
 z=Array(this.v5.length*2)
 z.fixed$length=init
 y=H.VM(z,[H.Kp(this,0)])
@@ -6499,36 +6286,30 @@
 this.av=0
 this.eZ=this.v5.length
 this.v5=y},
-wR:function(a){var z,y,x,w
+GP:function(a){var z,y,x,w,v
 z=this.av
 y=this.eZ
-if(typeof y!=="number")return H.s(y)
-if(z<=y){x=y-z
-z=this.v5
-y=this.av
-H.qG(a,0,x,z,y)
-return x}else{y=this.v5
-w=y.length-z
-H.qG(a,0,w,y,z)
+x=this.v5
+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.eZ
-if(typeof z!=="number")return H.s(z)
 y=this.v5
-H.qG(a,w,w+z,y,0)
-return J.WB(this.eZ,w)}},
+H.qG(a,v,v+z,y,0)
+return this.eZ+v}},
 Eo:function(a,b){var z=Array(8)
 z.fixed$length=init
 this.v5=H.VM(z,[b])},
 $isyN:true,
-$isQV:true,
-$asQV:null,
-static:{"^":"Mo",NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
-z.Eo(a,b)
-return z},ua:[function(a){var z
+$iscX:true,
+$ascX:null,
+static:{"^":"TN",Pd: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}},"$1","bD",2,0,null,203,[]]}},
-o0:{
+if(z===0)return a}}}},
+KG:{
 "^":"a;Lz,pP,qT,Dc,fD",
 gl:function(){return this.fD},
 G:function(){var z,y,x
@@ -6542,13 +6323,64 @@
 this.fD=z[y]
 this.Dc=(y+1&x-1)>>>0
 return!0}},
+lf:{
+"^":"a;",
+gl0:function(a){return this.gB(this)===0},
+gor:function(a){return this.gB(this)!==0},
+V1:function(a){this.Ex(this.br(0))},
+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.Kp(a,0)]);z.G();)this.Rz(0,z.lo)},
+tt:function(a,b){var z,y,x,w,v
+if(b){z=H.VM([],[H.ip(this,"lf",0)])
+C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
+y.fixed$length=init
+z=H.VM(y,[H.ip(this,"lf",0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
+v=x+1
+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.ip(this,"lf",0),null])},"$1","gIr",2,0,function(){return H.IG(function(a){return{func:"fQO",ret:P.cX,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lf")},46],
+bu:function(a){return P.m4(this,"{","}")},
+ev:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"lf",0)])},
+Ft:[function(a,b){return H.VM(new H.zs(this,b),[H.ip(this,"lf",0),null])},"$1","git",2,0,function(){return H.IG(function(a){return{func:"mh",ret:P.cX,args:[{func:"D6",ret:P.cX,args:[a]}]}},this.$receiver,"lf")},46],
+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
+x=H.d(z.gl())
+y.vM+=x}}return y.vM},
+Vr:function(a,b){var z
+for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
+return!1},
+grZ:function(a){var z,y
+z=this.gA(this)
+if(!z.G())throw H.b(H.DU())
+do y=z.gl()
+while(z.G())
+return y},
+$isyN:true,
+$iscX:true,
+$ascX:null},
+Vj:{
+"^":"a+lf;",
+$isyN:true,
+$iscX:true,
+$ascX:null},
 qv:{
 "^":"a;G3>,Bb>,T8>",
 $isqv:true},
 jp:{
 "^":"qv;P*,G3,Bb,T8",
 $asqv:function(a,b){return[a]}},
-GZ:{
+Xt:{
 "^":"a;",
 vh:function(a){var z,y,x,w,v,u,t,s
 z=this.aY
@@ -6559,7 +6391,7 @@
 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
+if(J.xZ(v,0)){t=z.Bb
 z.Bb=t.T8
 t.T8=z
 if(t.Bb==null){z=t
@@ -6584,21 +6416,7 @@
 y.T8=null
 y.Bb=null;++this.bb
 return v},
-Xu: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.de(this.vh(a),0))return
-z=this.aY;--this.P6
-y=z.Bb
-if(y==null)this.aY=z.T8
-else{x=z.T8
-y=this.Xu(y)
-this.aY=y
-y.T8=x}++this.qT
-return z},
-fS:function(a,b){var z,y;++this.P6;++this.qT
+K8:function(a,b){var z,y;++this.P6;++this.qT
 if(this.aY==null){this.aY=a
 return}z=J.u6(b,0)
 y=this.aY
@@ -6607,26 +6425,21 @@
 y.T8=null}else{a.T8=y
 a.Bb=y.Bb
 y.Bb=null}this.aY=a}},
-Nb:{
-"^":"GZ;Cw,ac,aY,iW,P6,qT,bb",
+Ba:{
+"^":"Xt;Cw,hg,aY,iW,P6,qT,bb",
 wS:function(a,b){return this.Cw.$2(a,b)},
-Ef:function(a){return this.ac.$1(a)},
+Ef:function(a){return this.hg.$1(a)},
 yV:function(a,b){return this.wS(a,b)},
 t:function(a,b){if(b==null)throw H.b(P.u(b))
 if(this.Ef(b)!==!0)return
-if(this.aY!=null)if(J.de(this.vh(b),0))return this.aY.P
-return},
-Rz:function(a,b){var z
-if(this.Ef(b)!==!0)return
-z=this.bB(b)
-if(z!=null)return z.P
+if(this.aY!=null)if(J.xC(this.vh(b),0))return this.aY.P
 return},
 u:function(a,b,c){var z
 if(b==null)throw H.b(P.u(b))
 z=this.vh(b)
-if(J.de(z,0)){this.aY.P=c
-return}this.fS(H.VM(new P.jp(c,b,null,null),[null,null]),z)},
-FV:function(a,b){J.kH(b,new P.bF(this))},
+if(J.xC(z,0)){this.aY.P=c
+return}this.K8(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},
 aN:function(a,b){var z,y,x
@@ -6639,75 +6452,64 @@
 gB:function(a){return this.P6},
 V1:function(a){this.aY=null
 this.P6=0;++this.qT},
-x4:function(a){return this.Ef(a)===!0&&J.de(this.vh(a),0)},
-di:function(a){return new P.BW(this,a,this.bb).$1(this.aY)},
-gvc:function(){return H.VM(new P.OG(this),[H.Kp(this,0)])},
-gUQ:function(a){var z=new P.uM(this)
+gvc:function(){return H.VM(new P.nF(this),[H.Kp(this,0)])},
+gUQ:function(a){var z=new P.ro(this)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
 bu:function(a){return P.vW(this)},
-$isNb:true,
-$asGZ:function(a,b){return[a]},
+$isBa:true,
+$asXt:function(a,b){return[a]},
 $asZ0:null,
 $isZ0:true,
 static:{GV:function(a,b,c,d){var z,y
 z=P.n4()
 y=new P.An(c)
-return H.VM(new P.Nb(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
+return H.VM(new P.Ba(z,y,null,H.VM(new P.qv(null,null,null),[c]),0,0,0),[c,d])}}},
 An:{
-"^":"Tp:116;a",
-$1:[function(a){var z=H.XY(a,this.a)
-return z},"$1",null,2,0,null,122,[],"call"],
+"^":"Xs:30;a",
+$1:function(a){var z=H.IU(a,this.a)
+return z},
 $isEH:true},
-bF:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+QG:{
+"^":"Xs;a",
+$2:function(a,b){this.a.u(0,a,b)},
 $isEH:true,
-$signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Nb")}},
-BW:{
-"^":"Tp:377;a,b,c",
-$1:[function(a){var z,y,x,w
-for(z=this.c,y=this.a,x=this.b;a!=null;){if(J.de(a.P,x))return!0
-if(z!==y.bb)throw H.b(P.a4(y))
-w=a.T8
-if(w!=null&&this.$1(w)===!0)return!0
-a=a.Bb}return!1},"$1",null,2,0,null,273,[],"call"],
-$isEH:true},
+$signature:function(){return H.IG(function(a,b){return{func:"ri",args:[a,b]}},this.a,"Ba")}},
 S6B:{
 "^":"a;",
 gl:function(){var z=this.ya
 if(z==null)return
 return this.Wb(z)},
-zw:function(a){var z
+Az:function(a){var z
 for(z=this.Jt;a!=null;){z.push(a)
 a=a.Bb}},
 G:function(){var z,y,x
-z=this.Dn
+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
 C.Nm.sB(y,0)
-if(x==null)this.zw(z.aY)
+if(x==null)this.Az(z.aY)
 else{z.vh(x.G3)
-this.zw(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
+this.Az(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
 z=y.pop()
 this.ya=z
-this.zw(z.T8)
+this.Az(z.T8)
 return!0},
-Qf:function(a,b){this.zw(a.aY)}},
-OG:{
-"^":"mW;Dn",
-gB:function(a){return this.Dn.P6},
-gl0:function(a){return this.Dn.P6===0},
+Qf:function(a,b){this.Az(a.aY)}},
+nF:{
+"^":"mW;lT",
+gB:function(a){return this.lT.P6},
+gl0:function(a){return this.lT.P6===0},
 gA:function(a){var z,y
-z=this.Dn
+z=this.lT
 y=new P.DN(z,H.VM([],[P.qv]),z.qT,z.bb,null)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 y.Qf(z,H.Kp(this,0))
 return y},
 $isyN:true},
-uM:{
+ro:{
 "^":"mW;Fb",
 gB:function(a){return this.Fb.P6},
 gl0:function(a){return this.Fb.P6===0},
@@ -6718,37 +6520,37 @@
 y.Qf(z,H.Kp(this,1))
 return y},
 $asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]},
+$ascX:function(a,b){return[b]},
 $isyN:true},
 DN:{
-"^":"S6B;Dn,Jt,qT,bb,ya",
+"^":"S6B;lT,Jt,qT,bb,ya",
 Wb:function(a){return a.G3}},
 ZM:{
-"^":"S6B;Dn,Jt,qT,bb,ya",
+"^":"S6B;lT,Jt,qT,bb,ya",
 Wb:function(a){return a.P},
 $asS6B:function(a,b){return[b]}},
 HW:{
-"^":"S6B;Dn,Jt,qT,bb,ya",
+"^":"S6B;lT,Jt,qT,bb,ya",
 Wb:function(a){return a},
 $asS6B:function(a){return[[P.qv,a]]}}}],["dart.convert","dart:convert",,P,{
 "^":"",
-VQ:[function(a,b){var z=b==null?new P.JC():b
-return z.$2(null,new P.f1(z).$1(a))},"$2","os",4,0,null,204,[],205,[]],
-BS:[function(a,b){var z,y,x,w
+Uw:function(a,b){var z=b==null?new P.JC():b
+return z.$2(null,new P.f1(z).$1(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)},"$2","H4",4,0,null,33,[],205,[]],
-tp:[function(a){return a.Lt()},"$1","BC",2,0,206,6,[]],
+throw H.b(P.cD(String(y)))}return P.Uw(z,b)},
+tp:[function(a){return a.Bu()},"$1","Mn",2,0,25,26],
 JC:{
-"^":"Tp:300;",
-$2:[function(a,b){return b},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Xs:50;",
+$2:function(a,b){return b},
 $isEH:true},
 f1:{
-"^":"Tp:116;a",
-$1:[function(a){var z,y,x,w,v,u,t
+"^":"Xs:30;a",
+$1:function(a){var z,y,x,w,v,u,t
 if(a==null||typeof a!="object")return a
 if(Object.getPrototypeOf(a)===Array.prototype){z=a
 for(y=this.a,x=0;x<z.length;++x)z[x]=y.$2(x,this.$1(z[x]))
@@ -6757,48 +6559,48 @@
 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},"$1",null,2,0,null,21,[],"call"],
+return v},
 $isEH:true},
-Uk:{
+Wf:{
 "^":"a;"},
 zF:{
 "^":"a;"},
-Zi:{
-"^":"Uk;",
-$asUk:function(){return[J.O,[J.Q,J.bU]]}},
+Ziv:{
+"^":"Wf;",
+$asWf:function(){return[P.qU,[P.WO,P.KN]]}},
 Ud:{
-"^":"Ge;Ct,FN",
+"^":"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."},
-static:{NM:function(a,b){return new P.Ud(a,b)}}},
+static:{Gy:function(a,b){return new P.Ud(a,b)}}},
 K8:{
 "^":"Ud;Ct,FN",
 bu:function(a){return"Cyclic error in JSON stringify"},
 static:{TP:function(a){return new P.K8(a,null)}}},
-by:{
-"^":"Uk;N5<,iY",
-pW:function(a,b){return P.BS(a,this.gHe().N5)},
+D4:{
+"^":"Wf;qa<,fO",
+pW:function(a,b){return P.jc(a,this.gHe().qa)},
 kV:function(a){return this.pW(a,null)},
-Co:function(a,b){var z=this.gZE()
-return P.Ks(a,z.Xi,z.UM)},
-KP:function(a){return this.Co(a,null)},
-gZE:function(){return C.cb},
+Q0:function(a,b){var z=this.gZE()
+return P.Vg(a,z.Xn,z.UM)},
+KP:function(a){return this.Q0(a,null)},
+gZE:function(){return C.Sr},
 gHe:function(){return C.A3},
-$asUk:function(){return[P.a,J.O]}},
-ze:{
-"^":"zF;UM,Xi",
-$aszF:function(){return[P.a,J.O]}},
+$asWf:function(){return[P.a,P.qU]}},
+dI:{
+"^":"zF;UM,Xn",
+$aszF:function(){return[P.a,P.qU]}},
 Cf:{
-"^":"zF;N5<",
-$aszF:function(){return[J.O,P.a]}},
+"^":"zF;qa<",
+$aszF:function(){return[P.qU,P.a]}},
 Sh:{
-"^":"a;iY,Vy,bV",
-Wt:function(a){return this.iY.$1(a)},
-aK:function(a){var z,y,x,w,v,u,t
+"^":"a;fO,cP,ol",
+iY:function(a){return this.fO.$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.Vy
+x=this.cP
 w=0
 v=0
 for(;v<y;++v){u=z.j(a,v)
@@ -6843,59 +6645,55 @@
 else if(w<y){z=z.Nj(a,w,y)
 x.vM+=z}},
 WD:function(a){var z,y,x,w
-for(z=this.bV,y=z.length,x=0;x<y;++x){w=z[x]
+for(z=this.ol,y=z.length,x=0;x<y;++x){w=z[x]
 if(a==null?w==null:a===w)throw H.b(P.TP(a))}z.push(a)},
-rl:function(a){var z,y,x,w
+C7:function(a){var z,y,x,w
 if(!this.IS(a)){this.WD(a)
-try{z=this.Wt(a)
-if(!this.IS(z)){x=P.NM(a,null)
-throw H.b(x)}x=this.bV
+try{z=this.iY(a)
+if(!this.IS(z)){x=P.Gy(a,null)
+throw H.b(x)}x=this.ol
 if(0>=x.length)return H.e(x,0)
 x.pop()}catch(w){x=H.Ru(w)
 y=x
-throw H.b(P.NM(a,y))}}},
+throw H.b(P.Gy(a,y))}}},
 IS:function(a){var z,y,x,w,v,u
 if(typeof a==="number"){if(!C.CD.gx8(a))return!1
-this.Vy.KF(C.CD.bu(a))
-return!0}else if(a===!0){this.Vy.KF("true")
-return!0}else if(a===!1){this.Vy.KF("false")
-return!0}else if(a==null){this.Vy.KF("null")
-return!0}else if(typeof a==="string"){z=this.Vy
+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
 z.KF("\"")
-this.aK(a)
+this.Ip(a)
 z.KF("\"")
 return!0}else{z=J.x(a)
-if(!!z.$isList){this.WD(a)
-y=this.Vy
+if(!!z.$isWO){this.WD(a)
+y=this.cP
 y.KF("[")
-if(J.z8(z.gB(a),0)){this.rl(z.t(a,0))
-x=1
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-y.vM+=","
-this.rl(z.t(a,x));++x}}y.KF("]")
-this.Ei(a)
+if(z.gB(a)>0){this.C7(z.t(a,0))
+for(x=1;x<z.gB(a);++x){y.vM+=","
+this.C7(z.t(a,x))}}y.KF("]")
+this.pg(a)
 return!0}else if(!!z.$isZ0){this.WD(a)
-y=this.Vy
+y=this.cP
 y.KF("{")
-for(w=J.GP(a.gvc()),v="\"";w.G();v=",\""){u=w.gl()
+for(w=J.mY(a.gvc()),v="\"";w.G();v=",\""){u=w.gl()
 y.vM+=v
-this.aK(u)
+this.Ip(u)
 y.vM+="\":"
-this.rl(z.t(a,u))}y.KF("}")
-this.Ei(a)
+this.C7(z.t(a,u))}y.KF("}")
+this.pg(a)
 return!0}else return!1}},
-Ei:function(a){var z=this.bV
+pg:function(a){var z=this.ol
 if(0>=z.length)return H.e(z,0)
 z.pop()},
-static:{"^":"P3,hyY,FC,zf,fc,fg,Do,bz,eJ,Ho,ql,XI,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Ks:[function(a,b,c){var z
-b=P.BC()
+static:{"^":"P3,hyY,IE,Jyf,NoV,fg,Wk,WF,E7,MU,vk,NXu,PBv,QVv",uI:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
+b=P.Mn()
 z=P.p9("")
-P.uI(z,b,c).rl(a)
-return z.vM},"$3","nB",6,0,null,6,[],207,[],208,[]]}},
-z0:{
-"^":"Zi;lH",
+P.uI(z,b,c).C7(a)
+return z.vM}}},
+Fd:{
+"^":"Ziv;IE",
 goc:function(a){return"utf-8"},
 gZE:function(){return new P.om()}},
 om:{
@@ -6904,84 +6702,84 @@
 z=J.U6(a)
 y=J.vX(z.gB(a),3)
 if(typeof y!=="number")return H.s(y)
-y=H.VM(Array(y),[J.bU])
+y=H.VM(Array(y),[P.KN])
 x=new P.Rw(0,0,y)
-if(x.fJ(a,0,z.gB(a))!==z.gB(a))x.Lb(z.j(a,J.xH(z.gB(a),1)),0)
-return C.Nm.D6(y,0,x.ZP)},
-$aszF:function(){return[J.O,[J.Q,J.bU]]}},
+if(x.rw(a,0,z.gB(a))!==z.gB(a))x.GT(z.j(a,J.xH(z.gB(a),1)),0)
+return C.Nm.aM(y,0,x.L8)},
+$aszF:function(){return[P.qU,[P.WO,P.KN]]}},
 Rw:{
-"^":"a;WF,ZP,EN",
-Lb:function(a,b){var z,y,x,w,v
-z=this.EN
-y=this.ZP
+"^":"a;So,L8,IT",
+GT:function(a,b){var z,y,x,w,v
+z=this.IT
+y=this.L8
 if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
 w=y+1
-this.ZP=w
+this.L8=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=(240|x>>>18)>>>0
 y=w+1
-this.ZP=y
+this.L8=y
 if(w>=v)return H.e(z,w)
 z[w]=128|x>>>12&63
 w=y+1
-this.ZP=w
+this.L8=w
 if(y>=v)return H.e(z,y)
 z[y]=128|x>>>6&63
-this.ZP=w+1
+this.L8=w+1
 if(w>=v)return H.e(z,w)
 z[w]=128|x&63
 return!0}else{w=y+1
-this.ZP=w
+this.L8=w
 v=z.length
 if(y>=v)return H.e(z,y)
 z[y]=224|a>>>12
 y=w+1
-this.ZP=y
+this.L8=y
 if(w>=v)return H.e(z,w)
 z[w]=128|a>>>6&63
-this.ZP=y+1
+this.L8=y+1
 if(y>=v)return H.e(z,y)
 z[y]=128|a&63
 return!1}},
-fJ:function(a,b,c){var z,y,x,w,v,u,t,s
-if(b!==c&&(J.lE(a,J.xH(c,1))&64512)===55296)c=J.xH(c,1)
+rw:function(a,b,c){var z,y,x,w,v,u,t,s
+if(b!==c&&(J.FW(a,J.xH(c,1))&64512)===55296)c=J.xH(c,1)
 if(typeof c!=="number")return H.s(c)
-z=this.EN
+z=this.IT
 y=z.length
 x=J.rY(a)
 w=b
 for(;w<c;++w){v=x.j(a,w)
-if(v<=127){u=this.ZP
+if(v<=127){u=this.L8
 if(u>=y)break
-this.ZP=u+1
-z[u]=v}else if((v&64512)===55296){if(this.ZP+3>=y)break
+this.L8=u+1
+z[u]=v}else if((v&64512)===55296){if(this.L8+3>=y)break
 t=w+1
-if(this.Lb(v,x.j(a,t)))w=t}else if(v<=2047){u=this.ZP
+if(this.GT(v,x.j(a,t)))w=t}else if(v<=2047){u=this.L8
 s=u+1
 if(s>=y)break
-this.ZP=s
+this.L8=s
 if(u>=y)return H.e(z,u)
 z[u]=192|v>>>6
-this.ZP=s+1
-z[s]=128|v&63}else{u=this.ZP
+this.L8=s+1
+z[s]=128|v&63}else{u=this.L8
 if(u+2>=y)break
 s=u+1
-this.ZP=s
+this.L8=s
 if(u>=y)return H.e(z,u)
 z[u]=224|v>>>12
 u=s+1
-this.ZP=u
+this.L8=u
 if(s>=y)return H.e(z,s)
 z[s]=128|v>>>6&63
-this.ZP=u+1
+this.L8=u+1
 if(u>=y)return H.e(z,u)
 z[u]=128|v&63}}return w},
-static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
+static:{"^":"Jf"}}}],["dart.core","dart:core",,P,{
 "^":"",
-Te:[function(a){return},"$1","Ex",2,0,null,51,[]],
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,209,118,[],199,[]],
-hl:[function(a){var z,y,x,w,v
+Te:function(a){return},
+Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,27,22,23],
+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="\""
@@ -6998,46 +6796,49 @@
 else{w=H.Lw(v)
 w=z.vM+=w}}y=w+"\""
 z.vM=y
-return y}return"Instance of '"+H.lh(a)+"'"},"$1","Zx",2,0,null,6,[]],
+return y}return"Instance of '"+H.lh(a)+"'"},
 FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,212,118,[],199,[]],
-NS:[function(a){return H.CU(a)},"$1","cE",2,0,213,6,[]],
-QA:[function(a,b,c){return H.BU(a,c,b)},function(a){return P.QA(a,null,null)},null,function(a,b){return P.QA(a,b,null)},null,"$3$onError$radix","$1","$2$onError","ya",2,5,214,85,85,33,[],34,[],175,[]],
-O8:function(a,b,c){var z,y,x
-z=J.Qi(a,c)
-if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
-return z},
+ad:[function(a,b){return a==null?b==null:a===b},"$2","N3",4,0,28],
+QP:[function(a){return H.CU(a)},"$1","V4",2,0,29],
 F:function(a,b,c){var z,y
 z=H.VM([],[c])
-for(y=J.GP(a);y.G();)z.push(y.gl())
+for(y=J.mY(a);y.G();)z.push(y.gl())
 if(b)return z
 z.fixed$length=init
 return z},
-JS:[function(a){var z,y
-z=H.d(a)
-y=$.oK
-if(y==null)H.qw(z)
-else y.$1(z)},"$1","Pl",2,0,null,6,[]],
-HB:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a.gfN(a),b)},"$2",null,4,0,null,146,[],30,[],"call"],
+mp:function(a){var z=H.d(a)
+H.qw(z)},
+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)
+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
+if(t){u=H.Lw(v)
+y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
+y.vM+=u}else{u=H.Lw(37)
+y.vM+=u
+z.$2(v,y)}}return y.vM},
+Y25:{
+"^":"Xs:50;a",
+$2:function(a,b){this.a.u(0,a.gfN(),b)},
 $isEH:true},
 CL:{
-"^":"Tp:359;a",
-$2:[function(a,b){var z=this.a
+"^":"Xs:88;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(a.gfN())
 z.a.KF(": ")
-z.a.KF(P.hl(b));++z.b},"$2",null,4,0,null,49,[],30,[],"call"],
+z.a.KF(P.hl(b));++z.b},
 $isEH:true},
-p4:{
-"^":"a;OF",
-bu:function(a){return"Deprecated feature. Will be removed "+this.OF}},
 a2:{
 "^":"a;",
-bu:function(a){return this?"true":"false"},
-$isbool:true},
-Tx:{
+$isa2:true},
+"+bool":0,
+Ij:{
 "^":"a;"},
 iP:{
 "^":"a;y3<,aL",
@@ -7061,8 +6862,8 @@
 EK:function(){H.o2(this)},
 RM:function(a,b){if(Math.abs(a)>8640000000000000)throw H.b(P.u(a))},
 $isiP:true,
-static:{"^":"Oj2,bI,Hq,Kw,h2,mo,EQe,DU,tp1,Gio,fo,LC,E0,KeL,Ne,NrX,bm,FI,hZ,PW,dM,fQ",Gl:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=new H.VR(H.v4("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
+static:{"^":"bS,Vp,Hq,Kw,ch,mo,EQe,Qg,H9,Gio,Fz,cRS,E03,KeL,Ne,NrX,Dk,o4I,T3F,PW,TO,fQ",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.ol("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
 if(z!=null){y=new P.MF()
 x=z.QK
 if(1>=x.length)return H.e(x,1)
@@ -7085,7 +6886,7 @@
 if(8>=o)return H.e(x,8)
 if(x[8]!=null){if(9>=o)return H.e(x,9)
 o=x[9]
-if(o!=null){n=J.de(o,"-")?-1:1
+if(o!=null){n=J.xC(o,"-")?-1:1
 if(10>=x.length)return H.e(x,10)
 m=H.BU(x[10],null,null)
 if(11>=x.length)return H.e(x,11)
@@ -7094,38 +6895,42 @@
 l=J.WB(l,60*m)
 if(typeof l!=="number")return H.s(l)
 s=J.xH(s,n*l)}k=!0}else k=!1
-j=H.zW(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},"$1","le",2,0,null,210,[]],Wu:function(a,b){var z=new P.iP(a,b)
+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)
 z.RM(a,b)
-return z},Gq:[function(a){var z,y
+return z},Gq:function(a){var z,y
 z=Math.abs(a)
 y=a<0?"-":""
 if(z>=1000)return""+a
 if(z>=100)return y+"0"+H.d(z)
 if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},"$1","Cp",2,0,null,211,[]],Vx:[function(a){if(a>=100)return""+a
+return y+"000"+H.d(z)},Vx:function(a){if(a>=100)return""+a
 if(a>=10)return"0"+a
-return"00"+a},"$1","Dv",2,0,null,211,[]],h0:[function(a){if(a>=10)return""+a
-return"0"+a},"$1","wI",2,0,null,211,[]]}},
+return"00"+a},h0:function(a){if(a>=10)return""+a
+return"0"+a}}},
 MF:{
-"^":"Tp:379;",
-$1:[function(a){if(a==null)return 0
-return H.BU(a,null,null)},"$1",null,2,0,null,378,[],"call"],
+"^":"Xs:89;",
+$1:function(a){if(a==null)return 0
+return H.BU(a,null,null)},
 $isEH:true},
 Rq:{
-"^":"Tp:380;",
-$1:[function(a){if(a==null)return 0
-return H.IH(a,null)},"$1",null,2,0,null,378,[],"call"],
+"^":"Xs:90;",
+$1:function(a){if(a==null)return 0
+return H.RR(a,null)},
 $isEH:true},
+CP:{
+"^":"FK;",
+$isCP:true},
+"+double":0,
 a6:{
 "^":"a;Fq<",
-g:function(a,b){return P.k5(0,0,this.Fq+b.gFq(),0,0,0)},
-W:function(a,b){return P.k5(0,0,this.Fq-b.gFq(),0,0,0)},
+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)},
 U:function(a,b){if(typeof b!=="number")return H.s(b)
-return P.k5(0,0,C.CD.yu(C.CD.UD(this.Fq*b)),0,0,0)},
-Z:function(a,b){if(J.de(b,0))throw H.b(P.ts())
+return P.ii(0,0,C.CD.yu(C.CD.UD(this.Fq*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.k5(0,0,C.CD.Z(this.Fq,b),0,0,0)},
+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()},
@@ -7137,97 +6942,95 @@
 giO:function(a){return this.Fq&0x1FFFFFFF},
 iM:function(a,b){return C.CD.iM(this.Fq,b.gFq())},
 bu:function(a){var z,y,x,w,v
-z=new P.DW()
+z=new P.wr()
 y=this.Fq
-if(y<0)return"-"+P.k5(0,0,-y,0,0,0).bu(0)
+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))
 v=new P.P7().$1(C.CD.JV(y,1000000))
 return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
 $isa6:true,
-static:{"^":"Bk,S4d,pk,LoB,zj5,b2H,jS,ll,DoM,f4,vd,IJZ,iI,Wr,fm,rGr",k5:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
+static:{"^":"YN,v7,dko,LoB,RD,b2H,q9,ll,DoM,CvD,MV,IJZ,iI,Wr,Nw,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:{
-"^":"Tp:121;",
-$1:[function(a){if(a>=100000)return H.d(a)
+"^":"Xs:10;",
+$1:function(a){if(a>=100000)return H.d(a)
 if(a>=10000)return"0"+H.d(a)
 if(a>=1000)return"00"+H.d(a)
 if(a>=100)return"000"+H.d(a)
 if(a>=10)return"0000"+H.d(a)
-return"00000"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
+return"00000"+H.d(a)},
 $isEH:true},
-DW:{
-"^":"Tp:121;",
-$1:[function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},"$1",null,2,0,null,211,[],"call"],
+wr:{
+"^":"Xs:10;",
+$1:function(a){if(a>=10)return H.d(a)
+return"0"+H.d(a)},
 $isEH:true},
-Ge:{
+XS:{
 "^":"a;",
-gI4:function(){return new H.XO(this.$thrownJsError,null)},
-$isGe:true},
+gI4:function(){return new H.oP(this.$thrownJsError,null)},
+$isXS:true},
 LK:{
-"^":"Ge;",
+"^":"XS;",
 bu:function(a){return"Throw of null."}},
 AT:{
-"^":"Ge;G1>",
+"^":"XS;G1>",
 bu:function(a){var z=this.G1
 if(z!=null)return"Illegal argument(s): "+H.d(z)
 return"Illegal argument(s)"},
 static:{u:function(a){return new P.AT(a)}}},
-bJ:{
+Sn:{
 "^":"AT;G1",
 bu:function(a){return"RangeError: "+H.d(this.G1)},
-static:{C3:function(a){return new P.bJ(a)},N:function(a){return new P.bJ("value "+H.d(a))},TE:function(a,b,c){return new P.bJ("value "+H.d(a)+" not in range "+H.d(b)+".."+H.d(c))}}},
-yd:{
-"^":"Ge;",
-static:{hS:function(){return new P.yd()}}},
-mp:{
-"^":"Ge;uF,UP,mP,SA,mZ",
+static:{C3: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()}}},
+MC:{
+"^":"XS;uF,UP,mP,SA,vG",
 bu:function(a){var z,y,x,w,v,u
 z={}
 z.a=P.p9("")
 z.b=0
-y=this.mP
-if(y!=null)for(x=0;w=y.length,x<w;x=++z.b){if(x>0){v=z.a
+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
 if(x<0)return H.e(y,x)
 u=P.hl(y[x])
-v.vM+=typeof u==="string"?u:H.d(u)}y=this.SA
-if(y!=null)y.aN(0,new P.CL(z))
-return"NoSuchMethodError : method not found: '"+H.d(this.UP)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.vM+"]"},
-$ismp:true,
-static:{lr:function(a,b,c,d,e){return new P.mp(a,b,c,d,e)}}},
+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+"]"},
+$isMC:true,
+static:{lr:function(a,b,c,d,e){return new P.MC(a,b,c,d,e)}}},
 ub:{
-"^":"Ge;G1>",
+"^":"XS;G1>",
 bu:function(a){return"Unsupported operation: "+this.G1},
 static:{f:function(a){return new P.ub(a)}}},
 ds:{
-"^":"Ge;G1>",
+"^":"XS;G1>",
 bu:function(a){var z=this.G1
 return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"},
-$isGe:true,
+$isXS:true,
 static:{SY:function(a){return new P.ds(a)}}},
 lj:{
-"^":"Ge;G1>",
+"^":"XS;G1>",
 bu:function(a){return"Bad state: "+this.G1},
 static:{w:function(a){return new P.lj(a)}}},
 UV:{
-"^":"Ge;YA",
+"^":"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))+"."},
 static:{a4:function(a){return new P.UV(a)}}},
-TO:{
+vG:{
 "^":"a;",
 bu:function(a){return"Out of Memory"},
 gI4:function(){return},
-$isGe:true},
+$isXS:true},
 VS:{
 "^":"a;",
 bu:function(a){return"Stack Overflow"},
 gI4:function(){return},
-$isGe:true},
+$isXS:true},
 t7:{
-"^":"Ge;Wo",
+"^":"XS;Wo",
 bu:function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},
 static:{Gz:function(a){return new P.t7(a)}}},
 HG:{
@@ -7246,33 +7049,50 @@
 kM:{
 "^":"a;oc>",
 bu:function(a){return"Expando:"+H.d(this.oc)},
-t:function(a,b){var z=H.VK(b,"expando$values")
-return z==null?null:H.VK(z,this.Qz())},
-u:function(a,b,c){var z=H.VK(b,"expando$values")
+t:function(a,b){var z=H.of(b,"expando$values")
+return z==null?null:H.of(z,this.Qz())},
+u:function(a,b,c){var z=H.of(b,"expando$values")
 if(z==null){z=new P.a()
-H.aw(b,"expando$values",z)}H.aw(z,this.Qz(),c)},
+H.wV(b,"expando$values",z)}H.wV(z,this.Qz(),c)},
 Qz:function(){var z,y
-z=H.VK(this,"expando$key")
+z=H.of(this,"expando$key")
 if(z==null){y=$.Ss
 $.Ss=y+1
 z="expando$key$"+y
-H.aw(this,"expando$key",z)}return z},
-static:{"^":"Xa,rly,Ss"}},
+H.wV(this,"expando$key",z)}return z},
+static:{"^":"bZT,rly,Ss"}},
 EH:{
 "^":"a;",
 $isEH:true},
-QV:{
+KN:{
+"^":"FK;",
+$isKN:true},
+"+int":0,
+cX:{
 "^":"a;",
-$isQV:true,
-$asQV:null},
+$iscX:true,
+$ascX:null},
 AC:{
 "^":"a;"},
+WO:{
+"^":"a;",
+$isWO:true,
+$asWO:null,
+$isyN:true,
+$iscX:true,
+$ascX:null},
+"+List":0,
 Z0:{
 "^":"a;",
 $isZ0:true},
-L9:{
+c8:{
 "^":"a;",
 bu:function(a){return"null"}},
+"+Null":0,
+FK:{
+"^":"a;",
+$isFK:true},
+"+num":0,
 a:{
 "^":";",
 n:function(a,b){return this===b},
@@ -7284,26 +7104,27 @@
 Od:{
 "^":"a;",
 $isOd:true},
-MN:{
+mE:{
 "^":"a;"},
+qU:{
+"^":"a;",
+$isqU:true},
+"+String":0,
 WU:{
-"^":"a;Qk,SU,Oq,Wn",
+"^":"a;Cb,R7,C3,Wn",
 gl:function(){return this.Wn},
 G:function(){var z,y,x,w,v,u
-z=this.Oq
-this.SU=z
-y=this.Qk
-x=J.U6(y)
-if(z===x.gB(y)){this.Wn=null
-return!1}w=x.j(y,this.SU)
-v=this.SU+1
-if((w&64512)===55296){z=x.gB(y)
-if(typeof z!=="number")return H.s(z)
-z=v<z}else z=!1
-if(z){u=x.j(y,v)
-if((u&64512)===56320){this.Oq=v+1
+z=this.C3
+this.R7=z
+y=this.Cb
+x=y.length
+if(z===x){this.Wn=null
+return!1}w=C.xB.j(y,z)
+v=this.R7+1
+if((w&64512)===55296&&v<x){u=C.xB.j(y,v)
+if((u&64512)===56320){this.C3=v+1
 this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
-return!0}}this.Oq=v
+return!0}}this.C3=v
 this.Wn=w
 return!0}},
 Rn:{
@@ -7313,7 +7134,7 @@
 gor:function(a){return this.vM.length!==0},
 KF:function(a){this.vM+=typeof a==="string"?a:H.d(a)},
 We:function(a,b){var z,y
-z=J.GP(a)
+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())
@@ -7328,507 +7149,100 @@
 static:{p9:function(a){var z=new P.Rn("")
 z.PD(a)
 return z}}},
-wv:{
+IN:{
 "^":"a;",
-$iswv:true},
+$isIN:true},
 uq:{
 "^":"a;",
 $isuq:true},
-iD:{
-"^":"a;NN,HC,r0,Fi,ku,tP,Ka,YG,yW",
-gWu:function(){if(this.gJf(this)==="")return""
-var z=P.p9("")
-this.tb(z)
-return z.vM},
-gJf:function(a){var z
-if(C.xB.nC(this.NN,"[")){z=this.NN
-return C.xB.Nj(z,1,z.length-1)}return this.NN},
-gtp:function(a){var z
-if(J.de(this.HC,0)){z=this.Fi
-if(z==="http")return 80
-if(z==="https")return 443}return this.HC},
-Ja:function(a,b){return this.tP.$1(b)},
-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.Kd()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&C.xB.gor(y)&&!C.xB.nC(y,"/"))return"/"+y
-return y},
-Ky:function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
-uo:function(a){if(a.length>0&&J.lE(a,0)===58)return!0
-return J.UU(a,"/.")!==-1},
-SK:function(a){var z,y,x,w,v
-if(!this.uo(a))return a
-z=[]
-for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=!1;y.G();){w=y.lo
-if(J.de(w,"..")){v=z.length
-if(v!==0)if(v===1){if(0>=v)return H.e(z,0)
-v=!J.de(z[0],"")}else v=!0
-else v=!1
-if(v){if(0>=z.length)return H.e(z,0)
-z.pop()}x=!0}else if("."===w)x=!0
-else{z.push(w)
-x=!1}}if(x)z.push("")
-return C.Nm.zV(z,"/")},
-tb:function(a){var z=this.ku
-if(""!==z){a.KF(z)
-a.KF("@")}a.KF(this.NN)
-if(!J.de(this.HC,0)){a.KF(":")
-a.KF(J.AG(this.HC))}},
-bu:function(a){var z,y
-z=P.p9("")
-y=this.Fi
-if(""!==y){z.KF(y)
-z.KF(":")}if(this.gJf(this)!==""||y==="file"){z.KF("//")
-this.tb(z)}z.KF(this.r0)
-y=this.tP
-if(""!==y){z.KF("?")
-z.KF(y)}y=this.Ka
-if(""!==y){z.KF("#")
-z.KF(y)}return z.vM},
-n:function(a,b){var z,y
-if(b==null)return!1
-z=J.x(b)
-if(!z.$isiD)return!1
-if(this.Fi===b.Fi)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.de(this.gtp(this),z.gtp(b))){z=this.r0
-y=b.r0
-z=(z==null?y==null:z===y)&&this.tP===b.tP&&this.Ka===b.Ka}else z=!1
-else z=!1
-else z=!1
-else z=!1
-return z},
-giO:function(a){var z=new P.XZ()
-return z.$2(this.Fi,z.$2(this.ku,z.$2(this.gJf(this),z.$2(this.gtp(this),z.$2(this.r0,z.$2(this.tP,z.$2(this.Ka,1)))))))},
-n3:function(a,b,c,d,e,f,g,h,i){if(h==="http"&&J.de(e,80))this.HC=0
-else if(h==="https"&&J.de(e,443))this.HC=0
-else this.HC=e
-this.r0=this.x6(c,d)},
-$isiD:true,
-static:{"^":"n2,q7,tv,v5,vI,SF,fd,IL,hO,zk,yt,fC,O5,lf,qf,ML,j3,r5,Yk,qs,lL,WT,t2,H5,zst,LF,ws,Sp,aJ,JA7,HM,za,fbQ",hK:[function(a1){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a,a0
-x=new P.hP()
-w=new P.Uo(a1)
-v=J.U6(a1)
-u=v.gB(a1)
-if(J.de(u,0))return P.R6("","",null,null,0,null,null,null,"")
-if(v.j(a1,0)!==47){if(typeof u!=="number")return H.s(u)
-t=0
-for(;s=0,t<u;t=r){r=t+1
-q=v.j(a1,t)
-if(q<128){p=q>>>4
-if(p>=8)return H.e(C.mK,p)
-p=(C.mK[p]&C.jn.W4(1,q&15))!==0}else p=!1
-if(!p){if(q===58){s=r
-t=s}else{t=r-1
-s=0}break}}}else{t=0
-s=0}if(s===t){p=s+1
-if(typeof u!=="number")return H.s(u)
-p=p<u&&v.j(a1,s)===47&&v.j(a1,p)===47}else p=!1
-if(p){o=s+2
-for(n=-1;p=J.Wx(o),m=-1,p.C(o,u);){l=p.g(o,1)
-q=v.j(a1,o)
-if(x.$1(q)!==!0)if(q===91)o=w.$1(l)
-else{if(J.de(n,-1)&&q===58);else{p=q===64||q===58
-o=l-1
-if(p){m=v.XU(a1,"@",o)
-if(m===-1){o=t
-break}o=m+1
-for(n=-1;p=J.Wx(o),p.C(o,u);){l=p.g(o,1)
-q=v.j(a1,o)
-if(x.$1(q)!==!0)if(q===91)o=w.$1(l)
-else{if(q===58){if(!J.de(n,-1))throw H.b(P.cD("Double port in host"))}else{o=l-1
-break}o=l
-n=o}else o=l}break}else{m=-1
-break}}o=l
-n=o}else o=l}}else{o=s
-m=-1
-n=-1}for(k=o;x=J.Wx(k),x.C(k,u);k=j){j=x.g(k,1)
-q=v.j(a1,k)
-if(q===63||q===35){k=j-1
-break}}x=J.Wx(k)
-if(x.C(k,u)&&v.j(a1,k)===63)for(i=k;w=J.Wx(i),w.C(i,u);i=h){h=w.g(i,1)
-if(v.j(a1,i)===35){i=h-1
-break}}else i=k
-g=s>0?v.Nj(a1,0,s-1):null
-z=0
-if(s!==o){f=s+2
-if(m>0){e=v.Nj(a1,f,m)
-f=m+1}else e=""
-w=J.Wx(n)
-if(w.D(n,0)){y=v.Nj(a1,n,o)
-try{z=H.BU(y,null,null)}catch(d){H.Ru(d)
-throw H.b(P.cD("Invalid port: '"+H.d(y)+"'"))}c=v.Nj(a1,f,w.W(n,1))}else c=v.Nj(a1,f,o)}else{c=""
-e=""}b=v.Nj(a1,o,k)
-a=x.C(k,i)?v.Nj(a1,x.g(k,1),i):""
-x=J.Wx(i)
-a0=x.C(i,u)?v.Nj(a1,x.g(i,1),u):""
-return P.R6(a0,c,b,null,z,a,null,g,e)},"$1","rp",2,0,null,215,[]],R6:function(a,b,c,d,e,f,g,h,i){var z=P.iy(h)
-z=new P.iD(P.L7(b),null,null,z,i,P.LE(f,g),P.UJ(a),null,null)
-z.n3(a,b,c,d,e,f,g,h,i)
-return z},L7:[function(a){var z,y
-if(a.length===0)return a
-if(C.xB.j(a,0)===91){z=a.length-1
-if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
-P.eg(C.xB.Nj(a,1,z))
-return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
-if(a.charCodeAt(y)===58){P.eg(a)
-return"["+a+"]"}}return a},"$1","jC",2,0,null,216,[]],iy:[function(a){var z,y,x,w,v,u
-z=new P.hb()
-if(a==null)return""
-y=a.length
-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.mK,u)
-u=(C.mK[u]&C.jn.W4(1,v&15))!==0}else u=!1
-if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},"$1","Um",2,0,null,217,[]],LE:[function(a,b){var z,y,x
-z={}
-y=a==null
-if(y&&!0)return""
-y=!y
-if(y);if(y)return P.Xc(a)
-x=P.p9("")
-z.a=!0
-C.jN.aN(b,new P.yZ(z,x))
-return x.vM},"$2","wF",4,0,null,218,[],219,[]],UJ:[function(a){return P.Xc(a)},"$1","p7",2,0,null,220,[]],Xc:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z={}
-y=J.U6(a).u8(a,"%")
-z.a=y
-if(y<0)return a
-x=new P.Gs()
-w=new P.Tw()
-v=new P.wm(a,x,new P.pm())
-u=new P.FB(a)
-z.b=null
-t=a.length
-z.c=0
-s=new P.Lk(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.Lw(o)
-n.vM+=r}else{n.toString
-n.vM+="%"
-r=v.$1(z.a+1)
-n.toString
-r=H.Lw(r)
-n.vM+=r
-r=z.b
-n=v.$1(z.a+2)
-r.toString
-n=H.Lw(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)},"$1","Sy",2,0,null,221,[]],q5:[function(a){var z,y
-z=new P.Mx()
-y=a.split(".")
-if(y.length!==4)z.$1("IPv4 address should contain exactly 4 parts")
-return H.VM(new H.A8(y,new P.C9(z)),[null,null]).br(0)},"$1","cf",2,0,null,216,[]],eg:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
-z=new P.kZ()
-y=new P.JT(a,z)
-if(J.q8(a)<2)z.$1("address is too short")
-x=[]
-w=0
-u=!1
-t=0
-while(!0){s=J.q8(a)
-if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
-s=a
-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
-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")
-J.wT(x,-1)
-u=!0}else J.wT(x,y.$2(w,t))
-w=t+1}++t}if(J.q8(x)===0)z.$1("too few parts")
-q=J.de(w,J.q8(a))
-p=J.de(J.MQ(x),-1)
-if(q&&!p)z.$1("expected a part after last `:`")
-if(!q)try{J.wT(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
-try{v=P.q5(J.ZZ(a,w))
-s=J.Eh(J.UQ(v,0),8)
-r=J.UQ(v,1)
-if(typeof r!=="number")return H.s(r)
-J.wT(x,(s|r)>>>0)
-r=J.Eh(J.UQ(v,2),8)
-s=J.UQ(v,3)
-if(typeof s!=="number")return H.s(s)
-J.wT(x,(r|s)>>>0)}catch(o){H.Ru(o)
-z.$1("invalid end of IPv6 address.")}}if(u){if(J.q8(x)>7)z.$1("an address with a wildcard must have less than 7 parts")}else if(J.q8(x)!==8)z.$1("an address without a wildcard must contain exactly 8 parts")
-s=new H.kV(x,new P.d9(x))
-s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},"$1","q3",2,0,null,216,[]],jW:[function(a,b,c,d){var z,y,x,w,v,u,t
-z=new P.rI()
-y=P.p9("")
-x=c.gZE().WJ(b)
-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.W4(1,u.i(v,15)))!==0}else t=!1
-if(t){u=H.Lw(v)
-y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
-y.vM+=u}else{u=H.Lw(37)
-y.vM+=u
-z.$2(v,y)}}return y.vM},"$4$encoding$spaceToPlus","jd",4,5,null,222,223,224,[],225,[],226,[],227,[]]}},
-hP:{
-"^":"Tp:382;",
-$1:[function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.aa,z)
-z=(C.aa[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,381,[],"call"],
-$isEH:true},
-Uo:{
-"^":"Tp:383;a",
-$1:[function(a){a=J.aK(this.a,"]",a)
-if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},"$1",null,2,0,null,15,[],"call"],
-$isEH:true},
-hb:{
-"^":"Tp:382;",
-$1:[function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.HE,z)
-z=(C.HE[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,381,[],"call"],
-$isEH:true},
-Kd:{
-"^":"Tp:116;",
-$1:[function(a){return P.jW(C.Wd,a,C.xM,!1)},"$1",null,2,0,null,94,[],"call"],
-$isEH:true},
-yZ:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z=this.a
-if(!z.a)this.b.KF("&")
-z.a=!1
-z=this.b
-z.KF(P.jW(C.kg,a,C.xM,!0))
-b.gl0(b)
-z.KF("=")
-z.KF(P.jW(C.kg,b,C.xM,!0))},"$2",null,4,0,null,49,[],30,[],"call"],
-$isEH:true},
-Gs:{
-"^":"Tp:382;",
-$1:[function(a){var z
-if(!(48<=a&&a<=57))z=65<=a&&a<=70
-else z=!0
-return z},"$1",null,2,0,null,384,[],"call"],
-$isEH:true},
-pm:{
-"^":"Tp:382;",
-$1:[function(a){return 97<=a&&a<=102},"$1",null,2,0,null,384,[],"call"],
-$isEH:true},
-Tw:{
-"^":"Tp:382;",
-$1:[function(a){var z
-if(a<128){z=C.jn.GG(a,4)
-if(z>=8)return H.e(C.kg,z)
-z=(C.kg[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},"$1",null,2,0,null,381,[],"call"],
-$isEH:true},
-wm:{
-"^":"Tp:383;b,c,d",
-$1:[function(a){var z,y
-z=this.b
-y=C.xB.j(z,a)
-if(this.d.$1(y)===!0)return y-32
-else if(this.c.$1(y)!==!0)throw H.b(P.u("Invalid URI component: "+z))
-else return y},"$1",null,2,0,null,15,[],"call"],
-$isEH:true},
-FB:{
-"^":"Tp:383;e",
-$1:[function(a){var z,y,x,w
-for(z=this.e,y=0,x=0;x<2;++x){w=C.xB.j(z,a+x)
-if(48<=w&&w<=57)y=y*16+w-48
-else{w|=32
-if(97<=w&&w<=102)y=y*16+w-97+10
-else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return y},"$1",null,2,0,null,15,[],"call"],
-$isEH:true},
-Lk:{
-"^":"Tp:126;a,f",
-$0:[function(){var z,y,x,w,v
-z=this.a
-y=z.b
-x=z.c
-w=this.f
-v=z.a
-if(y==null)z.b=P.p9(C.xB.Nj(w,x,v))
-else y.KF(C.xB.Nj(w,x,v))},"$0",null,0,0,null,"call"],
-$isEH:true},
-XZ:{
-"^":"Tp:386;",
-$2:[function(a,b){var z=J.v1(a)
-if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},"$2",null,4,0,null,385,[],254,[],"call"],
-$isEH:true},
-Mx:{
-"^":"Tp:193;",
-$1:[function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},"$1",null,2,0,null,22,[],"call"],
-$isEH:true},
-C9:{
-"^":"Tp:116;a",
-$1:[function(a){var z,y
-z=H.BU(a,null,null)
-y=J.Wx(z)
-if(y.C(z,0)||y.D(z,255))this.a.$1("each part must be in the range of `0..255`")
-return z},"$1",null,2,0,null,387,[],"call"],
-$isEH:true},
-kZ:{
-"^":"Tp:193;",
-$1:[function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},"$1",null,2,0,null,22,[],"call"],
-$isEH:true},
-JT:{
-"^":"Tp:388;a,b",
-$2:[function(a,b){var z,y
-if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
-z=H.BU(C.xB.Nj(this.a,a,b),16,null)
-y=J.Wx(z)
-if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
-return z},"$2",null,4,0,null,134,[],135,[],"call"],
-$isEH:true},
-d9:{
-"^":"Tp:116;c",
-$1:[function(a){var z=J.x(a)
-if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},"$1",null,2,0,null,30,[],"call"],
-$isEH:true},
 rI:{
-"^":"Tp:300;",
-$2:[function(a,b){var z=J.Wx(a)
+"^":"Xs:50;",
+$2:function(a,b){var z=J.Wx(a)
 b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},"$2",null,4,0,null,389,[],390,[],"call"],
+b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
 $isEH:true}}],["dart.dom.html","dart:html",,W,{
 "^":"",
-UE:[function(a){if(P.F7()===!0)return"webkitTransitionEnd"
-else if(P.dg()===!0)return"oTransitionEnd"
-return"transitionend"},"$1","pq",2,0,228,21,[]],
-r3:[function(a,b){return document.createElement(a)},"$2","Oe",4,0,null,102,[],229,[]],
-It:[function(a,b,c){return W.lt(a,null,null,b,null,null,null,c).ml(new W.Kx())},"$3$onProgress$withCredentials","xF",2,5,null,85,85,230,[],231,[],232,[]],
-lt:[function(a,b,c,d,e,f,g,h){var z,y,x
-z=W.zU
+r3:function(a,b){return document.createElement(a)},
+It: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.W3.eo(x,"GET",a,!0)
-z=C.fK.aM(x)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new W.iO(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
-z=C.MD.aM(x)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
+z=H.VM(new W.RO(x,C.LF.Ph,!1),[null])
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(new W.bU(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
+z=H.VM(new W.RO(x,C.MD.Ph,!1),[null])
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(y.gYJ()),z.Sg),[H.Kp(z,0)]).Zz()
 x.send()
-return y.MM},"$8$method$mimeType$onProgress$requestHeaders$responseType$sendData$withCredentials","Za",2,15,null,85,85,85,85,85,85,85,230,[],233,[],231,[],234,[],235,[],236,[],237,[],232,[]],
+return y.MM},
 ED:function(a){var z,y
 z=document.createElement("input",null)
-if(a!=null)try{J.Lp(z,a)}catch(y){H.Ru(y)}return z},
-C0:[function(a,b){a=536870911&a+b
+if(a!=null)try{J.iM(z,a)}catch(y){H.Ru(y)}return z},
+VC:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","jx",4,0,null,238,[],30,[]],
-Pv:[function(a){if(a==null)return
-return W.P1(a)},"$1","Ie",2,0,null,239,[]],
-qc:[function(a){var z
+return a^a>>>6},
+Pv:function(a){if(a==null)return
+return W.P1(a)},
+qc:function(a){var z
 if(a==null)return
 if("setInterval" in a){z=W.P1(a)
-if(!!J.x(z).$isD0)return z
-return}else return a},"$1","Wq",2,0,null,21,[]],
-qr:[function(a){return a},"$1","Ku",2,0,null,21,[]],
-Pd:[function(a){if(!!J.x(a).$isYN)return a
-return P.o7(a,!0)},"$1","ra",2,0,null,99,[]],
-YT:[function(a,b){return new W.vZ(a,b)},"$2","AD",4,0,null,240,[],7,[]],
-GO:[function(a){return J.TD(a)},"$1","V5",2,0,116,48,[]],
-Yb:[function(a){return J.Vq(a)},"$1","cn",2,0,116,48,[]],
-Qp:[function(a,b,c,d){return J.qd(a,b,c,d)},"$4","A6",8,0,241,48,[],12,[],242,[],243,[]],
-wi:[function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
-z=J.Xr(d)
-if(z==null)throw H.b(P.u(d))
-y=z.prototype
-x=J.Nq(d,"created")
-if(x==null)throw H.b(P.u(H.d(d)+" has no constructor called 'created'"))
-J.ks(W.r3("article",null))
-w=z.$nativeSuperclassTag
-if(w==null)throw H.b(P.u(d))
-v=e==null
-if(v){if(!J.de(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.YT(x,y),1))}
-t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.V5(),1))}
-t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.cn(),1))}
-t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.A6(),4))}
-s=Object.create(u.prototype,t)
-r=H.Va(y)
-Object.defineProperty(s,init.dispatchPropertyName,{value:r,enumerable:false,writable:true,configurable:true})
-q={prototype:s}
-if(!v)q.extends=e
-b.registerElement(c,q)},"$5","uz",10,0,null,97,[],244,[],102,[],11,[],245,[]],
-aF:[function(a){if(J.de($.X3,C.NU))return a
+if(!!J.x(z).$isPZ)return z
+return}else return a},
+m7:function(a){return a},
+Z9:function(a){if(!!J.x(a).$isQF)return a
+return P.o7(a,!0)},
+Rl:function(a,b){return new W.vZ(a,b)},
+w6:[function(a){return J.N1(a)},"$1","B4",2,0,30,31],
+Hx:[function(a){return J.vr(a)},"$1","Z6",2,0,30,31],
+Qp:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","A6",8,0,32,31,33,34,35],
+aF:function(a){var z=$.X3
+if(z===C.NU)return a
 if(a==null)return
-return $.X3.oj(a,!0)},"$1","Rj",2,0,null,164,[]],
-K2:[function(a){if(J.de($.X3,C.NU))return a
-return $.X3.PT(a,!0)},"$1","o6",2,0,null,164,[]],
-qE:{
-"^":"cv;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|xc|LP|hV|uL|pv|pz|Vfx|xI|Tg|Dsd|Jc|CN|tuj|Be|Vct|i6|Nr|lw|D13|Ir|WZq|rm|Bc|Lt|UL|pva|jM|rs|qW|cda|mk|waa|pL|V4|jY|pR|V9|hx|V10|E7|oO|V11|Stq|V12|IWF|V13|Yj|V14|Oz|V15|YA|V16|qkb|V17|vj|LU|V18|KL|V19|F1|V20|aQ|V21|Qa|V22|Ww|V23|tz|V24|Mv|V25|oM|V26|iL|V27|F1i|XP|V28|NQ|V29|SM|x4|knI|V30|fI|V31|zMr|V32|nk|V33|ob|LPc|Uj|V34|xT|V35|uwf|I5|V36|en"},
+return z.Nf(a,!0)},
+Bo:{
+"^":"h4;",
+"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ot|ir|LP|hV|uL|Vf|G6|pv|xI|eW|Vfx|aC|VY|Dsd|Be|tuj|i6|Nr|JI|Vct|ZP|D13|nJ|LPc|Eg|i7|WZq|Gk|T53|DK|pva|BS|cda|Vb|waa|Ly|pR|V3|hx|V5|L4|V8|mO|DE|V10|U1|V11|kK|oa|V12|St|V13|IW|V14|Qh|V15|Oz|V16|Mc|V17|qk|V18|vj|LU|V19|CX|V20|md|V21|Bm|V22|Ya|V23|Ww|V24|G1|V25|fl|V26|UK|V27|wM|V28|F1|V29|qZ|V30|Uy|ZzR|kn|V31|fI|V32|zM|V33|Rk|V34|Ti|Xfs|CY|V35|nm|V36|uw|I5|V37|el"},
 zw:{
 "^":"Gv;",
-$isList:true,
-$asWO:function(){return[W.nX]},
+$isWO:true,
+$asWO:function(){return[W.M5]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.nX]},
+$iscX:true,
+$ascX:function(){return[W.M5]},
 "%":"EntryArray"},
 Ps:{
-"^":"qE;N:target=,t5:type%,cC:hash%,mH:href=",
+"^":"Bo;N:target=,t5:type%,mH:href=",
 bu:function(a){return a.toString()},
 "%":"HTMLAnchorElement"},
-Sb:{
-"^":"qE;N:target=,cC:hash%,mH:href=",
+fY:{
+"^":"Bo;N:target=,mH:href=",
 bu:function(a){return a.toString()},
 "%":"HTMLAreaElement"},
-Xk:{
-"^":"qE;mH:href=,N:target=",
+rZg:{
+"^":"Bo;mH:href=,N:target=",
 "%":"HTMLBaseElement"},
 b9:{
 "^":"ea;O3:url=",
 "%":"BeforeLoadEvent"},
-Az:{
+O4:{
 "^":"Gv;t5:type=",
-$isAz:true,
+$isO4:true,
 "%":";Blob"},
 Fy:{
-"^":"qE;",
-$isD0:true,
+"^":"Bo;",
+$isPZ:true,
 "%":"HTMLBodyElement"},
-QW:{
-"^":"qE;MB:form=,oc:name%,t5:type%,P:value%",
+IFv:{
+"^":"Bo;MB:form=,oc:name%,t5:type%,P:value%",
 "%":"HTMLButtonElement"},
 Ny:{
-"^":"qE;fg:height%,R:width%",
+"^":"Bo;fg:height},R:width}",
 gVE:function(a){return a.getContext("2d")},
 "%":"HTMLCanvasElement"},
 Oi:{
 "^":"Gv;",
 "%":";CanvasRenderingContext"},
-mj:{
+FT:{
 "^":"Oi;",
 A8:function(a,b,c,d,e,f,g,h){var z
 if(g!=null)z=!0
@@ -7836,84 +7250,75 @@
 if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
 return}throw H.b(P.u("Incorrect number or type of arguments"))},
 "%":"CanvasRenderingContext2D"},
-Zv:{
+nx:{
 "^":"KV;Rn:data=,B:length=",
 "%":"Comment;CharacterData"},
-Yr:{
+K3:{
 "^":"ea;tT:code=",
 "%":"CloseEvent"},
-di:{
-"^":"Mf;Rn:data=",
+y4:{
+"^":"w6O;Rn:data=",
 "%":"CompositionEvent"},
-He:{
+eC:{
 "^":"ea;",
 gey:function(a){var z=a._dartDetail
 if(z!=null)return z
 return P.o7(a.detail,!0)},
-$isHe:true,
+$iseC:true,
 "%":"CustomEvent"},
-YN:{
+Q3:{
+"^":"Bo;",
+TR:function(a,b){return a.open.$1(b)},
+"%":"HTMLDetailsElement"},
+rV:{
+"^":"Bo;",
+TR:function(a,b){return a.open.$1(b)},
+"%":"HTMLDialogElement"},
+QF:{
 "^":"KV;",
 JP:function(a){return a.createDocumentFragment()},
 Kb:function(a,b){return a.getElementById(b)},
 ek:function(a,b,c){return a.importNode(b,c)},
-gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.pi.aM(a)},
-gLm:function(a){return C.i3.aM(a)},
-gVY:function(a){return C.DK.aM(a)},
+Wk:function(a,b){return a.querySelector(b)},
+gi9:function(a){return H.VM(new W.RO(a,C.mt.Ph,!1),[null])},
+gVl:function(a){return H.VM(new W.RO(a,C.nI.Ph,!1),[null])},
+gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-Ja:function(a,b){return a.querySelector(b)},
-pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-$isYN:true,
+$isQF:true,
 "%":"Document|HTMLDocument|XMLDocument"},
 Aj:{
 "^":"KV;",
-gwd:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.e7(a)),[null])
+gks:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.wi(a)),[null])
 return a._docChildren},
-swd:function(a,b){var z,y,x
-z=P.F(b,!0,null)
-y=this.gwd(a)
-x=J.w1(y)
-x.V1(y)
-x.FV(y,z)},
 Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-Ja:function(a,b){return a.querySelector(b)},
-pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
+Wk:function(a,b){return a.querySelector(b)},
 "%":";DocumentFragment"},
-rv:{
+rz:{
 "^":"Gv;G1:message=,oc:name=",
 "%":";DOMError"},
-Nh:{
+BK:{
 "^":"Gv;G1:message=",
 goc:function(a){var z=a.name
 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()},
-$isNh:true,
+$isBK:true,
 "%":"DOMException"},
-cv:{
-"^":"KV;xr:className%,jO:id=",
-gQg:function(a){return new W.i7(a)},
-gwd:function(a){return new W.VG(a,a.children)},
-swd:function(a,b){var z,y
-z=P.F(b,!0,null)
-y=this.gwd(a)
-y.V1(0)
-y.FV(0,z)},
+h4:{
+"^":"KV;xr:className%,jO:id=,ns:tagName=",
+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)},
-Ja:function(a,b){return a.querySelector(b)},
-pr:function(a,b){return W.vD(a.querySelectorAll(b),null)},
 gDD:function(a){return new W.I4(a)},
-sDD:function(a,b){var z=this.gDD(a)
-z.V1(0)
-z.FV(z,b)},
-gwl:function(a){return P.T7(a.clientLeft,a.clientTop,a.clientWidth,a.clientHeight,null)},
 gD7:function(a){return P.T7(a.offsetLeft,a.offsetTop,a.offsetWidth,a.offsetHeight,null)},
-i4:function(a){},
-xo:function(a){},
-aC:function(a,b,c,d){},
+Es:function(a){this.q0(a)},
+dQ:function(a){this.Nz(a)},
+q0:function(a){},
+Nz: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},
 WO:function(a,b){if(!!a.matches)return a.matches(b)
 else if(!!a.webkitMatchesSelector)return a.webkitMatchesSelector(b)
@@ -7921,58 +7326,59 @@
 else if(!!a.msMatchesSelector)return a.msMatchesSelector(b)
 else if(!!a.oMatchesSelector)return a.oMatchesSelector(b)
 else throw H.b(P.f("Not supported on this platform"))},
-bA:function(a,b){var z=a
-do{if(J.Kf(z,b))return!0
+jn:function(a,b){var z=a
+do{if(J.RF(z,b))return!0
 z=z.parentElement}while(z!=null)
 return!1},
 er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
 gIW:function(a){return a.shadowRoot||a.webkitShadowRoot},
 gI:function(a){return new W.DM(a,a)},
-PN:function(a,b){return a.getAttribute(b)},
+GE:function(a,b){return a.getAttribute(b)},
 Zi:function(a){return a.getBoundingClientRect()},
-gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.pi.f0(a)},
-gLm:function(a){return C.i3.f0(a)},
-gVY:function(a){return C.DK.f0(a)},
-gE8:function(a){return C.W2.f0(a)},
+Wk:function(a,b){return a.querySelector(b)},
+gi9:function(a){return H.VM(new W.Cq(a,C.mt.Ph,!1),[null])},
+gVl:function(a){return H.VM(new W.Cq(a,C.nI.Ph,!1),[null])},
+gLm:function(a){return H.VM(new W.Cq(a,C.i3.Ph,!1),[null])},
+gVY:function(a){return H.VM(new W.Cq(a,C.uh.Ph,!1),[null])},
+gf0:function(a){return H.VM(new W.Cq(a,C.Kq.Ph,!1),[null])},
 ZL:function(a){},
-$iscv:true,
-$isD0:true,
+$ish4:true,
+$isPZ:true,
 "%":";Element"},
-Fs:{
-"^":"qE;fg:height%,oc:name%,LA:src=,t5:type%,R:width%",
+lC:{
+"^":"Bo;fg:height},oc:name%,t5:type%,R:width}",
 "%":"HTMLEmbedElement"},
 Ty:{
 "^":"ea;kc:error=,G1:message=",
 "%":"ErrorEvent"},
 ea:{
-"^":"Gv;Bu:_selector},Xt:bubbles=,t5:type=",
+"^":"Gv;It:_selector},Xt:bubbles=,Ii:path=,t5:type=",
 gN:function(a){return W.qc(a.target)},
-aA:function(a){return a.preventDefault()},
+e6:function(a){return a.preventDefault()},
 $isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|WebGLContextEvent|WebKitAnimationEvent;Event"},
-D0:{
+"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SecurityPolicyViolationEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"},
+PZ:{
 "^":"Gv;",
-gI:function(a){return new W.Jn(a)},
+gI:function(a){return new W.kd(a)},
 On:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
-Y9:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
-$isD0:true,
+Si:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
+$isPZ:true,
 "%":";EventTarget"},
-as:{
-"^":"qE;MB:form=,oc:name%,t5:type=",
+EN:{
+"^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLFieldSetElement"},
 hH:{
-"^":"Az;oc:name=",
+"^":"O4;oc:name=",
 $ishH:true,
 "%":"File"},
 QU:{
-"^":"rv;tT:code=",
+"^":"rz;tT:code=",
 "%":"FileError"},
-Tq:{
-"^":"qE;B:length=,bP:method=,oc:name%,N:target=",
+YuD:{
+"^":"Bo;B:length=,Sf:method=,oc:name%,N:target=",
 "%":"HTMLFormElement"},
-xn:{
-"^":"Gb;",
+xnd:{
+"^":"ecX;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
@@ -7984,73 +7390,73 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
+$iscX:true,
+$ascX:function(){return[W.KV]},
 $isXj:true,
 "%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
-zU:{
-"^":"wa;iC:responseText=,ys:status=",
-gvJ:function(a){return W.Pd(a.response)},
-R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
+fJ:{
+"^":"rk;il:responseText=,pf:status=",
+gbA:function(a){return W.Z9(a.response)},
+Yh:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
 eo:function(a,b,c,d){return a.open(b,c,d)},
-zY:function(a,b){return a.send(b)},
-$iszU:true,
+wR:function(a,b){return a.send(b)},
+$isfJ:true,
 "%":"XMLHttpRequest"},
-wa:{
-"^":"D0;",
+rk:{
+"^":"PZ;",
 "%":";XMLHttpRequestEventTarget"},
-tX:{
-"^":"qE;fg:height%,oc:name%,LA:src=,R:width%",
+tb:{
+"^":"Bo;fg:height},oc:name%,R:width}",
 "%":"HTMLIFrameElement"},
 Sg:{
 "^":"Gv;Rn:data=,fg:height=,R:width=",
 $isSg:true,
 "%":"ImageData"},
 pA:{
-"^":"qE;fg:height%,LA:src=,R:width%",
-oo:function(a,b){return a.complete.$1(b)},
+"^":"Bo;fg:height},R:width}",
+j3:function(a,b){return a.complete.$1(b)},
 "%":"HTMLImageElement"},
 Mi:{
-"^":"qE;Tq:checked%,MB:form=,fg:height%,oc:name%,LA:src=,t5:type%,P:value%,R:width%",
+"^":"Bo;d4:checked%,MB:form=,fg:height},jx:list=,oc:name%,t5:type%,P:value%,R:width}",
 RR:function(a,b){return a.accept.$1(b)},
 $isMi:true,
-$iscv:true,
-$isD0:true,
+$ish4:true,
+$isPZ:true,
 $isKV:true,
 "%":"HTMLInputElement"},
-In:{
-"^":"qE;MB:form=,oc:name%,t5:type=",
+ttH:{
+"^":"Bo;MB:form=,oc:name%,t5:type=",
 "%":"HTMLKeygenElement"},
-wP:{
-"^":"qE;P:value%",
+hn:{
+"^":"Bo;P:value%",
 "%":"HTMLLIElement"},
 eP:{
-"^":"qE;MB:form=",
+"^":"Bo;MB:form=",
 "%":"HTMLLabelElement"},
-AL:{
-"^":"qE;MB:form=",
+mF:{
+"^":"Bo;MB:form=",
 "%":"HTMLLegendElement"},
-Qj:{
-"^":"qE;mH:href=,t5:type%",
-$isQj:true,
+Ogt:{
+"^":"Bo;mH:href=,t5:type%",
 "%":"HTMLLinkElement"},
-ZD:{
-"^":"Gv;cC:hash%,mH:href=",
+cS:{
+"^":"Gv;mH:href=",
 VD:function(a){return a.reload()},
 bu:function(a){return a.toString()},
 "%":"Location"},
-YI:{
-"^":"qE;oc:name%",
+p8:{
+"^":"Bo;oc:name%",
 "%":"HTMLMapElement"},
-El:{
-"^":"qE;kc:error=,LA:src=",
+eL:{
+"^":"Bo;kc:error=",
 xW:function(a){return a.load()},
+yy:[function(a){return a.pause()},"$0","gX0",0,0,13],
 "%":"HTMLAudioElement;HTMLMediaElement",
-static:{"^":"pZ<"}},
-zm:{
+static:{"^":"TH<"}},
+mCi:{
 "^":"Gv;tT:code=",
 "%":"MediaError"},
 Y7:{
@@ -8063,88 +7469,62 @@
 "^":"ea;G1:message=",
 "%":"MediaKeyMessageEvent"},
 Rv:{
-"^":"D0;jO:id=,ph:label=",
+"^":"PZ;jO:id=,ph:label=",
 "%":"MediaStream"},
-cx:{
+AW:{
 "^":"ea;",
 gRn:function(a){return P.o7(a.data,!0)},
-$iscx:true,
+$isAW:true,
 "%":"MessageEvent"},
 EeC:{
-"^":"qE;rz:content=,oc:name%",
+"^":"Bo;jb:content=,oc:name%",
 "%":"HTMLMetaElement"},
-E9:{
-"^":"qE;P:value%",
+tJ:{
+"^":"Bo;P:value%",
 "%":"HTMLMeterElement"},
 Hw:{
 "^":"ea;Rn:data=",
 "%":"MIDIMessageEvent"},
-bn:{
-"^":"tH;",
-fZ:function(a,b,c){return a.send(b,c)},
-zY:function(a,b){return a.send(b)},
-"%":"MIDIOutput"},
-tH:{
-"^":"D0;jO:id=,oc:name=,t5:type=,Ye:version=",
-"%":"MIDIInput;MIDIPort"},
-Wp:{
-"^":"Mf;",
-nH:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.qr(p))
+Oq:{
+"^":"w6O;",
+nH:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.m7(p))
 return},
-gwl:function(a){return H.VM(new P.hL(a.clientX,a.clientY),[null])},
 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)).$iscv)throw H.b(P.f("offsetX is only supported on elements"))
+if(!!a.offsetX)return H.VM(new P.EX(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.Yq(J.AK(z)))
-return H.VM(new P.hL(J.XH(y.x),J.XH(y.y)),[null])}},
-$isWp:true,
+y=H.VM(new P.EX(a.clientX,a.clientY),[null]).W(0,J.Yq(J.HO(z)))
+return H.VM(new P.EX(J.Kn(y.x),J.Kn(y.y)),[null])}},
+$isOq:true,
 "%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-H9:{
-"^":"Gv;",
-jh:function(a,b,c,d,e,f,g,h,i){var z,y
-z={}
-y=new W.Yg(z)
-y.$2("childList",h)
-y.$2("attributes",e)
-y.$2("characterData",f)
-y.$2("subtree",i)
-y.$2("attributeOldValue",d)
-y.$2("characterDataOldValue",g)
-a.observe(b,z)},
-yN:function(a,b,c,d){return this.jh(a,b,null,null,null,null,null,c,d)},
-"%":"MutationObserver|WebKitMutationObserver"},
-o4:{
-"^":"Gv;jL:oldValue=,N:target=,t5:type=",
-"%":"MutationRecord"},
 ih:{
 "^":"Gv;G1:message=,oc:name=",
 "%":"NavigatorUserMediaError"},
 KV:{
-"^":"D0;p8:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,KV:parentNode=,a4:textContent%",
-gyT:function(a){return new W.e7(a)},
-wg:function(a){var z=a.parentNode
+"^":"PZ;PZ:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,By:parentNode=,a4:textContent%",
+gUN:function(a){return new W.wi(a)},
+zB: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},
 aD:function(a,b,c){var z,y,x
 z=J.x(b)
-if(!!z.$ise7){z=b.NL
+if(!!z.$iswi){z=b.NL
 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
 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},
-jx:function(a,b){return a.appendChild(b)},
+mx:function(a,b){return a.appendChild(b)},
 tg:function(a,b){return a.contains(b)},
-mK:function(a,b,c){return a.insertBefore(b,c)},
+FO:function(a,b,c){return a.insertBefore(b,c)},
 dR:function(a,b,c){return a.replaceChild(b,c)},
 $isKV:true,
 "%":"DocumentType|Notation;Node"},
 yk:{
-"^":"ma;",
+"^":"w1p;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
 if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
@@ -8156,55 +7536,54 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
+$iscX:true,
+$ascX:function(){return[W.KV]},
 $isXj:true,
 "%":"NodeList|RadioNodeList"},
-KY:{
-"^":"qE;t5:type%",
+NT:{
+"^":"Bo;t5:type%",
 "%":"HTMLOListElement"},
-z3:{
-"^":"qE;Rn:data=,MB:form=,fg:height%,oc:name%,t5:type%,R:width%",
+Kc:{
+"^":"Bo;Rn:data=,MB:form=,fg:height},oc:name%,t5:type%,R:width}",
 "%":"HTMLObjectElement"},
 l9:{
-"^":"qE;ph:label%",
+"^":"Bo;ph:label%",
 "%":"HTMLOptGroupElement"},
-Ql:{
-"^":"qE;MB:form=,vH:index=,ph:label%,P:value%",
-$isQl:true,
+UC:{
+"^":"Bo;MB:form=,vH:index=,ph:label%,P:value%",
+$isUC:true,
 "%":"HTMLOptionElement"},
 Xp:{
-"^":"qE;MB:form=,oc:name%,t5:type=,P:value%",
+"^":"Bo;MB:form=,oc:name%,t5:type=,P:value%",
 "%":"HTMLOutputElement"},
 me:{
-"^":"qE;oc:name%,P:value%",
+"^":"Bo;oc:name%,P:value%",
 "%":"HTMLParamElement"},
-jg:{
+j6:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"PositionError"},
 nC:{
-"^":"Zv;N:target=",
+"^":"nx;N:target=",
 "%":"ProcessingInstruction"},
 KR:{
-"^":"qE;P:value%",
+"^":"Bo;P:value%",
 "%":"HTMLProgressElement"},
 ew:{
-"^":"ea;ox:loaded=",
+"^":"ea;lQ:loaded=",
 $isew:true,
 "%":"XMLHttpRequestProgressEvent;ProgressEvent"},
-LY:{
+bXi:{
 "^":"ew;O3:url=",
 "%":"ResourceProgressEvent"},
-j2:{
-"^":"qE;LA:src=,t5:type%",
-$isj2:true,
+Tw:{
+"^":"Bo;t5:type%",
 "%":"HTMLScriptElement"},
-lp:{
-"^":"qE;MB:form=,B:length%,oc:name%,ig:selectedIndex%,t5:type=,P:value%",
-$islp:true,
+bs:{
+"^":"Bo;MB:form=,B:length%,oc:name%,Mj:selectedIndex%,t5:type=,P:value%",
+$isbs:true,
 "%":"HTMLSelectElement"},
 I0:{
 "^":"Aj;",
@@ -8212,102 +7591,90 @@
 $isI0:true,
 "%":"ShadowRoot"},
 QR:{
-"^":"qE;LA:src=,t5:type%",
+"^":"Bo;t5:type%",
 "%":"HTMLSourceElement"},
-uaa:{
-"^":"ea;PK:results=",
+GA:{
+"^":"ea;Cf:results=",
 "%":"SpeechInputEvent"},
 yg:{
 "^":"Gv;",
 "%":"SpeechInputResult"},
-Hd:{
+Cz:{
 "^":"ea;kc:error=,G1:message=",
 "%":"SpeechRecognitionError"},
-Ul:{
-"^":"ea;PK:results=",
+vt:{
+"^":"ea;Cf:results=",
 "%":"SpeechRecognitionEvent"},
-uj:{
-"^":"Gv;B:length=",
+my:{
+"^":"Gv;V5:isFinal=,B:length=",
 "%":"SpeechRecognitionResult"},
-G5:{
+KKC:{
 "^":"ea;oc:name=",
 "%":"SpeechSynthesisEvent"},
 kI:{
-"^":"ea;G3:key=,zZ:newValue=,jL:oldValue=,O3:url=",
+"^":"ea;G3:key=,O3:url=",
 "%":"StorageEvent"},
-Lx:{
-"^":"qE;t5:type%",
+fqq:{
+"^":"Bo;t5:type%",
 "%":"HTMLStyleElement"},
-qk:{
-"^":"qE;",
-$isqk:true,
+v6:{
+"^":"Bo;",
+$isv6:true,
 "%":"HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"},
-Tb:{
-"^":"qE;",
-gzU:function(a){return H.VM(new W.uB(a.rows),[W.qp])},
+R1:{
+"^":"Bo;",
+gWT:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
 "%":"HTMLTableElement"},
-qp:{
-"^":"qE;RH:rowIndex=",
-$isqp:true,
+tV:{
+"^":"Bo;RH:rowIndex=",
+$istV:true,
 "%":"HTMLTableRowElement"},
-BT:{
-"^":"qE;",
-gzU:function(a){return H.VM(new W.uB(a.rows),[W.qp])},
+Ix:{
+"^":"Bo;",
+gWT:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
 "%":"HTMLTableSectionElement"},
-yY:{
-"^":"qE;rz:content=",
-$isyY:true,
+OH:{
+"^":"Bo;jb:content=",
+$isOH:true,
 "%":"HTMLTemplateElement"},
-kJ:{
-"^":"Zv;",
-$iskJ:true,
+Un:{
+"^":"nx;",
+$isUn:true,
 "%":"CDATASection|Text"},
 AE:{
-"^":"qE;MB:form=,oc:name%,zU:rows%,t5:type=,P:value%",
+"^":"Bo;MB:form=,oc:name%,WT:rows=,t5:type=,P:value%",
 $isAE:true,
 "%":"HTMLTextAreaElement"},
 R0:{
-"^":"Mf;Rn:data=",
+"^":"w6O;Rn:data=",
 "%":"TextEvent"},
-RH:{
-"^":"qE;fY:kind%,ph:label%,LA:src=",
+li:{
+"^":"Bo;fY:kind%,ph:label%",
 "%":"HTMLTrackElement"},
-OJ:{
-"^":"ea;",
-$isOJ:true,
-"%":"TransitionEvent|WebKitTransitionEvent"},
-Mf:{
+w6O:{
 "^":"ea;",
 "%":"FocusEvent|KeyboardEvent|SVGZoomEvent|TouchEvent;UIEvent"},
-Rg:{
-"^":"El;fg:height%,R:width%",
+SW:{
+"^":"eL;fg:height},R:width}",
 "%":"HTMLVideoElement"},
 u9:{
-"^":"D0;oc:name%,ys:status%",
-oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
-hr: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)},
+"^":"PZ;oc:name%,pf:status%",
 geT:function(a){return W.Pv(a.parent)},
-cO:function(a){return a.close()},
-xc:function(a,b,c,d){a.postMessage(P.bL(b),c)
+S6:function(a){return a.close()},
+kr:function(a,b,c,d){a.postMessage(P.bL(b),c)
 return},
-X6:function(a,b,c){return this.xc(a,b,c,null)},
+D9:function(a,b,c){return this.kr(a,b,c,null)},
 bu:function(a){return a.toString()},
-gi9:function(a){return C.mt.aM(a)},
-gVl:function(a){return C.pi.aM(a)},
-gLm:function(a){return C.i3.aM(a)},
-gVY:function(a){return C.DK.aM(a)},
+gi9:function(a){return H.VM(new W.RO(a,C.mt.Ph,!1),[null])},
+gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
 $isu9:true,
-$isD0:true,
+$isPZ:true,
 "%":"DOMWindow|Window"},
-Pk:{
+Bn:{
 "^":"KV;oc:name=,P:value%",
 "%":"Attr"},
-FR:{
-"^":"Gv;QG:bottom=,fg:height=,Bb:left=,T8:right=,G6:top=,R:width=",
+o5:{
+"^":"Gv;OR: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)},
 n:function(a,b){var z,y,x
 if(b==null)return!1
@@ -8328,59 +7695,19 @@
 y=J.v1(a.top)
 x=J.v1(a.width)
 w=J.v1(a.height)
-w=W.C0(W.C0(W.C0(W.C0(0,z),y),x),w)
+w=W.VC(W.VC(W.VC(W.VC(0,z),y),x),w)
 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])},
+gSR:function(a){return H.VM(new P.EX(a.left,a.top),[null])},
 $istn:true,
 $astn:function(){return[null]},
 "%":"ClientRect|DOMRect"},
-SC:{
-"^":"qE;",
-$isD0:true,
+yX:{
+"^":"Bo;",
+$isPZ:true,
 "%":"HTMLFrameSetElement"},
-Cy:{
-"^":"ecX;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isList:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
-$isXj:true,
-"%":"MozNamedAttrMap|NamedNodeMap"},
-c5:{
-"^":"w1p;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
-sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isList:true,
-$asWO:function(){return[W.yg]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.yg]},
-$isXj:true,
-"%":"SpeechInputResultList"},
-LO:{
+QV:{
 "^":"kEI;",
 gB:function(a){return a.length},
 t:function(a,b){var z=a.length
@@ -8393,22 +7720,62 @@
 throw H.b(P.w("No elements"))},
 Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
 return a[b]},
-$isList:true,
-$asWO:function(){return[W.uj]},
+$isWO:true,
+$asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.uj]},
+$iscX:true,
+$ascX:function(){return[W.KV]},
+$isXj:true,
+"%":"MozNamedAttrMap|NamedNodeMap"},
+mNY:{
+"^":"x5e;",
+gB:function(a){return a.length},
+t:function(a,b){var z=a.length
+if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+return a[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
+sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+grZ:function(a){var z=a.length
+if(z>0)return a[z-1]
+throw H.b(P.w("No elements"))},
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
+$isWO:true,
+$asWO:function(){return[W.yg]},
+$isyN:true,
+$iscX:true,
+$ascX:function(){return[W.yg]},
+$isXj:true,
+"%":"SpeechInputResultList"},
+LO:{
+"^":"HRa;",
+gB:function(a){return a.length},
+t:function(a,b){var z=a.length
+if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
+return a[b]},
+u:function(a,b,c){throw H.b(P.f("Cannot assign element of immutable List."))},
+sB:function(a,b){throw H.b(P.f("Cannot resize immutable List."))},
+grZ:function(a){var z=a.length
+if(z>0)return a[z-1]
+throw H.b(P.w("No elements"))},
+Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
+return a[b]},
+$isWO:true,
+$asWO:function(){return[W.my]},
+$isyN:true,
+$iscX:true,
+$ascX:function(){return[W.my]},
 $isXj:true,
 "%":"SpeechRecognitionResultList"},
 VG:{
-"^":"ar;MW,vG",
-tg:function(a,b){return J.kE(this.vG,b)},
+"^":"rm;MW,VO",
+tg:function(a,b){return J.x5(this.VO,b)},
 gl0:function(a){return this.MW.firstElementChild==null},
-gB:function(a){return this.vG.length},
-t:function(a,b){var z=this.vG
+gB:function(a){return this.VO.length},
+t:function(a,b){var z=this.VO
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-u:function(a,b,c){var z=this.vG
+u:function(a,b,c){var z=this.VO
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 this.MW.replaceChild(c,z[b])},
 sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
@@ -8417,15 +7784,14 @@
 gA:function(a){var z=this.br(this)
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
 FV:function(a,b){var z,y
-for(z=J.GP(!!J.x(b).$ise7?P.F(b,!0,null):b),y=this.MW;z.G();)y.appendChild(z.gl())},
-GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
-np:function(a){return this.GT(a,null)},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},
+XP:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
+Jd:function(a){return this.XP(a,null)},
 YW:function(a,b,c,d,e){throw H.b(P.SY(null))},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-Rz:function(a,b){return!1},
-xe:function(a,b,c){var z,y,x
-if(b>this.vG.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.vG
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+aP:function(a,b,c){var z,y,x
+if(b>this.VO.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.VO
 y=z.length
 x=this.MW
 if(b===y)x.appendChild(c)
@@ -8436,83 +7802,74 @@
 grZ:function(a){var z=this.MW.lastElementChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
-$asar:function(){return[W.cv]},
-$asWO:function(){return[W.cv]},
-$asQV:function(){return[W.cv]}},
-wz:{
-"^":"ar;Sn,Sc",
+$asrm:function(){return[W.h4]},
+$asWO:function(){return[W.h4]},
+$ascX:function(){return[W.h4]}},
+TS:{
+"^":"rm;Sn,Sc",
 gB:function(a){return this.Sn.length},
 t:function(a,b){var z=this.Sn
 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"))},
-np:function(a){return this.GT(a,null)},
+XP:function(a,b){throw H.b(P.f("Cannot sort list"))},
+Jd:function(a){return this.XP(a,null)},
 grZ:function(a){return C.t5.grZ(this.Sn)},
 gDD:function(a){return W.or(this.Sc)},
-sDD:function(a,b){H.bQ(this.Sc,new W.BH(b))},
-gi9:function(a){return C.mt.Uh(this)},
-gVl:function(a){return C.pi.Uh(this)},
-gLm:function(a){return C.i3.Uh(this)},
-gVY:function(a){return C.DK.Uh(this)},
-nJ:function(a,b){var z=C.t5.ev(this.Sn,new W.B1())
+gi9:function(a){return H.VM(new W.Uc(this,!1,C.mt.Ph),[null])},
+gLm:function(a){return H.VM(new W.Uc(this,!1,C.i3.Ph),[null])},
+S8:function(a,b){var z=C.t5.ev(this.Sn,new W.HU())
 this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
-$isList:true,
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null,
-static:{vD:function(a,b){var z=H.VM(new W.wz(a,null),[b])
-z.nJ(a,b)
+$iscX:true,
+$ascX:null,
+static:{vD:function(a,b){var z=H.VM(new W.TS(a,null),[b])
+z.S8(a,b)
 return z}}},
-B1:{
-"^":"Tp:116;",
-$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,21,[],"call"],
+HU:{
+"^":"Xs:30;",
+$1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
-BH:{
-"^":"Tp:116;a",
-$1:[function(a){var z=this.a
-J.H2(a,z)
-return z},"$1",null,2,0,null,21,[],"call"],
-$isEH:true},
-nX:{
+M5:{
 "^":"Gv;"},
-Jn:{
+kd:{
 "^":"a;WK<",
 t:function(a,b){return H.VM(new W.RO(this.gWK(),b,!1),[null])}},
 DM:{
-"^":"Jn;WK:YO<,WK",
+"^":"kd;WK:YO<,WK",
 t:function(a,b){var z,y
-z=$.Vp()
+z=$.Z2()
 y=J.rY(b)
 if(z.gvc().Fb.x4(y.hc(b)))if(P.F7()===!0)return H.VM(new W.Cq(this.YO,z.t(0,y.hc(b)),!1),[null])
 return H.VM(new W.Cq(this.YO,b,!1),[null])},
-static:{"^":"fD"}},
+static:{"^":"xW"}},
 RAp:{
 "^":"Gv+lD;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-Gb:{
+$iscX:true,
+$ascX:function(){return[W.KV]}},
+ecX:{
 "^":"RAp+Gm;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
+$iscX:true,
+$ascX:function(){return[W.KV]}},
 Kx:{
-"^":"Tp:116;",
-$1:[function(a){return J.EC(a)},"$1",null,2,0,null,391,[],"call"],
+"^":"Xs:30;",
+$1:[function(a){return J.lN(a)},"$1",null,2,0,null,91,"call"],
 $isEH:true},
 Cs:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.setRequestHeader(a,b)},"$2",null,4,0,null,392,[],30,[],"call"],
+"^":"Xs:50;a",
+$2:function(a,b){this.a.setRequestHeader(a,b)},
 $isEH:true},
-iO:{
-"^":"Tp:116;b,c",
+bU:{
+"^":"Xs:30;b,c",
 $1:[function(a){var z,y,x
 z=this.c
 y=z.status
@@ -8521,25 +7878,17 @@
 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,21,[],"call"],
+y.OH(z)}else x.rC(a)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
-Yg:{
-"^":"Tp:300;a",
-$2:[function(a,b){if(b!=null)this.a[a]=b},"$2",null,4,0,null,49,[],30,[],"call"],
-$isEH:true},
-e7:{
-"^":"ar;NL",
+wi:{
+"^":"rm;NL",
 grZ:function(a){var z=this.NL.lastChild
 if(z==null)throw H.b(P.w("No elements"))
 return z},
 h:function(a,b){this.NL.appendChild(b)},
-FV:function(a,b){var z,y,x,w
-z=J.x(b)
-if(!!z.$ise7){z=b.NL
-y=this.NL
-if(z!==y)for(x=z.childNodes.length,w=0;w<x;++w)y.appendChild(z.firstChild)
-return}for(z=z.gA(b),y=this.NL;z.G();)y.appendChild(z.gl())},
-xe:function(a,b,c){var z,y,x
+FV:function(a,b){var z,y
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},
+aP: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
 y=z.childNodes
@@ -8547,13 +7896,12 @@
 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
+UG:function(a,b,c){var z,y
 z=this.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
+J.Qk(z,c,y[b])},
 Mh:function(a,b,c){throw H.b(P.f("Cannot setAll on Node list"))},
-Rz:function(a,b){return!1},
 V1:function(a){J.r4(this.NL)},
 u:function(a,b,c){var z,y
 z=this.NL
@@ -8561,80 +7909,78 @@
 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)},
-GT:function(a,b){throw H.b(P.f("Cannot sort Node list"))},
-np:function(a){return this.GT(a,null)},
+XP:function(a,b){throw H.b(P.f("Cannot sort Node list"))},
+Jd:function(a){return this.XP(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)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 gB:function(a){return this.NL.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
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-$ise7:true,
-$asar:function(){return[W.KV]},
+$iswi:true,
+$asrm:function(){return[W.KV]},
 $asWO:function(){return[W.KV]},
-$asQV:function(){return[W.KV]}},
+$ascX:function(){return[W.KV]}},
 nNL:{
 "^":"Gv+lD;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-ma:{
+$iscX:true,
+$ascX:function(){return[W.KV]}},
+w1p:{
 "^":"nNL+Gm;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
+$iscX:true,
+$ascX:function(){return[W.KV]}},
 yoo:{
 "^":"Gv+lD;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-ecX:{
+$iscX:true,
+$ascX:function(){return[W.KV]}},
+kEI:{
 "^":"yoo+Gm;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.KV]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
+$iscX:true,
+$ascX:function(){return[W.KV]}},
 zLC:{
 "^":"Gv+lD;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.yg]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.yg]}},
-w1p:{
+$iscX:true,
+$ascX:function(){return[W.yg]}},
+x5e:{
 "^":"zLC+Gm;",
-$isList:true,
+$isWO:true,
 $asWO:function(){return[W.yg]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.yg]}},
+$iscX:true,
+$ascX:function(){return[W.yg]}},
 dxW:{
 "^":"Gv+lD;",
-$isList:true,
-$asWO:function(){return[W.uj]},
+$isWO:true,
+$asWO:function(){return[W.my]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.uj]}},
-kEI:{
+$iscX:true,
+$ascX:function(){return[W.my]}},
+HRa:{
 "^":"dxW+Gm;",
-$isList:true,
-$asWO:function(){return[W.uj]},
+$isWO:true,
+$asWO:function(){return[W.my]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[W.uj]}},
-tJ:{
+$iscX:true,
+$ascX:function(){return[W.my]}},
+a7B:{
 "^":"a;",
 FV:function(a,b){J.kH(b,new W.Zc(this))},
-di:function(a){var z
-for(z=this.gUQ(this),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G(););return!1},
 V1:function(a){var z
 for(z=this.gvc(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},
 aN:function(a,b){var z,y
@@ -8642,26 +7988,26 @@
 b.$2(y,this.t(0,y))}},
 gvc:function(){var z,y,x,w
 z=this.MW.attributes
-y=H.VM([],[J.O])
+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},
+y.push(J.tE(z[w]))}}return y},
 gUQ:function(a){var z,y,x,w
 z=this.MW.attributes
-y=H.VM([],[J.O])
+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.Vm(z[w]))}}return y},
 gl0:function(a){return this.gB(this)===0},
 gor:function(a){return this.gB(this)!==0},
 $isZ0:true,
-$asZ0:function(){return[J.O,J.O]}},
+$asZ0:function(){return[P.qU,P.qU]}},
 Zc:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,376,[],122,[],"call"],
+"^":"Xs:50;a",
+$2:function(a,b){this.a.u(0,a,b)},
 $isEH:true},
-i7:{
-"^":"tJ;MW",
+E9:{
+"^":"a7B;MW",
 x4:function(a){return this.MW.hasAttribute(a)},
 t:function(a,b){return this.MW.getAttribute(b)},
 u:function(a,b,c){this.MW.setAttribute(b,c)},
@@ -8672,126 +8018,106 @@
 return y},
 gB:function(a){return this.gvc().length},
 FJ:function(a){return a.namespaceURI==null}},
-nF:{
-"^":"As;QX,Kd",
-lF:function(){var z=P.Ls(null,null,null,J.O)
+iW:{
+"^":"As3;QX,Kd",
+lF:function(){var z=P.Ls(null,null,null,P.qU)
 this.Kd.aN(0,new W.Si(z))
 return z},
 p5:function(a){var z,y
 z=C.Nm.zV(P.F(a,!0,null)," ")
 for(y=this.QX,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},
 OS:function(a){this.Kd.aN(0,new W.vf(a))},
-O4:function(a,b){return this.xz(new W.Iw(a,b))},
-qU:function(a){return this.O4(a,null)},
-Rz:function(a,b){return this.xz(new W.Fc(b))},
-xz: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.QX,!0,null),new W.FK()),[null,null])},
-static:{or:function(a){var z=new W.nF(a,null)
+yJ:function(a){this.Kd=H.VM(new H.lJ(P.F(this.QX,!0,null),new W.Xw()),[null,null])},
+static:{or:function(a){var z=new W.iW(a,null)
 z.yJ(a)
 return z}}},
-FK:{
-"^":"Tp:116;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,21,[],"call"],
+Xw:{
+"^":"Xs:30;",
+$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 Si:{
-"^":"Tp:116;a",
-$1:[function(a){return this.a.FV(0,a.lF())},"$1",null,2,0,null,21,[],"call"],
+"^":"Xs:30;a",
+$1:function(a){return this.a.FV(0,a.lF())},
 $isEH:true},
 vf:{
-"^":"Tp:116;a",
-$1:[function(a){return a.OS(this.a)},"$1",null,2,0,null,21,[],"call"],
-$isEH:true},
-Iw:{
-"^":"Tp:116;a,b",
-$1:[function(a){return a.O4(this.a,this.b)},"$1",null,2,0,null,21,[],"call"],
-$isEH:true},
-Fc:{
-"^":"Tp:116;a",
-$1:[function(a){return J.V1(a,this.a)},"$1",null,2,0,null,21,[],"call"],
-$isEH:true},
-hD:{
-"^":"Tp:300;a",
-$2:[function(a,b){return this.a.$1(b)===!0||a===!0},"$2",null,4,0,null,393,[],142,[],"call"],
+"^":"Xs:30;a",
+$1:function(a){return a.OS(this.a)},
 $isEH:true},
 I4:{
-"^":"As;MW",
+"^":"As3;MW",
 lF:function(){var z,y,x
-z=P.Ls(null,null,null,J.O)
+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.Kp(y,0)]);y.G();){x=J.rr(y.lo)
 if(x.length!==0)z.h(0,x)}return z},
 p5:function(a){P.F(a,!0,null)
 J.Pw(this.MW,a.zV(0," "))}},
-UC:{
+pq:{
 "^":"a;Ph",
 zc:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
-aM:function(a){return this.zc(a,!1)},
-Qm:function(a,b){return H.VM(new W.Cq(a,this.Ph,b),[null])},
-f0:function(a){return this.Qm(a,!1)},
-jl:function(a,b){return H.VM(new W.pu(a,b,this.Ph),[null])},
-Uh:function(a){return this.jl(a,!1)}},
+LX:function(a){return this.zc(a,!1)}},
 RO:{
-"^":"qh;uv,Ph,Sg",
-KR:function(a,b,c,d){var z=new W.Ov(0,this.uv,this.Ph,W.aF(a),this.Sg)
+"^":"cb;bi,Ph,Sg",
+KR:function(a,b,c,d){var z=new W.fd(0,this.bi,this.Ph,W.aF(a),this.Sg)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 z.Zz()
 return z},
 zC:function(a,b,c){return this.KR(a,null,b,c)},
 yI:function(a){return this.KR(a,null,null,null)}},
 Cq:{
-"^":"RO;uv,Ph,Sg",
-WO:function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.Ea(b),z),[H.ip(z,"qh",0),null])},
-$isqh:true},
+"^":"RO;bi,Ph,Sg",
+WO:function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"cb",0)])
+return H.VM(new P.c9(new W.tS(b),z),[H.ip(z,"cb",0),null])},
+$iscb:true},
 ie:{
-"^":"Tp:116;a",
-$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,325,[],"call"],
+"^":"Xs:30;a",
+$1:function(a){return J.S2(J.l2(a),this.a)},
 $isEH:true},
-Ea:{
-"^":"Tp:116;b",
-$1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,21,[],"call"],
+tS:{
+"^":"Xs:30;b",
+$1:[function(a){J.yB(a,this.b)
+return a},"$1",null,2,0,null,1,"call"],
 $isEH:true},
-pu:{
-"^":"qh;DI,Sg,Ph",
-WO:function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"qh",0)])
-return H.VM(new P.t3(new W.b0(b),z),[H.ip(z,"qh",0),null])},
+Uc:{
+"^":"cb;KQ,Sg,Ph",
+WO:function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"cb",0)])
+return H.VM(new P.c9(new W.b0(b),z),[H.ip(z,"cb",0),null])},
 KR:function(a,b,c,d){var z,y,x,w,v
-z=H.VM(new W.qO(null,P.L5(null,null,null,[P.qh,null],[P.MO,null])),[null])
+z=H.VM(new W.qO(null,P.L5(null,null,null,[P.cb,null],[P.MO,null])),[null])
 z.KS(null)
-for(y=this.DI,y=y.gA(y),x=this.Ph,w=this.Sg;y.G();){v=new W.RO(y.lo,x,w)
+for(y=this.KQ,y=y.gA(y),x=this.Ph,w=this.Sg;y.G();){v=new W.RO(y.lo,x,w)
 v.$builtinTypeInfo=[null]
 z.h(0,v)}y=z.aV
 y.toString
 return H.VM(new P.Ik(y),[H.Kp(y,0)]).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)},
-$isqh:true},
+$iscb:true},
 i2:{
-"^":"Tp:116;a",
-$1:[function(a){return J.eI(J.l2(a),this.a)},"$1",null,2,0,null,325,[],"call"],
+"^":"Xs:30;a",
+$1:function(a){return J.S2(J.l2(a),this.a)},
 $isEH:true},
 b0:{
-"^":"Tp:116;b",
-$1:[function(a){J.bd(a,this.b)
-return a},"$1",null,2,0,null,21,[],"call"],
+"^":"Xs:30;b",
+$1:[function(a){J.yB(a,this.b)
+return a},"$1",null,2,0,null,1,"call"],
 $isEH:true},
-Ov:{
-"^":"MO;VP,uv,Ph,u7,Sg",
-ed:function(){if(this.uv==null)return
-this.Ns()
-this.uv=null
-this.u7=null
+fd:{
+"^":"MO;VP,bi,Ph,G9,Sg",
+ed:function(){if(this.bi==null)return
+this.Jc()
+this.bi=null
+this.G9=null
 return},
-TJ:function(a,b){if(this.uv==null)return;++this.VP
-this.Ns()},
-yy:function(a){return this.TJ(a,null)},
-gRW:function(){return this.VP>0},
-QE:function(a){if(this.uv==null||this.VP<=0)return;--this.VP
-this.Zz()},
-Zz:function(){var z=this.u7
-if(z!=null&&this.VP<=0)J.cZ(this.uv,this.Ph,z,this.Sg)},
-Ns:function(){var z=this.u7
-if(z!=null)J.GJ(this.uv,this.Ph,z,this.Sg)}},
+Fv:[function(a,b){if(this.bi==null)return;++this.VP
+this.Jc()
+if(b!=null)b.wM(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,82,18,83],
+gUF:function(){return this.VP>0},
+ue:[function(a){if(this.bi==null||this.VP<=0)return;--this.VP
+this.Zz()},"$0","gDQ",0,0,13],
+Zz:function(){var z=this.G9
+if(z!=null&&this.VP<=0)J.cZ(this.bi,this.Ph,z,this.Sg)},
+Jc:function(){var z=this.G9
+if(z!=null)J.pW(this.bi,this.Ph,z,this.Sg)}},
 qO:{
 "^":"a;aV,eM",
 h:function(a,b){var z,y
@@ -8801,45 +8127,38 @@
 z.u(0,b,b.zC(y.ght(y),new W.RX(this,b),this.aV.gGj()))},
 Rz:function(a,b){var z=this.eM.Rz(0,b)
 if(z!=null)z.ed()},
-cO:[function(a){var z,y
-for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.GP(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
+S6:[function(a){var z,y
+for(z=this.eM,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
 z.V1(0)
-this.aV.cO(0)},"$0","gJK",0,0,126],
+this.aV.S6(0)},"$0","gJK",0,0,13],
 KS:function(a){this.aV=P.bK(this.gJK(this),null,!0,a)}},
 RX:{
-"^":"Tp:115;a,b",
+"^":"Xs:47;a,b",
 $0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
 $isEH:true},
-bO:{
-"^":"a;xY",
-cN:function(a){return this.xY.$1(a)},
-zc:function(a,b){return H.VM(new W.RO(a,this.cN(a),b),[null])},
-aM:function(a){return this.zc(a,!1)}},
 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.vJ(a,this.gB(a),-1,null),[H.ip(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."))},
-np: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."))},
+XP:function(a,b){throw H.b(P.f("Cannot sort immutable List."))},
+Jd:function(a){return this.XP(a,null)},
+aP:function(a,b,c){throw H.b(P.f("Cannot add to 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."))},
 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)},
+vg: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."))},
-$isList:true,
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null},
+$iscX:true,
+$ascX:null},
 uB:{
-"^":"ar;xa",
-gA:function(a){return H.VM(new W.Qg(J.GP(this.xa)),[null])},
+"^":"rm;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.wT(this.xa,b)},
-Rz:function(a,b){return J.V1(this.xa,b)},
+h:function(a,b){J.bi(this.xa,b)},
 V1:function(a){J.U2(this.xa)},
 t:function(a,b){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
@@ -8847,22 +8166,22 @@
 u:function(a,b,c){var z=this.xa
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 z[b]=c},
-sB:function(a,b){J.KM(this.xa,b)},
-GT:function(a,b){J.LH(this.xa,b)},
-np:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.aK(this.xa,b,c)},
+sB:function(a,b){J.wg(this.xa,b)},
+XP:function(a,b){J.br(this.xa,b)},
+Jd:function(a){return this.XP(a,null)},
+XU:function(a,b,c){return J.q6(this.xa,b,c)},
 u8:function(a,b){return this.XU(a,b,0)},
 Pk:function(a,b,c){return J.ff(this.xa,b,c)},
 cn:function(a,b){return this.Pk(a,b,null)},
-xe:function(a,b,c){return J.BM(this.xa,b,c)},
-YW:function(a,b,c,d,e){J.L0(this.xa,b,c,d,e)},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-UZ:function(a,b,c){J.Y8(this.xa,b,c)}},
-Qg:{
-"^":"a;je",
-G:function(){return this.je.G()},
-gl:function(){return this.je.QZ}},
-W9:{
+aP:function(a,b,c){return J.Mx(this.xa,b,c)},
+YW:function(a,b,c,d,e){J.VZ(this.xa,b,c,d,e)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+UZ:function(a,b,c){J.ul(this.xa,b,c)}},
+LV:{
+"^":"a;qD",
+G:function(){return this.qD.G()},
+gl:function(){return this.qD.QZ}},
+vJ:{
 "^":"a;nj,vN,Nq,QZ",
 G:function(){var z,y
 z=this.Nq+1
@@ -8874,211 +8193,208 @@
 return!1},
 gl:function(){return this.QZ}},
 vZ:{
-"^":"Tp:116;a,b",
+"^":"Xs:30;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,48,[],"call"],
+return this.a(a)},"$1",null,2,0,null,31,"call"],
 $isEH:true},
 dW:{
 "^":"a;Ui",
 geT:function(a){return W.P1(this.Ui.parent)},
-cO:function(a){return this.Ui.close()},
-xc:function(a,b,c,d){this.Ui.postMessage(b,c)},
-X6:function(a,b,c){return this.xc(a,b,c,null)},
+S6:function(a){return this.Ui.close()},
+kr:function(a,b,c,d){this.Ui.postMessage(b,c)},
+D9:function(a,b,c){return this.kr(a,b,c,null)},
 gI:function(a){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."))},
-$isD0:true,
-static:{P1:[function(a){if(a===window)return a
-else return new W.dW(a)},"$1","lG",2,0,null,246,[]]}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
+Si: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)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
 "^":"",
 hF:{
 "^":"Gv;",
 $ishF:true,
 "%":"IDBKeyRange"}}],["dart.dom.svg","dart:svg",,P,{
 "^":"",
-Dh:{
+Y0:{
 "^":"zp;N:target=,mH:href=",
 "%":"SVGAElement"},
-R1:{
-"^":"Eo;mH:href=",
+ig:{
+"^":"Pt;mH:href=",
 "%":"SVGAltGlyphElement"},
-eG:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+qb:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEBlendElement"},
-lvr:{
-"^":"d5;t5:type=,UQ:values=,fg:height=,yG:result=,R:width=,x=,y=",
+C7:{
+"^":"d5;t5:type=,UQ:values=,yG:result=,x=,y=",
 "%":"SVGFEColorMatrixElement"},
-pf:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+R8:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEComponentTransferElement"},
-NV:{
-"^":"d5;kp:operator=,fg:height=,yG:result=,R:width=,x=,y=",
+nQ:{
+"^":"d5;xS:operator=,yG:result=,x=,y=",
 "%":"SVGFECompositeElement"},
-nm:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+EfE:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEConvolveMatrixElement"},
-HC:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+mCz:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEDiffuseLightingElement"},
-kK:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+wfu:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEDisplacementMapElement"},
-bb:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+ha:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEFloodElement"},
-Ob:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+mz:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEGaussianBlurElement"},
-TM:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=,mH:href=",
+Ob:{
+"^":"d5;yG:result=,x=,y=,mH:href=",
 "%":"SVGFEImageElement"},
-oB:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+bO:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEMergeElement"},
-EI:{
-"^":"d5;kp:operator=,fg:height=,yG:result=,R:width=,x=,y=",
+wC:{
+"^":"d5;xS:operator=,yG:result=,x=,y=",
 "%":"SVGFEMorphologyElement"},
-MI8:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+MI:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFEOffsetElement"},
-ca:{
+Ub:{
 "^":"d5;x=,y=",
 "%":"SVGFEPointLightElement"},
-zu:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+xX:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFESpecularLightingElement"},
-eW:{
+FG:{
 "^":"d5;x=,y=",
 "%":"SVGFESpotLightElement"},
-kL:{
-"^":"d5;fg:height=,yG:result=,R:width=,x=,y=",
+Rg:{
+"^":"d5;yG:result=,x=,y=",
 "%":"SVGFETileElement"},
 Fu:{
-"^":"d5;t5:type=,fg:height=,yG:result=,R:width=,x=,y=",
+"^":"d5;t5:type=,yG:result=,x=,y=",
 "%":"SVGFETurbulenceElement"},
 QN:{
-"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
+"^":"d5;x=,y=,mH:href=",
 "%":"SVGFilterElement"},
-N9:{
-"^":"zp;fg:height=,R:width=,x=,y=",
+mg:{
+"^":"zp;x=,y=",
 "%":"SVGForeignObjectElement"},
-Yz:{
+en:{
 "^":"zp;",
 "%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
 zp:{
 "^":"d5;",
 "%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
-br:{
-"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
+SL:{
+"^":"zp;x=,y=,mH:href=",
 "%":"SVGImageElement"},
-Yd:{
-"^":"d5;fg:height=,R:width=,x=,y=",
+NBZ:{
+"^":"d5;x=,y=",
 "%":"SVGMaskElement"},
 Ac:{
-"^":"d5;fg:height=,R:width=,x=,y=,mH:href=",
+"^":"d5;x=,y=,mH:href=",
 "%":"SVGPatternElement"},
-MU:{
-"^":"Yz;fg:height=,R:width=,x=,y=",
+NJ:{
+"^":"en;x=,y=",
 "%":"SVGRectElement"},
 nd:{
 "^":"d5;t5:type%,mH:href=",
 "%":"SVGScriptElement"},
-Lu:{
+EUL:{
 "^":"d5;t5:type%",
 "%":"SVGStyleElement"},
 d5:{
-"^":"cv;",
+"^":"h4;",
 gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
 return a._cssClassSet},
-gwd:function(a){return H.VM(new P.D7(a,new W.e7(a)),[W.cv])},
-swd:function(a,b){var z=H.VM(new P.D7(a,new W.e7(a)),[W.cv])
-J.r4(z.h2.NL)
-z.FV(0,b)},
-gi9:function(a){return C.mt.f0(a)},
-gVl:function(a){return C.pi.f0(a)},
-gLm:function(a){return C.i3.f0(a)},
-gVY:function(a){return C.DK.f0(a)},
-gE8:function(a){return C.W2.f0(a)},
-$isD0:true,
+gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
+gi9:function(a){return H.VM(new W.Cq(a,C.mt.Ph,!1),[null])},
+gVl:function(a){return H.VM(new W.Cq(a,C.nI.Ph,!1),[null])},
+gLm:function(a){return H.VM(new W.Cq(a,C.i3.Ph,!1),[null])},
+gVY:function(a){return H.VM(new W.Cq(a,C.uh.Ph,!1),[null])},
+gf0:function(a){return H.VM(new W.Cq(a,C.Kq.Ph,!1),[null])},
+$isPZ:true,
 "%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
-static:{"^":"JQ<"}},
+static:{"^":"SH<"}},
 hy:{
-"^":"zp;fg:height=,R:width=,x=,y=",
+"^":"zp;x=,y=",
 Kb:function(a,b){return a.getElementById(b)},
 $ishy:true,
 "%":"SVGSVGElement"},
 mHq:{
 "^":"zp;",
 "%":";SVGTextContentElement"},
-Rk4:{
-"^":"mHq;bP:method=,mH:href=",
+xN:{
+"^":"mHq;Sf:method=,mH:href=",
 "%":"SVGTextPathElement"},
-Eo:{
+Pt:{
 "^":"mHq;x=,y=",
 "%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
-pyk:{
-"^":"zp;fg:height=,R:width=,x=,y=,mH:href=",
+ci:{
+"^":"zp;x=,y=,mH:href=",
 "%":"SVGUseElement"},
-GN:{
+cuU:{
 "^":"d5;mH:href=",
 "%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
 O7:{
-"^":"As;LO",
+"^":"As3;CE",
 lF:function(){var z,y,x,w
-z=this.LO.getAttribute("class")
-y=P.Ls(null,null,null,J.O)
+z=this.CE.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.Kp(x,0)]);x.G();){w=J.rr(x.lo)
 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.CE.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
 "^":"",
-uC:{
+Hj:{
 "^":"Gv;tT:code=,G1:message=",
 "%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
 "^":"",
 hq:{
 "^":"a;",
 $ishq:true,
-static:{Jz:function(){return new H.ku((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
+static:{Jz:function(){return new H.iV((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
 "^":"",
-xZ:[function(a,b){return function(c,d,e){return function(){return c(d,e,this,Array.prototype.slice.apply(arguments))}}(P.R4,a,b)},"$2$captureThis","oo",2,3,null,223,128,[],247,[]],
+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.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,164,[],247,[],180,[],90,[]],
-Dm:[function(a,b,c){var z
+d=z}return P.wY(H.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,36,37,38,39],
+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},"$3","Iy",6,0,null,99,[],12,[],30,[]],
-Om:[function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},"$2","OP",4,0,null,99,[],12,[]],
+return!0}catch(z){H.Ru(z)}return!1},
+Om: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
 else{z=J.x(a)
-if(!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!z.$isu9)return a
+if(!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isu9)return a
 else if(!!z.$isiP)return H.o2(a)
 else if(!!z.$isE4)return a.eh
 else if(!!z.$isEH)return P.hE(a,"$dart_jsFunction",new P.DV())
-else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,116,99,[]],
-hE:[function(a,b,c){var z=P.Om(a,b)
+else return P.hE(a,"_$dart_jsObject",new P.Hp($.hs()))}},"$1","En",2,0,30,40],
+hE:function(a,b,c){var z=P.Om(a,b)
 if(z==null){z=c.$1(a)
-P.Dm(a,b,z)}return z},"$3","dw",6,0,null,99,[],69,[],250,[]],
+P.Dm(a,b,z)}return z},
 dU:[function(a){var z
 if(a==null||typeof a=="string"||typeof a=="number"||typeof a=="boolean")return a
 else{if(a instanceof Object){z=J.x(a)
-z=!!z.$isAz||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isHY||!!z.$isu9}else z=!1
+z=!!z.$isO4||!!z.$isea||!!z.$ishF||!!z.$isSg||!!z.$isKV||!!z.$isAS||!!z.$isu9}else z=!1
 if(z)return a
 else if(a instanceof Date)return P.Wu(a.getTime(),!1)
 else if(a.constructor===$.hs())return a.o
-else return P.ND(a)}},"$1","Xl",2,0,206,99,[]],
-ND:[function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
-else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),new P.QS())},"$1","ln",2,0,null,99,[]],
-iQ:[function(a,b,c){var z=P.Om(a,b)
+else return P.ND(a)}},"$1","Xl",2,0,25,40],
+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.QS())},
+iQ:function(a,b,c){var z=P.Om(a,b)
 if(z==null||!(a instanceof Object)){z=c.$1(a)
-P.Dm(a,b,z)}return z},"$3","yF",6,0,null,99,[],69,[],250,[]],
+P.Dm(a,b,z)}return z},
 E4:{
 "^":"a;eh",
 t:function(a,b){if(typeof b!=="string"&&typeof b!=="number")throw H.b(P.u("property is not a String or num"))
@@ -9088,43 +8404,50 @@
 giO:function(a){return 0},
 n:function(a,b){if(b==null)return!1
 return!!J.x(b).$isE4&&this.eh===b.eh},
-Bm:function(a){return a in this.eh},
+Eg:function(a){return a in this.eh},
 bu:function(a){var z,y
 try{z=String(this.eh)
 return z}catch(y){H.Ru(y)
 return P.a.prototype.bu.call(this,this)}},
-V7:function(a,b){var z,y
+K9:function(a,b){var z,y
 z=this.eh
-y=b==null?null:P.F(J.kl(b,P.En()),!0,null)
+y=b==null?null:P.F(H.VM(new H.lJ(b,P.En()),[null,null]),!0,null)
 return P.dU(z[a].apply(z,y))},
-nQ:function(a){return this.V7(a,null)},
+nQ:function(a){return this.K9(a,null)},
 $isE4:true,
 static:{zV:function(a,b){var z,y,x
 z=P.wY(a)
 if(b==null)return P.ND(new z())
 y=[null]
-C.Nm.FV(y,H.VM(new H.A8(b,P.En()),[null,null]))
+C.Nm.FV(y,H.VM(new H.lJ(b,P.En()),[null,null]))
 x=z.bind.apply(z,y)
 String(x)
-return P.ND(new x())},jT:function(a){return P.ND(P.M0(a))},M0:[function(a){return new P.Gn(P.UD(null,null)).$1(a)},"$1","aV",2,0,null,248,[]]}},
-Gn:{
-"^":"Tp:116;a",
+return P.ND(new x())},Oe:function(a){if(a==null)throw H.b(P.u("object cannot be a num, string, bool, or null"))
+return P.ND(P.wY(a))},M0:function(a){return new P.Xb(P.RN(null,null)).$1(a)}}},
+Xb:{
+"^":"Xs:30;a",
 $1:[function(a){var z,y,x,w,v
 z=this.a
 if(z.x4(a))return z.t(0,a)
 y=J.x(a)
 if(!!y.$isZ0){x={}
 z.u(0,a,x)
-for(z=J.GP(a.gvc());z.G();){w=z.gl()
-x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$isQV){v=[]
+for(z=J.mY(a.gvc());z.G();){w=z.gl()
+x[w]=this.$1(y.t(a,w))}return x}else if(!!y.$iscX){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,99,[],"call"],
+return v}else return P.wY(a)},"$1",null,2,0,null,40,"call"],
 $isEH:true},
 r7:{
-"^":"E4;eh"},
+"^":"E4;eh",
+qP:function(a,b){var z,y
+z=P.wY(b)
+y=P.F(H.VM(new H.lJ(a,P.En()),[null,null]),!0,null)
+return P.dU(this.eh.apply(z,y))},
+PO:function(a){return this.qP(a,null)},
+$isr7:true},
 Tz:{
-"^":"Wk;eh",
+"^":"F6;eh",
 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
@@ -9137,68 +8460,64 @@
 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)},
-h:function(a,b){this.V7("push",[b])},
-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.BE(b,c,this.gB(this))
-this.V7("splice",[b,c-b])},
-YW:function(a,b,c,d,e){var z,y,x,w
+h:function(a,b){this.K9("push",[b])},
+FV:function(a,b){this.K9("push",b instanceof Array?b:P.F(b,!0,null))},
+aP:function(a,b,c){if(b>=this.gB(this)+1)H.vh(P.TE(b,0,this.gB(this)))
+this.K9("splice",[b,0,c])},
+UZ:function(a,b,c){P.oY(b,c,this.gB(this))
+this.K9("splice",[b,c-b])},
+YW:function(a,b,c,d,e){var z,y,x
 z=this.gB(this)
-y=J.Wx(b)
-if(y.C(b,0)||y.D(b,z))H.vh(P.TE(b,0,z))
-y=J.Wx(c)
-if(y.C(c,b)||y.D(c,z))H.vh(P.TE(c,b,z))
-x=y.W(c,b)
-if(J.de(x,0))return
+if(b<0||b>z)H.vh(P.TE(b,0,z))
+if(c<b||c>z)H.vh(P.TE(c,b,z))
+y=c-b
+if(y===0)return
 if(e<0)throw H.b(P.u(e))
-w=[b,x]
-C.Nm.FV(w,J.Ld(d,e).qZ(0,x))
-this.V7("splice",w)},
-zB:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-GT:function(a,b){this.V7("sort",[b])},
-np:function(a){return this.GT(a,null)},
-static:{BE:[function(a,b,c){var z=J.Wx(a)
-if(z.C(a,0)||z.D(a,c))throw H.b(P.TE(a,0,c))
-z=J.Wx(b)
-if(z.C(b,a)||z.D(b,c))throw H.b(P.TE(b,a,c))},"$3","d6",6,0,null,134,[],135,[],249,[]]}},
-Wk:{
+x=[b,y]
+C.Nm.FV(x,J.Ld(d,e).qZ(0,y))
+this.K9("splice",x)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
+XP:function(a,b){this.K9("sort",[b])},
+Jd:function(a){return this.XP(a,null)},
+static:{oY: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))}}},
+F6:{
 "^":"E4+lD;",
-$isList:true,
+$isWO:true,
 $asWO:null,
 $isyN:true,
-$isQV:true,
-$asQV:null},
+$iscX:true,
+$ascX:null},
 DV:{
-"^":"Tp:116;",
-$1:[function(a){var z=P.xZ(a,!1)
+"^":"Xs:30;",
+$1:function(a){var z=P.z8(a,!1)
 P.Dm(z,$.Dp(),a)
-return z},"$1",null,2,0,null,99,[],"call"],
+return z},
 $isEH:true},
 Hp:{
-"^":"Tp:116;a",
-$1:[function(a){return new this.a(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Xs:30;a",
+$1:function(a){return new this.a(a)},
 $isEH:true},
 Nz:{
-"^":"Tp:116;",
-$1:[function(a){return new P.r7(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Xs:30;",
+$1:function(a){return new P.r7(a)},
 $isEH:true},
 Jd:{
-"^":"Tp:116;",
-$1:[function(a){return H.VM(new P.Tz(a),[null])},"$1",null,2,0,null,99,[],"call"],
+"^":"Xs:30;",
+$1:function(a){return H.VM(new P.Tz(a),[null])},
 $isEH:true},
 QS:{
-"^":"Tp:116;",
-$1:[function(a){return new P.E4(a)},"$1",null,2,0,null,99,[],"call"],
+"^":"Xs:30;",
+$1:function(a){return new P.E4(a)},
 $isEH:true}}],["dart.math","dart:math",,P,{
 "^":"",
-VC:[function(a,b){a=536870911&a+b
+Zm:function(a,b){a=536870911&a+b
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","hj",4,0,null,238,[],30,[]],
-Up:[function(a){a=536870911&a+((67108863&a)<<3>>>0)
+return a^a>>>6},
+xk:function(a){a=536870911&a+((67108863&a)<<3>>>0)
 a^=a>>>11
-return 536870911&a+((16383&a)<<15>>>0)},"$1","Hj",2,0,null,238,[]],
-J:[function(a,b){var z
+return 536870911&a+((16383&a)<<15>>>0)},
+J:function(a,b){var z
 if(typeof a!=="number")throw H.b(P.u(a))
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a>b)return b
@@ -9207,40 +8526,40 @@
 if(a===0)z=b===0?1/b<0:b<0
 else z=!1
 if(z||isNaN(b))return b
-return a}return a},"$2","yT",4,0,null,118,[],199,[]],
-y:[function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
+return a}return a},
+y:function(a,b){if(typeof a!=="number")throw H.b(P.u(a))
 if(typeof b!=="number")throw H.b(P.u(b))
 if(a>b)return a
 if(a<b)return b
 if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
 if(C.ON.gG0(b))return b
 return a}if(b===0&&C.CD.gzP(a))return b
-return a},"$2","Rb",4,0,null,118,[],199,[]],
-mg:{
+return a},
+mgb:{
 "^":"a;",
 j1:function(a){if(a<=0||a>4294967296)throw H.b(P.C3("max must be in range 0 < max \u2264 2^32, was "+a))
 return Math.random()*a>>>0}},
 vY:{
-"^":"a;Bo,Hz",
-o2:function(){var z,y,x,w,v,u
-z=this.Bo
+"^":"a;AW,mK",
+hJ:function(){var z,y,x,w,v,u
+z=this.AW
 y=4294901760*z
 x=(y&4294967295)>>>0
 w=55905*z
 v=(w&4294967295)>>>0
-u=v+x+this.Hz
+u=v+x+this.mK
 z=(u&4294967295)>>>0
-this.Bo=z
-this.Hz=(C.jn.cU(w-v+(y-x)+(u-z),4294967296)&4294967295)>>>0},
+this.AW=z
+this.mK=(C.jn.cU(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.C3("max must be in range 0 < max \u2264 2^32, was "+a))
 z=a-1
-if((a&z)===0){this.o2()
-return(this.Bo&z)>>>0}do{this.o2()
-y=this.Bo
+if((a&z)===0){this.hJ()
+return(this.AW&z)>>>0}do{this.hJ()
+y=this.AW
 x=y%a}while(y-x+a>=4294967296)
 return x},
-c3:function(a){var z,y,x,w,v,u,t,s
+XR: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)
@@ -9262,69 +8581,90 @@
 v=(x<<31>>>0)+x
 u=(v&4294967295)>>>0
 y=C.jn.cU(v-u,4294967296)
-v=this.Bo*1037
+v=this.AW*1037
 t=(v&4294967295)>>>0
-this.Bo=t
-s=(this.Hz*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
-this.Hz=s
-this.Bo=(t^u)>>>0
-this.Hz=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.de(a,z))
-if(this.Hz===0&&this.Bo===0)this.Bo=23063
-this.o2()
-this.o2()
-this.o2()
-this.o2()},
-static:{"^":"dK,PZ,r6",r2:function(a){var z=new P.vY(0,0)
-z.c3(a)
+this.AW=t
+s=(this.mK*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
+this.mK=s
+this.AW=(t^u)>>>0
+this.mK=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
+if(this.mK===0&&this.AW===0)this.AW=23063
+this.hJ()
+this.hJ()
+this.hJ()
+this.hJ()},
+static:{"^":"tgM,LA,JYU",r2:function(a){var z=new P.vY(0,0)
+z.XR(a)
 return z}}},
-hL:{
+EX:{
 "^":"a;x>,y>",
 bu:function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},
 n:function(a,b){var z,y
 if(b==null)return!1
-if(!J.x(b).$ishL)return!1
+if(!J.x(b).$isEX)return!1
 z=this.x
 y=b.x
-return(z==null?y==null:z===y)&&J.de(this.y,b.y)},
+if(z==null?y==null:z===y){z=this.y
+y=b.y
+y=z==null?y==null:z===y
+z=y}else z=!1
+return z},
 giO:function(a){var z,y
 z=J.v1(this.x)
 y=J.v1(this.y)
-return P.Up(P.VC(P.VC(0,z),y))},
-g:function(a,b){var z,y,x
+return P.xk(P.Zm(P.Zm(0,z),y))},
+g:function(a,b){var z,y,x,w
 z=this.x
 y=J.RE(b)
 x=y.gx(b)
 if(typeof z!=="number")return z.g()
 if(typeof x!=="number")return H.s(x)
-y=new P.hL(z+x,J.WB(this.y,y.gy(b)))
+w=this.y
+y=y.gy(b)
+if(typeof w!=="number")return w.g()
+if(typeof y!=="number")return H.s(y)
+y=new P.EX(z+x,w+y)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y},
-W:function(a,b){var z,y,x
+W:function(a,b){var z,y,x,w
 z=this.x
 y=J.RE(b)
 x=y.gx(b)
 if(typeof z!=="number")return z.W()
 if(typeof x!=="number")return H.s(x)
-y=new P.hL(z-x,J.xH(this.y,y.gy(b)))
+w=this.y
+y=y.gy(b)
+if(typeof w!=="number")return w.W()
+if(typeof y!=="number")return H.s(y)
+y=new P.EX(z-x,w-y)
 y.$builtinTypeInfo=this.$builtinTypeInfo
 return y},
-U:function(a,b){var z=this.x
+U:function(a,b){var z,y
+z=this.x
 if(typeof z!=="number")return z.U()
 if(typeof b!=="number")return H.s(b)
-z=new P.hL(z*b,J.vX(this.y,b))
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-$ishL:true},
-HDe:{
+y=this.y
+if(typeof y!=="number")return y.U()
+y=new P.EX(z*b,y*b)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+return y},
+$isEX:true},
+IV:{
 "^":"a;",
-gT8:function(a){var z=this.gBb(this)
+gT8:function(a){var z,y
+z=this.gBb(this)
+y=this.R
 if(typeof z!=="number")return z.g()
-return z+this.R},
-gQG:function(a){var z=this.gG6(this)
+if(typeof y!=="number")return H.s(y)
+return z+y},
+gOR:function(a){var z,y
+z=this.gG6(this)
+y=this.fg
 if(typeof z!=="number")return z.g()
-return z+this.fg},
-bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+this.R+" x "+this.fg},
-n:function(a,b){var z,y,x
+if(typeof y!=="number")return H.s(y)
+return z+y},
+bu:function(a){return"Rectangle ("+H.d(this.gBb(this))+", "+H.d(this.G6)+") "+H.d(this.R)+" x "+H.d(this.fg)},
+n:function(a,b){var z,y,x,w
 if(b==null)return!1
 z=J.x(b)
 if(!z.$istn)return!1
@@ -9333,25 +8673,31 @@
 if(y==null?x==null:y===x){y=this.G6
 x=z.gG6(b)
 if(y==null?x==null:y===x){x=this.Bb
+w=this.R
 if(typeof x!=="number")return x.g()
-if(x+this.R===z.gT8(b)){if(typeof y!=="number")return y.g()
-z=y+this.fg===z.gQG(b)}else z=!1}else z=!1}else z=!1
+if(typeof w!=="number")return H.s(w)
+if(x+w===z.gT8(b)){x=this.fg
+if(typeof y!=="number")return y.g()
+if(typeof x!=="number")return H.s(x)
+z=y+x===z.gOR(b)}else z=!1}else z=!1}else z=!1
 return z},
-giO:function(a){var z,y,x,w
+giO:function(a){var z,y,x,w,v,u
 z=J.v1(this.gBb(this))
 y=this.G6
 x=J.v1(y)
 w=this.Bb
+v=this.R
 if(typeof w!=="number")return w.g()
-w=w+this.R&0x1FFFFFFF
+if(typeof v!=="number")return H.s(v)
+u=this.fg
 if(typeof y!=="number")return y.g()
-y=y+this.fg&0x1FFFFFFF
-return P.Up(P.VC(P.VC(P.VC(P.VC(0,z),x),w),y))},
-gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
+if(typeof u!=="number")return H.s(u)
+return P.xk(P.Zm(P.Zm(P.Zm(P.Zm(0,z),x),w+v&0x1FFFFFFF),y+u&0x1FFFFFFF))},
+gSR:function(a){var z=new P.EX(this.gBb(this),this.G6)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z}},
 tn:{
-"^":"HDe;Bb>,G6>,R>,fg>",
+"^":"IV;Bb>,G6>,R>,fg>",
 $istn:true,
 $astn:null,
 static:{T7:function(a,b,c,d,e){var z,y
@@ -9361,108 +8707,47 @@
 if(typeof d!=="number")return d.C()
 if(d<0)y=-d*0
 else y=d
-return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.mirrors","dart:mirrors",,P,{
+return H.VM(new P.tn(a,b,z,y),[e])}}}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
 "^":"",
-re:[function(a){var z,y
-z=J.x(a)
-if(!z.$isuq||z.n(a,C.HH))throw H.b(P.u(H.d(a)+" does not denote a class"))
-y=P.o1(a)
-if(!J.x(y).$isMs)throw H.b(P.u(H.d(a)+" does not denote a class"))
-return y.gJi()},"$1","dO",2,0,null,49,[]],
-o1:[function(a){if(J.de(a,C.HH)){$.Cm().toString
-return $.P8()}return H.jO(a.gLU())},"$1","o9",2,0,null,49,[]],
-QF:{
-"^":"a;",
-$isQF:true},
-NL:{
-"^":"a;",
-$isNL:true,
-$isQF:true},
-vr:{
-"^":"a;",
-$isvr:true,
-$isQF:true},
-D4:{
-"^":"a;",
-$isD4:true,
-$isQF:true,
-$isNL:true},
-X9:{
-"^":"a;",
-$isX9:true,
-$isNL:true,
-$isQF:true},
-Ms:{
-"^":"a;",
-$isMs:true,
-$isQF:true,
-$isX9:true,
-$isNL:true},
-tg:{
-"^":"X9;",
-$istg:true},
-RS:{
-"^":"a;",
-$isRS:true,
-$isNL:true,
-$isQF:true},
-RY:{
-"^":"a;",
-$isRY:true,
-$isNL:true,
-$isQF:true},
-Ys:{
-"^":"a;",
-$isYs:true,
-$isRY:true,
-$isNL:true,
-$isQF:true},
-WS4:{
-"^":"a;ew,oQ,Js,f9"}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
-"^":"",
-ah:[function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},"$0","lc",0,0,null],
-Gj:{
-"^":"mAS;EV"},
-mAS:{
-"^":"Nx+B8q;",
+ah:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
+A2:{
+"^":"mA;F4"},
+mA:{
+"^":"Nx+cw;",
 $isZ0:true},
-B8q:{
+cw:{
 "^":"a;",
 u:function(a,b,c){return Q.ah()},
 FV:function(a,b){return Q.ah()},
-Rz:function(a,b){Q.ah()},
 V1:function(a){return Q.ah()},
 $isZ0:true},
 Nx:{
 "^":"a;",
-t:function(a,b){return this.EV.t(0,b)},
-u:function(a,b,c){this.EV.u(0,b,c)},
-FV:function(a,b){this.EV.FV(0,b)},
-V1:function(a){this.EV.V1(0)},
-x4:function(a){return this.EV.x4(a)},
-di:function(a){return this.EV.di(a)},
-aN:function(a,b){this.EV.aN(0,b)},
-gl0:function(a){return this.EV.X5===0},
-gor:function(a){return this.EV.X5!==0},
-gvc:function(){var z=this.EV
+t:function(a,b){return this.F4.t(0,b)},
+u:function(a,b,c){this.F4.u(0,b,c)},
+FV:function(a,b){this.F4.FV(0,b)},
+V1:function(a){this.F4.V1(0)},
+aN:function(a,b){this.F4.aN(0,b)},
+gl0:function(a){return this.F4.X5===0},
+gor:function(a){return this.F4.X5!==0},
+gvc:function(){var z=this.F4
 return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gB:function(a){return this.EV.X5},
-Rz:function(a,b){return this.EV.Rz(0,b)},
-gUQ:function(a){var z=this.EV
+gB:function(a){return this.F4.X5},
+gUQ:function(a){var z=this.F4
 return z.gUQ(z)},
-bu:function(a){return P.vW(this.EV)},
+bu:function(a){return P.vW(this.F4)},
 $isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
 "^":"",
-UI:function(a){a.toString
+m6:function(a){a.toString
 return a},
-bu:function(a){a.toString
+jZN:function(a){a.toString
 return a},
-aR:function(a){a.toString
+KY:function(a){a.toString
 return a},
-WZ:{
+D8:{
 "^":"Gv;",
-gbx:function(a){return C.PT},
-$isWZ:true,
+gbx:function(a){return C.E0},
+$isD8:true,
 "%":"ArrayBuffer"},
 pF:{
 "^":"Gv;",
@@ -9470,53 +8755,47 @@
 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)},
-PZ:function(a,b,c,d){this.ZF(a,b,d+1)
-return d},
 $ispF:true,
-$isHY:true,
-"%":";ArrayBufferView;b0B|Ui|Ip|Dg|ObS|nA|Pg"},
-df:{
+$isAS:true,
+"%":";ArrayBufferView;we|Nb|GVy|Dg|Ui|Ipv|Pg"},
+di:{
 "^":"pF;",
 gbx:function(a){return C.T1},
-$isHY:true,
+$isAS:true,
 "%":"DataView"},
 Hg:{
 "^":"Dg;",
-gbx:function(a){return C.hN},
+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},
-D6:function(a,b,c){return new Float32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$isWO:true,
+$asWO:function(){return[P.CP]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.Pp]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.CP]},
+$isAS:true,
 "%":"Float32Array"},
-fS:{
+K8Q:{
 "^":"Dg;",
-gbx:function(a){return C.lk},
+gbx:function(a){return C.G0},
 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},
-D6:function(a,b,c){return new Float64Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$isWO:true,
+$asWO:function(){return[P.CP]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.Pp]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.CP]},
+$isAS:true,
 "%":"Float64Array"},
-PS:{
+Hd:{
 "^":"Pg;",
 gbx:function(a){return C.jV},
 t:function(a,b){var z=a.length
@@ -9525,32 +8804,28 @@
 u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 a[b]=c},
-D6:function(a,b,c){return new Int16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.KN]},
+$isAS:true,
 "%":"Int16Array"},
-dE:{
+dE5:{
 "^":"Pg;",
-gbx:function(a){return C.Im},
+gbx:function(a){return C.KA},
 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},
-D6:function(a,b,c){return new Int32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.KN]},
+$isAS:true,
 "%":"Int32Array"},
 IJ:{
 "^":"Pg;",
@@ -9561,54 +8836,48 @@
 u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 a[b]=c},
-D6:function(a,b,c){return new Int8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.KN]},
+$isAS:true,
 "%":"Int8Array"},
 us:{
 "^":"Pg;",
-gbx:function(a){return C.iG},
+gbx:function(a){return C.oZ},
 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},
-D6:function(a,b,c){return new Uint16Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.KN]},
+$isAS:true,
 "%":"Uint16Array"},
-qe:{
+rs:{
 "^":"Pg;",
-gbx:function(a){return C.Vh},
+gbx:function(a){return C.dH},
 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},
-D6:function(a,b,c){return new Uint32Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.KN]},
+$isAS:true,
 "%":"Uint32Array"},
-eE:{
+eEV:{
 "^":"Pg;",
-gbx:function(a){return C.nG},
+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)
@@ -9616,18 +8885,16 @@
 u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 a[b]=c},
-D6:function(a,b,c){return new Uint8ClampedArray(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.KN]},
+$isAS:true,
 "%":"CanvasPixelArray|Uint8ClampedArray"},
 V6:{
 "^":"Pg;",
-gbx:function(a){return C.eY},
+gbx:function(a){return C.HC},
 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)
@@ -9635,630 +8902,646 @@
 u:function(a,b,c){var z=a.length
 if(b>>>0!==b||b>=z)this.J2(a,b,z)
 a[b]=c},
-D6:function(a,b,c){return new Uint8Array(a.subarray(b,this.PZ(a,b,c,a.length)))},
-Jk:function(a,b){return this.D6(a,b,null)},
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]},
-$isHY:true,
+$iscX:true,
+$ascX:function(){return[P.KN]},
+$isAS:true,
 "%":";Uint8Array"},
-b0B:{
+we:{
 "^":"pF;",
 gB:function(a){return a.length},
 oZ:function(a,b,c,d,e){var z,y,x
 z=a.length+1
 this.ZF(a,b,z)
 this.ZF(a,c,z)
-if(J.z8(b,c))throw H.b(P.TE(b,0,c))
-y=J.xH(c,b)
+if(b>c)throw H.b(P.TE(b,0,c))
+y=c-b
 if(e<0)throw H.b(P.u(e))
 x=d.length
-if(typeof y!=="number")return H.s(y)
 if(x-e<y)throw H.b(P.w("Not enough elements"))
 if(e!==0||x!==y)d=d.subarray(e,e+y)
 a.set(d,b)},
 $isXj:true},
 Dg:{
-"^":"Ip;",
+"^":"GVy;",
 YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(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)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isDg:true,
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$isWO:true,
+$asWO:function(){return[P.CP]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.Pp]}},
-Ui:{
-"^":"b0B+lD;",
-$isList:true,
-$asWO:function(){return[J.Pp]},
+$iscX:true,
+$ascX:function(){return[P.CP]}},
+Nb:{
+"^":"we+lD;",
+$isWO:true,
+$asWO:function(){return[P.CP]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.Pp]}},
-Ip:{
-"^":"Ui+SU7;"},
+$iscX:true,
+$ascX:function(){return[P.CP]}},
+GVy:{
+"^":"Nb+Lj;"},
 Pg:{
-"^":"nA;",
+"^":"Ipv;",
 YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(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)},
+vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
 $isPg:true,
-$isList:true,
-$asWO:function(){return[J.bU]},
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]}},
-ObS:{
-"^":"b0B+lD;",
-$isList:true,
-$asWO:function(){return[J.bU]},
+$iscX:true,
+$ascX:function(){return[P.KN]}},
+Ui:{
+"^":"we+lD;",
+$isWO:true,
+$asWO:function(){return[P.KN]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.bU]}},
-nA:{
-"^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
+$iscX:true,
+$ascX:function(){return[P.KN]}},
+Ipv:{
+"^":"Ui+Lj;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
 "^":"",
-qw:[function(a){if(typeof dartPrint=="function"){dartPrint(a)
-return}if(typeof console=="object"&&typeof console.log=="function"){console.log(a)
+qw: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)},"$1","Kg",2,0,null,14,[]]}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
+return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
 "^":"",
-Ir:{
-"^":["D13;Py%-341,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.Py},null,null,1,0,320,"error",308,311],
-skc:[function(a,b){a.Py=this.ct(a,C.YU,a.Py,b)},null,null,3,0,321,30,[],"error",308],
-"@":function(){return[C.uW]},
-static:{hG:[function(a){var z,y,x,w
+ZP:{
+"^":"Vct;Py,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gkc:function(a){return a.Py},
+skc:function(a,b){a.Py=this.ct(a,C.yh,a.Py,b)},
+static:{Yw:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.OD.ZL(a)
-C.OD.oX(a)
-return a},null,null,0,0,115,"new ErrorViewElement$created"]}},
-"+ErrorViewElement":[394],
-D13:{
+C.OD.XI(a)
+return a}}},
+Vct:{
 "^":"uL+Pi;",
 $isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
 "^":"",
-rm:{
-"^":["WZq;a3%-305,Ab%-305,Ln%-395,y4%-396,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ga4:[function(a){return a.a3},null,null,1,0,312,"text",308,309],
-sa4:[function(a,b){a.a3=this.ct(a,C.mi,a.a3,b)},null,null,3,0,32,30,[],"text",308],
-gzW:[function(a){return a.Ab},null,null,1,0,312,"lineMode",308,309],
-szW:[function(a,b){a.Ab=this.ct(a,C.eh,a.Ab,b)},null,null,3,0,32,30,[],"lineMode",308],
-gFR:[function(a){return a.Ln},null,null,1,0,397,"callback",308,311],
+nJ:{
+"^":"D13;a3,Ek,Ln,y4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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},
+sdu:function(a,b){a.Ek=this.ct(a,C.eh,a.Ek,b)},
+gFR:function(a){return a.Ln},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.Ln=this.ct(a,C.AV,a.Ln,b)},null,null,3,0,398,30,[],"callback",308],
-gPK:[function(a){return a.y4},null,null,1,0,399,"results",308,309],
-sPK:[function(a,b){a.y4=this.ct(a,C.Aa,a.y4,b)},null,null,3,0,400,30,[],"results",308],
+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
-z=this.ct(a,C.eh,a.Ab,z)
-a.Ab=z
-if(J.de(z,"1-line")){z=J.JA(a.a3,"\n"," ")
-a.a3=this.ct(a,C.mi,a.a3,z)}},"$3","gxb",6,0,350,21,[],351,[],82,[],"updateLineMode"],
-kk:[function(a,b,c,d){var z,y,x
-J.zJ(b)
+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,69,1,70,71],
+Z1:[function(a,b,c,d){var z,y,x
+J.fD(b)
 z=a.a3
 a.a3=this.ct(a,C.mi,z,"")
 if(a.Ln!=null){y=P.Fl(null,null)
-x=R.Jk(y)
+x=R.tB(y)
 J.kW(x,"expr",z)
-J.BM(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,350,21,[],351,[],82,[],"eval"],
-A3:[function(a,b){var z=J.MI(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,401,21,[],"selectExpr"],
-"@":function(){return[C.Qz]},
-static:{Rp:[function(a){var z,y,x,w,v
-z=R.Jk([])
+J.Mx(a.y4,0,x)
+this.LY(a,z).ml(new L.YW(x))}},"$3","gZ2",6,0,69,1,70,71],
+YC:[function(a,b){var z=J.iz(J.l2(b),"expr")
+a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,92,1],
+static:{Rp:function(a){var z,y,x,w,v
+z=R.tB([])
 y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.Ab="1-line"
+x=P.YM(null,null,null,P.qU,W.I0)
+w=P.qU
+v=W.h4
+v=H.VM(new V.qC(P.YM(null,null,null,w,v),null,null),[w,v])
+a.Ek="1-line"
 a.y4=z
-a.SO=y
-a.B7=x
-a.X0=v
+a.on=y
+a.BA=x
+a.LL=v
 C.Gh.ZL(a)
-C.Gh.oX(a)
-return a},null,null,0,0,115,"new EvalBoxElement$created"]}},
-"+EvalBoxElement":[402],
-WZq:{
+C.Gh.XI(a)
+return a}}},
+D13:{
 "^":"uL+Pi;",
 $isd3:true},
 YW:{
-"^":"Tp:116;a-85",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,116,57,[],"call"],
-$isEH:true},
-"+ YW":[315]}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
+"^":"Xs:30;a",
+$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,93,"call"],
+$isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
 "^":"",
-Lt:{
-"^":["Bc;TS%-304,bY%-85,jv%-305,oy%-341,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gO9:[function(a){return a.TS},null,null,1,0,307,"busy",308,309],
-sO9:[function(a,b){a.TS=this.ct(a,C.S4,a.TS,b)},null,null,3,0,310,30,[],"busy",308],
-gFR:[function(a){return a.bY},null,null,1,0,115,"callback",308,311],
+Eg:{
+"^":"LPc;fe,l1,bY,jv,oy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gv8:function(a){return a.fe},
+sv8: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},
 Ki:function(a){return this.gFR(a).$0()},
 LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},null,null,3,0,116,30,[],"callback",308],
-gNW:[function(a){return a.jv},null,null,1,0,312,"expr",308,311],
-sNW:[function(a,b){a.jv=this.ct(a,C.Yy,a.jv,b)},null,null,3,0,32,30,[],"expr",308],
-gyG:[function(a){return a.oy},null,null,1,0,320,"result",308,311],
-syG:[function(a,b){a.oy=this.ct(a,C.UY,a.oy,b)},null,null,3,0,321,30,[],"result",308],
-wB:[function(a,b,c,d){var z=a.TS
+sFR:function(a,b){a.bY=this.ct(a,C.AV,a.bY,b)},
+gkZ:function(a){return a.jv},
+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
 if(z===!0)return
-if(a.bY!=null){a.TS=this.ct(a,C.S4,z,!0)
+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.Ou(a))}},"$3","gDf",6,0,313,118,[],199,[],289,[],"evalNow"],
-"@":function(){return[C.Vn]},
-static:{fL:[function(a){var z,y,x,w
+this.LY(a,a.jv).ml(new R.Kz(a)).wM(new R.uv(a))}},"$3","gbN",6,0,54,22,23,55],
+static:{fL:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.TS=!1
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.fe=!1
+a.l1="[evaluate]"
 a.bY=null
 a.jv=""
 a.oy=null
-a.SO=z
-a.B7=y
-a.X0=w
-C.UF.ZL(a)
-C.UF.oX(a)
-return a},null,null,0,0,115,"new EvalLinkElement$created"]}},
-"+EvalLinkElement":[403],
-Bc:{
-"^":"xc+Pi;",
+a.on=z
+a.BA=y
+a.LL=w
+C.qL.ZL(a)
+C.qL.XI(a)
+return a}}},
+LPc:{
+"^":"ir+Pi;",
 $isd3:true},
 Kz:{
-"^":"Tp:321;a-85",
-$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.soy(z,y.ct(z,C.UY,y.goy(z),a))},"$1",null,2,0,321,101,[],"call"],
+"^":"Xs:94;a",
+$1:[function(a){var z=this.a
+z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,60,"call"],
 $isEH:true},
-"+ Kz":[315],
-Ou:{
-"^":"Tp:115;b-85",
-$0:[function(){var z,y
-z=this.b
-y=J.RE(z)
-y.sTS(z,y.ct(z,C.S4,y.gTS(z),!1))},"$0",null,0,0,115,"call"],
-$isEH:true},
-"+ Ou":[315]}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
+uv:{
+"^":"Xs:47;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,{
 "^":"",
-UL:{
-"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.E6]},
-static:{zY:[function(a){var z,y,x,w
+i7:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{dq:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.MC.ZL(a)
-C.MC.oX(a)
-return a},null,null,0,0,115,"new FieldRefElement$created"]}},
-"+FieldRefElement":[342]}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
+a.on=z
+a.BA=y
+a.LL=w
+C.Yl.ZL(a)
+C.Yl.XI(a)
+return a}}}}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
 "^":"",
-jM:{
-"^":["pva;vt%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gt0:[function(a){return a.vt},null,null,1,0,337,"field",308,311],
-st0:[function(a,b){a.vt=this.ct(a,C.Gx,a.vt,b)},null,null,3,0,338,30,[],"field",308],
-pA:[function(a,b){J.am(a.vt).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.vc]},
-static:{bH:[function(a){var z,y,x,w
+Gk:{
+"^":"WZq;KV,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gt0:function(a){return a.KV},
+st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
+RF:[function(a,b){J.LE(a.KV).wM(b)},"$1","gvC",2,0,15,65],
+static:{Sy:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.LT.ZL(a)
-C.LT.oX(a)
-return a},null,null,0,0,115,"new FieldViewElement$created"]}},
-"+FieldViewElement":[404],
-pva:{
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.by.ZL(a)
+C.by.XI(a)
+return a}}},
+WZq:{
 "^":"uL+Pi;",
 $isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
 "^":"",
-qW:{
-"^":["rs;lh%-304,qe%-304,zg%-304,Fs%-304,AP,fn,tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gU4:[function(a){return a.lh},null,null,1,0,307,"qualified",308,311],
-sU4:[function(a,b){a.lh=this.ct(a,C.zc,a.lh,b)},null,null,3,0,310,30,[],"qualified",308],
-P9:[function(a,b){var z,y,x
-Q.xI.prototype.P9.call(this,a,b)
-this.ct(a,C.D2,0,1)
-this.ct(a,C.mP,0,1)
+DK:{
+"^":"T53;ay,MC,oX,Oc,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gU4:function(a){return a.ay},
+sU4:function(a,b){a.ay=this.ct(a,C.QK,a.ay,b)},
+Qj:[function(a,b){var z,y,x
+Q.xI.prototype.Qj.call(this,a,b)
+this.ct(a,C.ak,0,1)
+this.ct(a,C.Ql,0,1)
 z=a.tY
 y=z!=null
 if(y){x=J.U6(z)
-x=!J.de(x.t(z,"kind"),"Collected")&&!J.de(x.t(z,"kind"),"Native")&&!J.de(x.t(z,"kind"),"Tag")&&!J.de(x.t(z,"kind"),"Reused")}else x=!1
-a.Fs=this.ct(a,C.P9,a.Fs,x)
+x=!J.xC(x.t(z,"kind"),"Collected")&&!J.xC(x.t(z,"kind"),"Native")&&!J.xC(x.t(z,"kind"),"Tag")&&!J.xC(x.t(z,"kind"),"Reused")}else x=!1
+a.Oc=this.ct(a,C.a0,a.Oc,x)
 x=y&&J.UQ(z,"parent")!=null
-a.qe=this.ct(a,C.D2,a.qe,x)
+a.MC=this.ct(a,C.ak,a.MC,x)
 if(y){y=J.U6(z)
-y=y.t(z,"owner")!=null&&J.de(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.zg=this.ct(a,C.mP,a.zg,y)},"$1","gLe",2,0,169,242,[],"refChanged"],
-gSY4:[function(a){return a.qe},null,null,1,0,307,"hasParent",308,309],
-sSY4:[function(a,b){a.qe=this.ct(a,C.D2,a.qe,b)},null,null,3,0,310,30,[],"hasParent",308],
-gIO:[function(a){return a.zg},null,null,1,0,307,"hasClass",308,309],
-sIO:[function(a,b){a.zg=this.ct(a,C.mP,a.zg,b)},null,null,3,0,310,30,[],"hasClass",308],
-gmN:[function(a){return a.Fs},null,null,1,0,307,"isDart",308,309],
-smN:[function(a,b){a.Fs=this.ct(a,C.P9,a.Fs,b)},null,null,3,0,310,30,[],"isDart",308],
-"@":function(){return[C.o3]},
-static:{Wz:[function(a){var z,y,x,w
+y=y.t(z,"owner")!=null&&J.xC(y.t(z,"owner").gzS(),"Class")}else y=!1
+a.oX=this.ct(a,C.Ql,a.oX,y)},"$1","gLe",2,0,15,34],
+gSY:function(a){return a.MC},
+sSY:function(a,b){a.MC=this.ct(a,C.ak,a.MC,b)},
+gE7:function(a){return a.oX},
+sE7:function(a,b){a.oX=this.ct(a,C.Ql,a.oX,b)},
+gni:function(a){return a.Oc},
+sni:function(a,b){a.Oc=this.ct(a,C.a0,a.Oc,b)},
+static:{E5:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.lh=!0
-a.qe=!1
-a.zg=!1
-a.Fs=!1
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.ay=!0
+a.MC=!1
+a.oX=!1
+a.Oc=!1
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
+a.on=z
+a.BA=y
+a.LL=w
 C.Xo.ZL(a)
-C.Xo.oX(a)
-return a},null,null,0,0,115,"new FunctionRefElement$created"]}},
-"+FunctionRefElement":[405],
-rs:{
+C.Xo.XI(a)
+return a}}},
+T53:{
 "^":"xI+Pi;",
 $isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
 "^":"",
-mk:{
-"^":["cda;De%-336,Iu%-305,Ru%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gMj:[function(a){return a.De},null,null,1,0,337,"function",308,311],
-sMj:[function(a,b){a.De=this.ct(a,C.nf,a.De,b)},null,null,3,0,338,30,[],"function",308],
-gUx:[function(a){return a.Iu},null,null,1,0,312,"qualifiedName",308,311],
-sUx:[function(a,b){a.Iu=this.ct(a,C.AO,a.Iu,b)},null,null,3,0,32,30,[],"qualifiedName",308],
-gfY:[function(a){return a.Ru},null,null,1,0,312,"kind",308,311],
-sfY:[function(a,b){a.Ru=this.ct(a,C.fy,a.Ru,b)},null,null,3,0,32,30,[],"kind",308],
-FW:[function(a,b){var z,y,x
+BS:{
+"^":"pva;C9,Sq,ZZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gig:function(a){return a.C9},
+sig:function(a,b){a.C9=this.ct(a,C.nf,a.C9,b)},
+gUx:function(a){return a.Sq},
+sUx:function(a,b){a.Sq=this.ct(a,C.AO,a.Sq,b)},
+gfY:function(a){return a.ZZ},
+sfY:function(a,b){a.ZZ=this.ct(a,C.Lc,a.ZZ,b)},
+W7:function(a,b){var z,y,x
 z=b!=null
 y=z&&J.UQ(b,"parent")!=null?J.UQ(b,"parent"):null
-if(y!=null)return this.FW(a,y)+"."+H.d(J.UQ(b,"user_name"))
+if(y!=null)return this.W7(a,y)+"."+H.d(J.UQ(b,"user_name"))
 if(z){z=J.U6(b)
-z=z.t(b,"owner")!=null&&J.de(z.t(b,"owner").gzS(),"Class")}else z=!1
+z=z.t(b,"owner")!=null&&J.xC(z.t(b,"owner").gzS(),"Class")}else z=!1
 x=z?J.UQ(b,"owner"):null
 if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
-return H.d(J.UQ(b,"user_name"))},"$1","gWd",2,0,406,17,[],"_getQualifiedName"],
-ql:[function(a,b){var z,y
+return H.d(J.UQ(b,"user_name"))},
+yM:[function(a,b){var z,y
 this.ct(a,C.AO,0,1)
-this.ct(a,C.fy,0,1)
-z=this.FW(a,a.De)
-a.Iu=this.ct(a,C.AO,a.Iu,z)
-z=J.UQ(a.De,"kind")
-y=a.Ru
-switch(z){case"kRegularFunction":a.Ru=this.ct(a,C.fy,y,"function")
+this.ct(a,C.Lc,0,1)
+z=this.W7(a,a.C9)
+a.Sq=this.ct(a,C.AO,a.Sq,z)
+z=J.UQ(a.C9,"kind")
+y=a.ZZ
+switch(z){case"kRegularFunction":a.ZZ=this.ct(a,C.Lc,y,"function")
 break
-case"kClosureFunction":a.Ru=this.ct(a,C.fy,y,"closure function")
+case"kClosureFunction":a.ZZ=this.ct(a,C.Lc,y,"closure function")
 break
-case"kSignatureFunction":a.Ru=this.ct(a,C.fy,y,"signature function")
+case"kSignatureFunction":a.ZZ=this.ct(a,C.Lc,y,"signature function")
 break
-case"kGetterFunction":a.Ru=this.ct(a,C.fy,y,"getter function")
+case"kGetterFunction":a.ZZ=this.ct(a,C.Lc,y,"getter function")
 break
-case"kSetterFunction":a.Ru=this.ct(a,C.fy,y,"setter function")
+case"kSetterFunction":a.ZZ=this.ct(a,C.Lc,y,"setter function")
 break
-case"kConstructor":a.Ru=this.ct(a,C.fy,y,"constructor")
+case"kConstructor":a.ZZ=this.ct(a,C.Lc,y,"constructor")
 break
-case"kImplicitGetterFunction":a.Ru=this.ct(a,C.fy,y,"implicit getter function")
+case"kImplicitGetterFunction":a.ZZ=this.ct(a,C.Lc,y,"implicit getter function")
 break
-case"kImplicitSetterFunction":a.Ru=this.ct(a,C.fy,y,"implicit setter function")
+case"kImplicitSetterFunction":a.ZZ=this.ct(a,C.Lc,y,"implicit setter function")
 break
-case"kStaticInitializer":a.Ru=this.ct(a,C.fy,y,"static initializer")
+case"kStaticInitializer":a.ZZ=this.ct(a,C.Lc,y,"static initializer")
 break
-case"kMethodExtractor":a.Ru=this.ct(a,C.fy,y,"method extractor")
+case"kMethodExtractor":a.ZZ=this.ct(a,C.Lc,y,"method extractor")
 break
-case"kNoSuchMethodDispatcher":a.Ru=this.ct(a,C.fy,y,"noSuchMethod dispatcher")
+case"kNoSuchMethodDispatcher":a.ZZ=this.ct(a,C.Lc,y,"noSuchMethod dispatcher")
 break
-case"kInvokeFieldDispatcher":a.Ru=this.ct(a,C.fy,y,"invoke field dispatcher")
+case"kInvokeFieldDispatcher":a.ZZ=this.ct(a,C.Lc,y,"invoke field dispatcher")
 break
-default:a.Ru=this.ct(a,C.fy,y,"UNKNOWN")
-break}},"$1","gNC",2,0,169,242,[],"functionChanged"],
-pA:[function(a,b){J.am(a.De).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.nu]},
-static:{N0:[function(a){var z,y,x,w
+default:a.ZZ=this.ct(a,C.Lc,y,"UNKNOWN")
+break}},"$1","gnp",2,0,15,34],
+RF:[function(a,b){J.LE(a.C9).wM(b)},"$1","gvC",2,0,15,65],
+static:{nz:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.h4.ZL(a)
-C.h4.oX(a)
-return a},null,null,0,0,115,"new FunctionViewElement$created"]}},
-"+FunctionViewElement":[407],
-cda:{
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.p0.ZL(a)
+C.p0.XI(a)
+return a}}},
+pva:{
 "^":"uL+Pi;",
 $isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
 "^":"",
-Qb:{
-"^":"a;HW,mS",
-F8:[function(){return new O.Qb(this.HW,J.WB(this.mS,4))},"$0","gaw",0,0,408],
-gvH:function(a){return J.Ts(this.mS,4)},
-static:{"^":"Q0z",x6:function(a,b){var z=J.RE(b)
-return new O.Qb(a,J.vX(J.WB(J.vX(z.gy(b),J.YD(a)),z.gx(b)),4))}}},
+Hz:{
+"^":"a;zE,mS",
+m0:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,95],
+gvH:function(a){return C.CD.cU(this.mS,4)},
+static:{"^":"Q0z",Iu:function(a,b){var z,y,x
+z=b.gy(b)
+y=J.DO(a)
+if(typeof z!=="number")return z.U()
+if(typeof y!=="number")return H.s(y)
+x=b.gx(b)
+if(typeof x!=="number")return H.s(x)
+return new O.Hz(a,(z*y+x)*4)}}},
 uc:{
 "^":"a;Yu<,tL"},
-pL:{
-"^":["waa;hi%-85,An%-85,dW%-85,rM%-85,Ge%-85,UL%-85,PA%-305,Oh%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gys:[function(a){return a.PA},null,null,1,0,312,"status",308,309],
-sys:[function(a,b){a.PA=this.ct(a,C.PM,a.PA,b)},null,null,3,0,32,30,[],"status",308],
-gyw:[function(a){return a.Oh},null,null,1,0,337,"fragmentation",308,311],
-syw:[function(a,b){a.Oh=this.ct(a,C.QH,a.Oh,b)},null,null,3,0,338,30,[],"fragmentation",308],
-i4:[function(a){var z
-Z.uL.prototype.i4.call(this,a)
+Vb:{
+"^":"cda;hi,An,dW,rM,Ge,UL,PA,oj,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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},
+syw:function(a,b){a.oj=this.ct(a,C.QH,a.oj,b)},
+q0:function(a){var z
+Z.uL.prototype.q0.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
 a.hi=z
-J.oL(z).yI(this.gmo(a))
-J.GW(a.hi).yI(this.gJb(a))},"$0","gQd",0,0,126,"enteredView"],
-LV:[function(a,b){var z,y,x
-for(z=J.GP(b),y=0;z.G();){x=z.gl()
+z=J.Q9(z)
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(this.gmo(a)),z.Sg),[H.Kp(z,0)]).Zz()
+z=J.GW(a.hi)
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(this.gJb(a)),z.Sg),[H.Kp(z,0)]).Zz()},
+LV:function(a,b){var z,y,x
+for(z=J.mY(b),y=0;z.G();){x=z.lo
 if(typeof x!=="number")return H.s(x)
-y=y*256+x}return y},"$1","gzK",2,0,409,410,[],"_packColor"],
-tn:[function(a,b,c,d){var z,y
-z=a.UL
-y=J.uH(c,"@")
-if(0>=y.length)return H.e(y,0)
-J.kW(z,b,y[0])
-J.kW(a.rM,b,d)
-J.kW(a.Ge,this.LV(a,d),b)},"$3","gAa",6,0,411,412,[],12,[],410,[],"_addClass"],
-an:[function(a,b,c){var z,y,x,w,v,u,t
-for(z=J.GP(J.UQ(b,"members"));z.G();){y=z.gl()
-x=J.U6(y)
-if(!J.de(x.t(y,"type"),"@Class")){N.Jx("").To(H.d(y))
-continue}w=H.BU(C.Nm.grZ(J.uH(x.t(y,"id"),"/")),null,null)
-v=w==null?C.OY:P.r2(w)
-u=[v.j1(128),v.j1(128),v.j1(128),255]
-x=x.t(y,"name")
-t=a.UL
-x=J.uH(x,"@")
-if(0>=x.length)return H.e(x,0)
-J.kW(t,w,x[0])
-J.kW(a.rM,w,u)
-J.kW(a.Ge,this.LV(a,u),w)}this.tn(a,c,"Free",$.R2())
-this.tn(a,0,"",$.eK())},"$2","gUw",4,0,413,414,[],415,[],"_updateClassList"],
-LI:[function(a,b){var z=b==null?C.OY:P.r2(b)
-return[z.j1(128),z.j1(128),z.j1(128),255]},"$1","gz4",2,0,416,412,[],"_classIdToRGBA"],
-Ic:[function(a,b){var z,y,x
-z=O.x6(a.An,b)
-y=z.mS
-x=J.Cl(J.Qd(z.HW),y,J.WB(y,4))
-return J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,x)))},"$1","gQe",2,0,417,418,[],"_classNameAt"],
-WE:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=J.vX(a.dW,J.YD(a.An))
-y=J.Ts(O.x6(a.An,b).mS,4)
-x=J.Wx(y)
-w=x.Z(y,z)
-v=x.Y(y,z)
-u=J.UQ(a.Oh,"pages")
-x=J.Wx(w)
-if(x.C(w,0)||x.F(w,J.q8(u)))return
-t=J.UQ(u,w)
-x=J.U6(t)
-s=x.t(t,"objects")
-r=J.U6(s)
+y=y*256+x}return y},
+fJ:function(a,b,c,d){var z=J.uH(c,"@")
+if(0>=z.length)return H.e(z,0)
+a.UL.u(0,b,z[0])
+a.rM.u(0,b,d)
+a.Ge.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.Ge;z.G();){v=z.gl()
+u=J.U6(v)
+if(!J.xC(u.t(v,"type"),"@Class")){N.QM("").To(H.d(v))
+continue}t=H.BU(C.Nm.grZ(J.uH(u.t(v,"id"),"/")),null,null)
+s=t==null?C.pr:P.r2(t)
+r=[s.j1(128),s.j1(128),s.j1(128),255]
+u=J.uH(u.t(v,"name"),"@")
+if(0>=u.length)return H.e(u,0)
+y.u(0,t,u[0])
+x.u(0,t,r)
+w.u(0,this.LV(a,r),t)}this.fJ(a,c,"Free",$.aw())
+this.fJ(a,0,"",$.Sd())},
+WE:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
+z=a.dW
+y=J.DO(a.An)
+if(typeof z!=="number")return z.U()
+if(typeof y!=="number")return H.s(y)
+x=z*y
+w=C.CD.cU(O.Iu(a.An,b).mS,4)
+v=C.CD.Z(w,x)
+u=C.CD.Y(w,x)
+t=J.UQ(a.oj,"pages")
+if(!(v<0)){z=J.q8(t)
+if(typeof z!=="number")return H.s(z)
+z=v>=z}else z=!0
+if(z)return
+s=J.UQ(t,v)
+z=J.U6(s)
+r=z.t(s,"objects")
+y=J.U6(r)
 q=0
 p=0
 o=0
-while(!0){n=r.gB(s)
+while(!0){n=y.gB(r)
 if(typeof n!=="number")return H.s(n)
 if(!(o<n))break
-p=r.t(s,o)
+p=y.t(r,o)
 if(typeof p!=="number")return H.s(p)
 q+=p
-if(q>v){v=q-p
-break}o+=2}x=H.BU(x.t(t,"object_start"),null,null)
-r=J.UQ(a.Oh,"unit_size_bytes")
-if(typeof r!=="number")return H.s(r)
-return new O.uc(J.WB(x,v*r),J.vX(p,J.UQ(a.Oh,"unit_size_bytes")))},"$1","gR5",2,0,419,418,[],"_objectAt"],
-U8:[function(a,b){var z,y,x,w,v,u
+if(q>u){u=q-p
+break}o+=2}z=H.BU(z.t(s,"object_start"),null,null)
+y=J.UQ(a.oj,"unit_size_bytes")
+if(typeof y!=="number")return H.s(y)
+return new O.uc(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
 z=J.RE(b)
 y=this.WE(a,z.gD7(b))
-x=H.d(y.tL)+"B @ 0x"+J.cR(y.Yu,16)
+x=H.d(y.tL)+"B @ 0x"+J.u1(y.Yu,16)
 z=z.gD7(b)
-z=O.x6(a.An,z)
+z=O.Iu(a.An,z)
 w=z.mS
-v=J.Cl(J.Qd(z.HW),w,J.WB(w,4))
-u=J.UQ(a.UL,J.UQ(a.Ge,this.LV(a,v)))
-z=J.de(u,"")?"-":H.d(u)+" "+x
-a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,401,325,[],"_handleMouseMove"],
-f1:[function(a,b){var z=J.cR(this.WE(a,J.HF(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.QP(a.Oh)))+"/address/"+z},"$1","gJb",2,0,401,325,[],"_handleClick"],
-My:[function(a){var z,y,x,w
-z=a.Oh
+v=a.UL.t(0,a.Ge.t(0,this.LV(a,C.mU.Mu(J.Qd(z.zE),w,w+4))))
+z=J.xC(v,"")?"-":H.d(v)+" "+x
+a.PA=this.ct(a,C.PM,a.PA,z)},"$1","gmo",2,0,92,59],
+f1:[function(a,b){var z=J.u1(this.WE(a,J.WS(b)).Yu,16)
+window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,92,59],
+My:function(a){var z,y,x,w
+z=a.oj
 if(z==null||a.hi==null)return
-this.an(a,J.UQ(z,"class_list"),J.UQ(a.Oh,"free_class_id"))
-y=J.UQ(a.Oh,"pages")
-z=J.Q5(J.u3(a.hi))
-x=z.gR(z)
-z=J.Ts(J.Ts(J.UQ(a.Oh,"page_size_bytes"),J.UQ(a.Oh,"unit_size_bytes")),x)
+this.eD(a,J.UQ(z,"class_list"),J.UQ(a.oj,"free_class_id"))
+y=J.UQ(a.oj,"pages")
+z=a.hi.parentElement
+x=P.T7(z.clientLeft,z.clientTop,z.clientWidth,z.clientHeight,null).R
+z=J.Ts(J.Ts(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
 w=J.q8(y)
 if(typeof w!=="number")return H.s(w)
-w=P.f9(J.Vf(a.hi).createImageData(x,z*w))
+w=P.J3(J.uP(a.hi).createImageData(x,z*w))
 a.An=w
-J.No(a.hi,J.YD(w))
-J.OE(a.hi,J.OBt(a.An))
-this.ps(a,0)},"$0","gCT",0,0,126,"_updateFragmentationData"],
-ps:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-z=J.UQ(a.Oh,"pages")
+J.fc(a.hi,J.DO(w))
+J.OE(a.hi,J.OB(a.An))
+this.ps(a,0)},
+ps: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 "+H.d(b)+" of "+H.d(y.gB(z))+" pages"
+x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
 a.PA=this.ct(a,C.PM,a.PA,x)
-x=J.Wx(b)
-if(x.F(b,y.gB(z)))return
-w=x.U(b,a.dW)
-v=O.x6(a.An,H.VM(new P.hL(0,w),[null]))
+x=y.gB(z)
+if(typeof x!=="number")return H.s(x)
+if(b>=x)return
+x=a.dW
+if(typeof x!=="number")return H.s(x)
+w=b*x
+v=O.Iu(a.An,H.VM(new P.EX(0,w),[null]))
 u=J.UQ(y.t(z,b),"objects")
 y=J.U6(u)
+x=a.rM
 t=0
-while(!0){x=y.gB(u)
-if(typeof x!=="number")return H.s(x)
-if(!(t<x))break
-s=y.t(u,t)
-r=y.t(u,t+1)
-q=J.UQ(a.rM,r)
-for(;x=J.Wx(s),p=x.W(s,1),x.D(s,0);s=p){x=v.HW
+while(!0){s=y.gB(u)
+if(typeof s!=="number")return H.s(s)
+if(!(t<s))break
+r=y.t(u,t)
+q=x.t(0,y.t(u,t+1))
+for(;s=J.Wx(r),p=s.W(r,1),s.D(r,0);r=p){s=v.zE
 o=v.mS
-n=J.Qc(o)
-J.wp(J.Qd(x),o,n.g(o,4),q)
-v=new O.Qb(x,n.g(o,4))}t+=2}m=J.WB(w,a.dW)
+n=o+4
+C.mU.vg(J.Qd(s),o,n,q)
+v=new O.Hz(s,n)}t+=2}y=a.dW
+if(typeof y!=="number")return H.s(y)
+m=w+y
 while(!0){y=v.mS
-x=J.Wx(y)
-o=v.HW
-n=J.RE(o)
-l=J.bY(x.Z(y,4),n.gR(o))
-k=J.Ts(x.Z(y,4),n.gR(o))
-new P.hL(l,k).$builtinTypeInfo=[null]
-if(!J.u6(k,m))break
-l=$.eK()
-J.wp(n.gRn(o),y,x.g(y,4),l)
-v=new O.Qb(o,x.g(y,4))}y=J.Vf(a.hi)
+x=C.CD.cU(y,4)
+s=v.zE
+o=J.RE(s)
+n=o.gR(s)
+if(typeof n!=="number")return H.s(n)
+n=C.CD.Y(x,n)
+l=o.gR(s)
+if(typeof l!=="number")return H.s(l)
+l=C.CD.Z(x,l)
+new P.EX(n,l).$builtinTypeInfo=[null]
+if(!(l<m))break
+x=$.Sd()
+n=y+4
+C.mU.vg(o.gRn(s),y,n,x)
+v=new O.Hz(s,n)}y=J.uP(a.hi)
 x=a.An
-J.J4(y,x,0,0,0,w,J.YD(x),m)
-P.e4(new O.WQ(a,b),null)},"$1","guq",2,0,420,421,[],"_renderPages"],
-pA:[function(a,b){var z=a.Oh
+J.kZ(y,x,0,0,0,w,J.DO(x),m)
+P.Iw(new O.R5(a,b),null)},
+RF:[function(a,b){var z=a.oj
 if(z==null)return
-J.QP(z).cv("heapmap").ml(new O.aG(a)).OA(new O.aO()).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-YS:[function(a,b){P.e4(new O.oc(a),null)},"$1","gR2",2,0,169,242,[],"fragmentationChanged"],
-"@":function(){return[C.Cu]},
-static:{"^":"nK<-85,RD<-85,SoT<-85",pn:[function(a){var z,y,x,w,v,u,t
+J.aT(z).ox("heapmap").ml(new O.aG(a)).OA(new O.aO()).wM(b)},"$1","gvC",2,0,15,65],
+nY:[function(a,b){P.Iw(new O.aq(a),null)},"$1","gR2",2,0,15,34],
+static:{"^":"nK,fM,SoT",pn:function(a){var z,y,x,w,v,u,t
 z=P.Fl(null,null)
 y=P.Fl(null,null)
 x=P.Fl(null,null)
 w=$.Nd()
-v=P.Py(null,null,null,J.O,W.I0)
-u=J.O
-t=W.cv
-t=H.VM(new V.qC(P.Py(null,null,null,u,t),null,null),[u,t])
+v=P.YM(null,null,null,P.qU,W.I0)
+u=P.qU
+t=W.h4
+t=H.VM(new V.qC(P.YM(null,null,null,u,t),null,null),[u,t])
 a.rM=z
 a.Ge=y
 a.UL=x
-a.SO=w
-a.B7=v
-a.X0=t
+a.on=w
+a.BA=v
+a.LL=t
 C.pJ.ZL(a)
-C.pJ.oX(a)
-return a},null,null,0,0,115,"new HeapMapElement$created"]}},
-"+HeapMapElement":[422],
-waa:{
+C.pJ.XI(a)
+return a}}},
+cda:{
 "^":"uL+Pi;",
 $isd3:true},
-WQ:{
-"^":"Tp:115;a-85,b-326",
-$0:[function(){J.fi(this.a,J.WB(this.b,1))},"$0",null,0,0,115,"call"],
+R5:{
+"^":"Xs:47;a,b",
+$0:function(){J.fi(this.a,this.b+1)},
 $isEH:true},
-"+ WQ":[315],
 aG:{
-"^":"Tp:338;a-85",
-$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sOh(z,y.ct(z,C.QH,y.gOh(z),a))},"$1",null,2,0,338,423,[],"call"],
+"^":"Xs:97;a",
+$1:[function(a){var z=this.a
+z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-"+ aG":[315],
 aO:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
+"^":"Xs:50;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,98,"call"],
 $isEH:true},
-"+ aO":[315],
-oc:{
-"^":"Tp:115;a-85",
-$0:[function(){J.vP(this.a)},"$0",null,0,0,115,"call"],
-$isEH:true},
-"+ oc":[315]}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
+aq:{
+"^":"Xs:47;a",
+$0:function(){J.vP(this.a)},
+$isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
 "^":"",
-jY:{
-"^":["V4;GQ%-85,J0%-85,Oc%-85,CO%-85,nc%-425,Ol%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gLF:[function(a){return a.nc},null,null,1,0,426,"classTable",308,309],
-sLF:[function(a,b){a.nc=this.ct(a,C.M5,a.nc,b)},null,null,3,0,427,30,[],"classTable",308],
-gB1:[function(a){return a.Ol},null,null,1,0,337,"profile",308,311],
-sB1:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},null,null,3,0,338,30,[],"profile",308],
-i4:[function(a){var z,y
-Z.uL.prototype.i4.call(this,a)
+Ly:{
+"^":"waa;GQ,J0,JS,GM,Rp,Ol,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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)},
+q0:function(a){var z,y,x
+Z.uL.prototype.q0.call(this,a)
 z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
-y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.zV(J.UQ($.NR,"PieChart"),[z])
-a.J0=y
-y.bG.u(0,"title","New Space")
+y=P.L5(null,null,null,null,null)
+x=new G.qu(null,y)
+x.vR=P.zV(C.jN.t($.BY,"PieChart"),[z])
+a.J0=x
+y.u(0,"title","New Space")
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.zV(J.UQ($.NR,"PieChart"),[y])
-a.CO=z
-z.bG.u(0,"title","Old Space")
-this.uB(a)},"$0","gQd",0,0,126,"enteredView"],
-hZ:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o
+x=P.L5(null,null,null,null,null)
+z=new G.qu(null,x)
+z.vR=P.zV(C.jN.t($.BY,"PieChart"),[y])
+a.GM=z
+x.u(0,"title","Old Space")
+this.z5(a)},
+hZ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
 z=a.Ol
-if(z==null||!J.x(J.UQ(z,"members")).$isList||J.de(J.q8(J.UQ(a.Ol,"members")),0))return
-a.nc.lb()
-for(z=J.GP(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
+if(z==null||!J.x(J.UQ(z,"members")).$isWO||J.xC(J.q8(J.UQ(a.Ol,"members")),0))return
+a.Rp.B7()
+for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
 if(this.K1(a,y))continue
 x=J.UQ(y,"class")
-w=this.VI(a,y,1)
-v=this.VI(a,y,2)
-u=this.VI(a,y,3)
-t=this.VI(a,y,4)
-s=this.VI(a,y,5)
-r=this.VI(a,y,6)
-q=this.VI(a,y,7)
-p=this.VI(a,y,8)
-J.qK(a.nc,new G.Ni([x,w,v,u,t,s,r,q,p]))}J.Yl(a.nc)
-a.GQ.lb()
+w=this.zh(a,y,1)
+v=this.zh(a,y,2)
+u=this.zh(a,y,3)
+t=this.zh(a,y,4)
+s=this.zh(a,y,5)
+r=this.zh(a,y,6)
+q=this.zh(a,y,7)
+p=this.zh(a,y,8)
+J.Jr(a.Rp,new G.Ni([x,w,v,u,t,s,r,q,p]))}J.II(a.Rp)
+z=a.GQ.Yb
+z.K9("removeRows",[0,z.nQ("getNumberOfRows")])
 o=J.UQ(J.UQ(a.Ol,"heaps"),"new")
-z=J.U6(o)
-J.qK(a.GQ,["Used",z.t(o,"used")])
-J.qK(a.GQ,["Free",J.xH(z.t(o,"capacity"),z.t(o,"used"))])
-J.qK(a.GQ,["External",z.t(o,"external")])
-a.Oc.lb()
+z=a.GQ
+x=J.U6(o)
+w=x.t(o,"used")
+z=z.Yb
+v=[]
+C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
+z.K9("addRow",[H.VM(new P.Tz(v),[null])])
+v=a.GQ
+z=J.xH(x.t(o,"capacity"),x.t(o,"used"))
+v=v.Yb
+w=[]
+C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
+v.K9("addRow",[H.VM(new P.Tz(w),[null])])
+w=a.GQ
+x=x.t(o,"external")
+w=w.Yb
+v=[]
+C.Nm.FV(v,C.Nm.ez(["External",x],P.En()))
+w.K9("addRow",[H.VM(new P.Tz(v),[null])])
+v=a.JS.Yb
+v.K9("removeRows",[0,v.nQ("getNumberOfRows")])
 o=J.UQ(J.UQ(a.Ol,"heaps"),"old")
-z=J.U6(o)
-J.qK(a.Oc,["Used",z.t(o,"used")])
-J.qK(a.Oc,["Free",J.xH(z.t(o,"capacity"),z.t(o,"used"))])
-J.qK(a.Oc,["External",z.t(o,"external")])
-this.uB(a)},"$0","gYs",0,0,126,"_updateChartData"],
-uB:[function(a){var z=a.J0
+v=a.JS
+w=J.U6(o)
+x=w.t(o,"used")
+v=v.Yb
+z=[]
+C.Nm.FV(z,C.Nm.ez(["Used",x],P.En()))
+v.K9("addRow",[H.VM(new P.Tz(z),[null])])
+z=a.JS
+v=J.xH(w.t(o,"capacity"),w.t(o,"used"))
+z=z.Yb
+x=[]
+C.Nm.FV(x,C.Nm.ez(["Free",v],P.En()))
+z.K9("addRow",[H.VM(new P.Tz(x),[null])])
+x=a.JS
+w=w.t(o,"external")
+x=x.Yb
+z=[]
+C.Nm.FV(z,C.Nm.ez(["External",w],P.En()))
+x.K9("addRow",[H.VM(new P.Tz(z),[null])])
+this.z5(a)},
+z5:function(a){var z=a.J0
 if(z==null)return
-z.W2(a.GQ)
-a.CO.W2(a.Oc)},"$0","goI",0,0,126,"_draw"],
+z.Am(a.GQ)
+a.GM.Am(a.JS)},
 AE:[function(a,b,c,d){var z,y
-if(!!J.x(d).$isqk){z=a.nc.gxp()
+if(!!J.x(d).$isv6){z=a.Rp.gxp()
 y=d.cellIndex
-if(z==null?y!=null:z!==y){a.nc.sxp(y)
-J.Yl(a.nc)}}},"$3","gQq",6,0,428,21,[],351,[],82,[],"changeSort",309],
-K1:[function(a,b){var z,y,x
+if(z==null?y!=null:z!==y){a.Rp.sxp(y)
+J.II(a.Rp)}}},"$3","gQq",6,0,99,1,70,71],
+K1:function(a,b){var z,y,x
 z=J.U6(b)
 y=z.t(b,"new")
 x=z.t(b,"old")
-for(z=J.GP(y);z.G();)if(!J.de(z.gl(),0))return!1
-for(z=J.GP(x);z.G();)if(!J.de(z.gl(),0))return!1
-return!0},"$1","gbU",2,0,429,122,[],"_classHasNoAllocations"],
-VI:[function(a,b,c){var z
+for(z=J.mY(y);z.G();)if(!J.xC(z.gl(),0))return!1
+for(z=J.mY(x);z.G();)if(!J.xC(z.gl(),0))return!1
+return!0},
+zh:function(a,b,c){var z
 switch(c){case 0:return J.UQ(J.UQ(b,"class"),"user_name")
 case 1:return J.UQ(J.UQ(b,"new"),7)
 case 2:return J.UQ(J.UQ(b,"new"),6)
@@ -10271,159 +9554,144 @@
 case 7:z=J.U6(b)
 return J.WB(J.UQ(z.t(b,"old"),3),J.UQ(z.t(b,"old"),5))
 case 8:z=J.U6(b)
-return J.WB(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.hS())},"$2","gcY",4,0,430,122,[],15,[],"_combinedTableColumnValue"],
-pA:[function(a,b){var z=a.Ol
+return J.WB(J.UQ(z.t(b,"old"),2),J.UQ(z.t(b,"old"),4))}throw H.b(P.a9())},
+RF:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile").ml(new K.nx(a)).OA(new K.jm()).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-cQ:[function(a,b){var z=a.Ol
+J.aT(z).ox("/allocationprofile").ml(new K.Rx(a)).OA(new K.RM()).wM(b)},"$1","gvC",2,0,15,65],
+QH:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).YM(b)},"$1","gXM",2,0,169,339,[],"refreshGC"],
+J.aT(z).ox("/allocationprofile?gc=full").ml(new K.AN(a)).OA(new K.Ao()).wM(b)},"$1","gyW",2,0,15,65],
 eJ:[function(a,b){var z=a.Ol
 if(z==null)return
-J.QP(z).cv("/allocationprofile?reset=true").ml(new K.xj(a)).OA(new K.VB()).YM(b)},"$1","gNb",2,0,169,339,[],"resetAccumulator"],
+J.aT(z).ox("/allocationprofile?reset=true").ml(new K.ke(a)).OA(new K.xj()).wM(b)},"$1","gNb",2,0,15,65],
 pM:[function(a,b){var z,y,x,w
 try{this.hZ(a)}catch(x){w=H.Ru(x)
 z=w
-y=new H.XO(x,null)
-N.Jx("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
+y=new H.oP(x,null)
+N.QM("").To(H.d(z)+" "+H.d(y))}this.ct(a,C.Aq,[],this.gOd(a))
 this.ct(a,C.ST,[],this.goN(a))
-this.ct(a,C.WG,[],this.gJN(a))},"$1","gwm",2,0,169,242,[],"profileChanged"],
+this.ct(a,C.DS,[],this.gJN(a))},"$1","gd0",2,0,15,34],
 Ar:[function(a,b){var z,y,x
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
 x=J.UQ(J.UQ(z,"heaps"),y)
 z=J.U6(x)
-return C.CD.yM(J.FW(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,431,432,[],"formattedAverage",309],
-uW:[function(a,b){var z,y
+return C.CD.Sy(J.L9(J.vX(z.t(x,"time"),1000),z.t(x,"collections")),2)+" ms"},"$1","gOd",2,0,100,101],
+NC:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,431,432,[],"formattedCollections",309],
-Q0:[function(a,b){var z,y
+return H.d(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"collections"))},"$1","gJN",2,0,100,101],
+F9:[function(a,b){var z,y
 z=a.Ol
 if(z==null)return""
 y=b===!0?"new":"old"
-return J.Ez(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,431,432,[],"formattedTotalCollectionTime",309],
-Dd:[function(a){var z=new G.ig(P.zV(J.UQ($.NR,"DataTable"),null))
-a.GQ=z
-z.Gl("string","Type")
-a.GQ.Gl("number","Size")
-z=new G.ig(P.zV(J.UQ($.NR,"DataTable"),null))
-a.Oc=z
-z.Gl("string","Type")
-a.Oc.Gl("number","Size")
+return J.r0(J.UQ(J.UQ(J.UQ(z,"heaps"),y),"time"),2)+" secs"},"$1","goN",2,0,100,101],
+Zy:function(a){var z=P.zV(C.jN.t($.BY,"DataTable"),null)
+a.GQ=new G.Kf(z)
+z.K9("addColumn",["string","Type"])
+a.GQ.Yb.K9("addColumn",["number","Size"])
+z=P.zV(C.jN.t($.BY,"DataTable"),null)
+a.JS=new G.Kf(z)
+z.K9("addColumn",["string","Type"])
+a.JS.Yb.K9("addColumn",["number","Size"])
 z=H.VM([],[G.Ni])
-z=this.ct(a,C.M5,a.nc,new G.Vz([new G.Kt("Class",G.My()),new G.Kt("Accumulator Size (New)",G.AF()),new G.Kt("Accumulator (New)",G.Vj()),new G.Kt("Current Size (New)",G.AF()),new G.Kt("Current (New)",G.Vj()),new G.Kt("Accumulator Size (Old)",G.AF()),new G.Kt("Accumulator (Old)",G.Vj()),new G.Kt("Current Size (Old)",G.AF()),new G.Kt("Current (Old)",G.Vj())],z,[],0,!0,null,null))
-a.nc=z
-z.sxp(1)},null,null,0,0,115,"created"],
-"@":function(){return[C.dA]},
-static:{"^":"BO<-85,bQj<-85,xK<-85,V1g<-85,r1K<-85,qEV<-85,pC<-85,DY2<-85",Lz:[function(a){var z,y,x,w
+z=this.ct(a,C.kG,a.Rp,new G.Vz([new G.YA("Class",G.Tp()),new G.YA("Accumulator Size (New)",G.Gt()),new G.YA("Accumulator (New)",G.xo()),new G.YA("Current Size (New)",G.Gt()),new G.YA("Current (New)",G.xo()),new G.YA("Accumulator Size (Old)",G.Gt()),new G.YA("Accumulator (Old)",G.xo()),new G.YA("Current Size (Old)",G.Gt()),new G.YA("Current (Old)",G.xo())],z,[],0,!0,null,null))
+a.Rp=z
+z.sxp(1)},
+static:{"^":"IJv,bQj,kh,YU,r1K,d6,pC,DY2",le:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.Vc.ZL(a)
-C.Vc.oX(a)
-C.Vc.Dd(a)
-return a},null,null,0,0,115,"new HeapProfileElement$created"]}},
-"+HeapProfileElement":[433],
-V4:{
+C.Vc.XI(a)
+C.Vc.Zy(a)
+return a}}},
+waa:{
 "^":"uL+Pi;",
 $isd3:true},
-nx:{
-"^":"Tp:338;a-85",
-$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,338,423,[],"call"],
+Rx:{
+"^":"Xs:97;a",
+$1:[function(a){var z=this.a
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-"+ nx":[315],
-jm:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
+RM:{
+"^":"Xs:50;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,98,"call"],
 $isEH:true},
-"+ jm":[315],
 AN:{
-"^":"Tp:338;a-85",
-$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,338,423,[],"call"],
+"^":"Xs:97;a",
+$1:[function(a){var z=this.a
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
-"+ AN":[315],
 Ao:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
+"^":"Xs:50;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,98,"call"],
 $isEH:true},
-"+ Ao":[315],
+ke:{
+"^":"Xs:97;a",
+$1:[function(a){var z=this.a
+z.Ol=J.Q5(z,C.vb,z.Ol,a)},"$1",null,2,0,null,96,"call"],
+$isEH:true},
 xj:{
-"^":"Tp:338;a-85",
-$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.sOl(z,y.ct(z,C.vb,y.gOl(z),a))},"$1",null,2,0,338,423,[],"call"],
-$isEH:true},
-"+ xj":[315],
-VB:{
-"^":"Tp:300;",
-$2:[function(a,b){N.Jx("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,300,21,[],424,[],"call"],
-$isEH:true},
-"+ VB":[315]}],["html_common","dart:html_common",,P,{
+"^":"Xs:50;",
+$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,98,"call"],
+$isEH:true}}],["html_common","dart:html_common",,P,{
 "^":"",
-bL:[function(a){var z,y
+bL:function(a){var z,y
 z=[]
-y=new P.Tm(new P.aI([],z),new P.rG(z),new P.yh(z)).$1(a)
-new P.wO().$0()
-return y},"$1","Lq",2,0,null,30,[]],
-o7:[function(a,b){var z=[]
-return new P.xL(b,new P.CA([],z),new P.YL(z),new P.KC(z)).$1(a)},"$2$mustCopy","A1",2,3,null,223,6,[],251,[]],
-f9:[function(a){var z,y
+y=new P.Kk(new P.wF([],z),new P.rG(z),new P.rM(z)).$1(a)
+new P.Qa().$0()
+return y},
+o7:function(a,b){var z=[]
+return new P.xL(b,new P.CA([],z),new P.D6(z),new P.KC(z)).$1(a)},
+J3:function(a){var z,y
 z=J.x(a)
 if(!!z.$isSg){y=z.gRn(a)
 if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.qS(a.data,a.height,a.width)},"$1","D3",2,0,null,252,[]],
-QO:[function(a){if(!!J.x(a).$isqS)return{data:a.Rn,height:a.fg,width:a.R}
-return a},"$1","Gg",2,0,null,253,[]],
-dg:function(){var z=$.L4
-if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
-$.L4=z}return z},
+y.BYTES_PER_ELEMENT=1}return a}return new P.nl(a.data,a.height,a.width)},
+QO:function(a){if(!!J.x(a).$isnl)return{data:a.Rn,height:a.fg,width:a.R}
+return a},
 F7:function(){var z=$.PN
-if(z==null){z=P.dg()!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
+if(z==null){z=$.Qz
+if(z==null){z=J.Vw(window.navigator.userAgent,"Opera",0)
+$.Qz=z}z=z!==!0&&J.Vw(window.navigator.userAgent,"WebKit",0)
 $.PN=z}return z},
-aI:{
-"^":"Tp:200;b,c",
-$1:[function(a){var z,y,x
+wF:{
+"^":"Xs:24;b,c",
+$1:function(a){var z,y,x
 z=this.b
 y=z.length
 for(x=0;x<y;++x)if(z[x]===a)return x
 z.push(a)
 this.c.push(null)
-return y},"$1",null,2,0,null,30,[],"call"],
+return y},
 $isEH:true},
 rG:{
-"^":"Tp:363;d",
-$1:[function(a){var z=this.d
+"^":"Xs:102;d",
+$1:function(a){var z=this.d
 if(a>=z.length)return H.e(z,a)
-return z[a]},"$1",null,2,0,null,334,[],"call"],
+return z[a]},
 $isEH:true},
-yh:{
-"^":"Tp:434;e",
-$2:[function(a,b){var z=this.e
+rM:{
+"^":"Xs:103;e",
+$2:function(a,b){var z=this.e
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"$2",null,4,0,null,334,[],28,[],"call"],
+z[a]=b},
 $isEH:true},
-wO:{
-"^":"Tp:115;",
-$0:[function(){},"$0",null,0,0,null,"call"],
+Qa:{
+"^":"Xs:47;",
+$0:function(){},
 $isEH:true},
-Tm:{
-"^":"Tp:116;f,UI,bK",
-$1:[function(a){var z,y,x,w,v,u
+Kk:{
+"^":"Xs:30;f,UI,bK",
+$1:function(a){var z,y,x,w,v,u
 z={}
 if(a==null)return a
 if(typeof a==="boolean")return a
@@ -10431,11 +9699,11 @@
 if(typeof a==="string")return a
 y=J.x(a)
 if(!!y.$isiP)return new Date(a.y3)
-if(!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
+if(!!y.$iswL)throw H.b(P.SY("structured clone of RegExp"))
 if(!!y.$ishH)return a
-if(!!y.$isAz)return a
+if(!!y.$isO4)return a
 if(!!y.$isSg)return a
-if(!!y.$isWZ)return a
+if(!!y.$isD8)return a
 if(!!y.$ispF)return a
 if(!!y.$isZ0){x=this.f.$1(a)
 w=this.UI.$1(x)
@@ -10444,48 +9712,46 @@
 w={}
 z.a=w
 this.bK.$2(x,w)
-y.aN(a,new P.ib(z,this))
-return z.a}if(!!y.$isList){v=y.gB(a)
+y.aN(a,new P.q1(z,this))
+return z.a}if(!!y.$isWO){v=y.gB(a)
 x=this.f.$1(a)
 w=this.UI.$1(x)
 if(w!=null){if(!0===w){w=new Array(v)
 this.bK.$2(x,w)}return w}w=new Array(v)
 this.bK.$2(x,w)
-if(typeof v!=="number")return H.s(v)
-u=0
-for(;u<v;++u){z=this.$1(y.t(a,u))
+for(u=0;u<v;++u){z=this.$1(y.t(a,u))
 if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},"$1",null,2,0,null,21,[],"call"],
+w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
 $isEH:true},
-ib:{
-"^":"Tp:300;a,Gq",
-$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,49,[],30,[],"call"],
+q1:{
+"^":"Xs:50;a,Gq",
+$2:function(a,b){this.a.a[a]=this.Gq.$1(b)},
 $isEH:true},
 CA:{
-"^":"Tp:200;a,b",
-$1:[function(a){var z,y,x,w
+"^":"Xs:24;a,b",
+$1:function(a){var z,y,x,w
 z=this.a
 y=z.length
 for(x=0;x<y;++x){w=z[x]
 if(w==null?a==null:w===a)return x}z.push(a)
 this.b.push(null)
-return y},"$1",null,2,0,null,30,[],"call"],
+return y},
 $isEH:true},
-YL:{
-"^":"Tp:363;c",
-$1:[function(a){var z=this.c
+D6:{
+"^":"Xs:102;c",
+$1:function(a){var z=this.c
 if(a>=z.length)return H.e(z,a)
-return z[a]},"$1",null,2,0,null,334,[],"call"],
+return z[a]},
 $isEH:true},
 KC:{
-"^":"Tp:434;d",
-$2:[function(a,b){var z=this.d
+"^":"Xs:103;d",
+$2:function(a,b){var z=this.d
 if(a>=z.length)return H.e(z,a)
-z[a]=b},"$2",null,4,0,null,334,[],28,[],"call"],
+z[a]=b},
 $isEH:true},
 xL:{
-"^":"Tp:116;e,f,UI,bK",
-$1:[function(a){var z,y,x,w,v,u,t
+"^":"Xs:30;e,f,UI,bK",
+$1:function(a){var z,y,x,w,v,u,t
 if(a==null)return a
 if(typeof a==="boolean")return a
 if(typeof a==="number")return a
@@ -10509,41 +9775,31 @@
 u=J.w1(y)
 t=0
 for(;t<v;++t)u.u(y,t,this.$1(x.t(a,t)))
-return y}return a},"$1",null,2,0,null,21,[],"call"],
+return y}return a},
 $isEH:true},
-qS:{
+nl:{
 "^":"a;Rn>,fg>,R>",
-$isqS:true,
+$isnl:true,
 $isSg:true},
-As:{
+As3:{
 "^":"a;",
 bu:function(a){return this.lF().zV(0," ")},
-O4:function(a,b){var z,y
-z=this.lF()
-if(!z.tg(0,a)){z.h(0,a)
-y=!0}else{z.Rz(0,a)
-y=!1}this.p5(z)
-return y},
-qU:function(a){return this.O4(a,null)},
 gA:function(a){var z=this.lF()
 z=H.VM(new P.zQ(z,z.zN,null,null),[null])
 z.zq=z.O2.H9
 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.K1(z,b,H.ip(z,"mW",0),null)},"$1","gIr",2,0,435,128,[]],
-ev:function(a,b){var z=this.lF()
-return H.VM(new H.U5(z,b),[H.ip(z,"mW",0)])},
-Ft:[function(a,b){var z=this.lF()
-return H.VM(new H.kV(z,b),[H.ip(z,"mW",0),null])},"$1","git",2,0,436,128,[]],
+ez:[function(a,b){return this.lF().ez(0,b)},"$1","gIr",2,0,104,46],
+ev:function(a,b){return this.lF().ev(0,b)},
+Ft:[function(a,b){return this.lF().Ft(0,b)},"$1","git",2,0,105,46],
 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},
 tg:function(a,b){return this.lF().tg(0,b)},
-hV:function(a){return this.lF().tg(0,a)?a:null},
-h:function(a,b){return this.OS(new P.GE(b))},
+iQ:function(a){return this.lF().tg(0,a)?a:null},
+h:function(a,b){return this.OS(new P.Fe(b))},
 Rz:function(a,b){var z,y
 z=this.lF()
 y=z.Rz(0,b)
@@ -10555,755 +9811,790 @@
 return z.gGc()},
 tt:function(a,b){return this.lF().tt(0,b)},
 br:function(a){return this.tt(a,!0)},
-eR:function(a,b){var z=this.lF()
-return H.ke(z,b,H.ip(z,"mW",0))},
-Zv:function(a,b){return this.lF().Zv(0,b)},
 V1:function(a){this.OS(new P.uQ())},
 OS:function(a){var z,y
 z=this.lF()
 y=a.$1(z)
 this.p5(z)
 return y},
-$isz5:true,
-$asz5:function(){return[J.O]},
 $isyN:true,
-$isQV:true,
-$asQV:function(){return[J.O]}},
-GE:{
-"^":"Tp:116;a",
-$1:[function(a){return a.h(0,this.a)},"$1",null,2,0,null,94,[],"call"],
+$iscX:true,
+$ascX:function(){return[P.qU]}},
+Fe:{
+"^":"Xs:30;a",
+$1:function(a){return a.h(0,this.a)},
 $isEH:true},
 rl:{
-"^":"Tp:116;a",
-$1:[function(a){return a.FV(0,this.a)},"$1",null,2,0,null,94,[],"call"],
+"^":"Xs:30;a",
+$1:function(a){return a.FV(0,this.a)},
 $isEH:true},
 uQ:{
-"^":"Tp:116;",
-$1:[function(a){return a.V1(0)},"$1",null,2,0,null,94,[],"call"],
+"^":"Xs:30;",
+$1:function(a){return a.V1(0)},
 $isEH:true},
 D7:{
-"^":"ar;ndS,h2",
-gzT:function(){var z=this.h2
-return P.F(z.ev(z,new P.hT()),!0,W.cv)},
-aN:function(a,b){H.bQ(this.gzT(),b)},
-u:function(a,b,c){var z=this.gzT()
+"^":"rm;NJ,iz",
+gye:function(){var z=this.iz
+return P.F(z.ev(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()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.ZP(z[b],c)},
-sB:function(a,b){var z,y
-z=this.gzT().length
-y=J.Wx(b)
-if(y.F(b,z))return
-else if(y.C(b,0))throw H.b(P.u("Invalid list length"))
+J.Bj(z[b],c)},
+sB:function(a,b){var z=this.gye().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.h2.NL.appendChild(b)},
+h:function(a,b){this.iz.NL.appendChild(b)},
 FV:function(a,b){var z,y
-for(z=J.GP(b),y=this.h2.NL;z.G();)y.appendChild(z.gl())},
+for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.iz.NL;z.G();)y.appendChild(z.lo)},
 tg:function(a,b){return!1},
-GT:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
-np:function(a){return this.GT(a,null)},
+XP:function(a,b){throw H.b(P.f("Cannot sort filtered list"))},
+Jd:function(a){return this.XP(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.D6(this.gzT(),b,c),new P.GS())},
-V1:function(a){J.r4(this.h2.NL)},
-xe:function(a,b,c){this.h2.xe(0,b,c)},
-oF:function(a,b,c){var z,y
-z=this.h2.NL
+vg: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)},
+aP:function(a,b,c){this.iz.aP(0,b,c)},
+UG:function(a,b,c){var z,y
+z=this.iz.NL
 y=z.childNodes
 if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
-Rz:function(a,b){return!1},
-gB:function(a){return this.gzT().length},
-t:function(a,b){var z=this.gzT()
+J.Qk(z,c,y[b])},
+gB:function(a){return this.gye().length},
+t:function(a,b){var z=this.gye()
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 return z[b]},
-gA:function(a){var z=this.gzT()
+gA:function(a){var z=this.gye()
 return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
 hT:{
-"^":"Tp:116;",
-$1:[function(a){return!!J.x(a).$iscv},"$1",null,2,0,null,211,[],"call"],
+"^":"Xs:30;",
+$1:function(a){return!!J.x(a).$ish4},
 $isEH:true},
 GS:{
-"^":"Tp:116;",
-$1:[function(a){return J.QC(a)},"$1",null,2,0,null,295,[],"call"],
+"^":"Xs:30;",
+$1:function(a){return J.wp(a)},
 $isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
 "^":"",
 pR:{
-"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gD5:[function(a){var z=a.tY
-if(z!=null)if(J.de(z.gzS(),"Null"))if(J.de(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
-else if(J.de(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
-else if(J.de(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
-else if(J.de(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
-else if(J.de(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gD5.call(this,a)},null,null,1,0,312,"hoverText"],
-Qx:[function(a){return this.gus(a)},"$0","gyX",0,0,115,"expander"],
-vQ:[function(a,b,c){var z,y
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gJp:function(a){var z=a.tY
+if(z!=null)if(J.xC(z.gzS(),"Null"))if(J.xC(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
+else if(J.xC(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
+else if(J.xC(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
+else if(J.xC(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
+else if(J.xC(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
+return Q.xI.prototype.gJp.call(this,a)},
+Qx:[function(a){return this.gNe(a)},"$0","gyX",0,0,47],
+SF:[function(a,b,c){var z,y
 z=a.tY
-if(b===!0)J.am(z).ml(new B.Js(a)).YM(c)
+if(b===!0)J.LE(z).ml(new B.qB(a)).wM(c)
 else{y=J.w1(z)
 y.u(z,"fields",null)
 y.u(z,"elements",null)
-c.$0()}},"$2","gus",4,0,437,438,[],339,[],"expandEvent"],
-"@":function(){return[C.VW]},
-static:{lu:[function(a){var z,y,x,w
+c.$0()}},"$2","gNe",4,0,106,107,65],
+static:{lu:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.cp.ZL(a)
-C.cp.oX(a)
-return a},null,null,0,0,115,"new InstanceRefElement$created"]}},
-"+InstanceRefElement":[342],
-Js:{
-"^":"Tp:116;a-85",
+a.on=z
+a.BA=y
+a.LL=w
+C.EL.ZL(a)
+C.EL.XI(a)
+return a}}},
+qB:{
+"^":"Xs:30;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.szz(z.t(a,"valueAsString"))}z=this.a
 y=J.RE(z)
-y.stY(z,y.ct(z,C.kY,y.gtY(z),a))
-y.ct(z,C.kY,0,1)},"$1",null,2,0,116,57,[],"call"],
-$isEH:true},
-"+ Js":[315]}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
+z.tY=y.ct(z,C.xP,z.tY,a)
+y.ct(z,C.xP,0,1)},"$1",null,2,0,null,93,"call"],
+$isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
 "^":"",
 hx:{
-"^":["V9;Xh%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gQr:[function(a){return a.Xh},null,null,1,0,337,"instance",308,311],
-sQr:[function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},null,null,3,0,338,30,[],"instance",308],
-vV:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
-Xe:[function(a,b){return J.QP(a.Xh).cv(J.WB(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,343,344,[],"retainedSize"],
-pA:[function(a,b){J.am(a.Xh).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.qlk]},
-static:{Co:[function(a){var z,y,x,w
+"^":"V3;Xh,f2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+ghf:function(a){return a.Xh},
+shf:function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},
+gIi:function(a){return a.f2},
+sIi:function(a,b){a.f2=this.ct(a,C.XM,a.f2,b)},
+vV:[function(a,b){return J.aT(a.Xh).ox(J.WB(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZ2",2,0,66,67],
+S1:[function(a,b){return J.aT(a.Xh).ox(J.WB(J.F8(a.Xh),"/retained"))},"$1","ghN",2,0,108,68],
+ee:[function(a,b){return J.aT(a.Xh).ox(J.WB(J.F8(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,108,86],
+RF:[function(a,b){J.LE(a.Xh).wM(b)},"$1","gvC",2,0,15,65],
+static:{BN:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.pU.ZL(a)
-C.pU.oX(a)
-return a},null,null,0,0,115,"new InstanceViewElement$created"]}},
-"+InstanceViewElement":[439],
-V9:{
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.yd.ZL(a)
+C.yd.XI(a)
+return a}}},
+V3:{
 "^":"uL+Pi;",
-$isd3:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
+$isd3:true},
+cL:{
+"^":"Xs:94;a",
+$1:[function(a){var z=this.a
+z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,60,"call"],
+$isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
+"^":"",
+L4:{
+"^":"V5;PM,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gkm:function(a){return a.PM},
+skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
+RF:[function(a,b){J.LE(a.PM).wM(b)},"$1","gvC",2,0,15,65],
+static:{p4:function(a){var z,y,x,w
+z=$.Nd()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.wd.ZL(a)
+C.wd.XI(a)
+return a}}},
+V5:{
+"^":"uL+Pi;",
+$isd3:true},
+mO:{
+"^":"V8;Cr,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gjx:function(a){return a.Cr},
+sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
+RF:[function(a,b){J.LE(a.Cr).wM(b)},"$1","gvC",2,0,15,65],
+static:{Ch:function(a){var z,y,x,w
+z=$.Nd()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.Ie.ZL(a)
+C.Ie.XI(a)
+return a}}},
+V8:{
+"^":"uL+Pi;",
+$isd3:true},
+DE:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{oB:function(a){var z,y,x,w
+z=$.Nd()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.Ig.ZL(a)
+C.Ig.XI(a)
+return a}}},
+U1:{
+"^":"V10;yR,mZ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gql:function(a){return a.yR},
+sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
+RF:[function(a,b){J.LE(a.yR).wM(b)},"$1","gvC",2,0,15,65],
+TY:[function(a){J.LE(a.yR).wM(new E.XB(a))},"$0","gW6",0,0,13],
+q0:function(a){Z.uL.prototype.q0.call(this,a)
+a.mZ=P.ww(P.ii(0,0,0,0,0,1),this.gW6(a))},
+Nz:function(a){var z
+Z.uL.prototype.Nz.call(this,a)
+z=a.mZ
+if(z!=null){z.ed()
+a.mZ=null}},
+static:{hm:function(a){var z,y,x,w
+z=$.Nd()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.NK.ZL(a)
+C.NK.XI(a)
+return a}}},
+V10:{
+"^":"uL+Pi;",
+$isd3:true},
+XB:{
+"^":"Xs:47;a",
+$0:[function(){var z=this.a
+if(z.mZ!=null)z.mZ=P.ww(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
+$isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
 "^":"",
 Se:{
-"^":["Y2;B1>,SF<-440,H<-440,Zn@-305,vs@-305,ki@-305,Vh@-305,LH@-305,eT,yt-326,wd-327,oH-328,R7,aZ,cp,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,null,null,null,null],
-gtT:[function(a){return J.on(this.H)},null,null,1,0,346,"code",308],
-C4:function(a){var z,y,x,w,v,u,t,s,r
+"^":"Y2;B1>,YK,H,Zn<,vs<,ki<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
+gtT:function(a){return J.on(this.H)},
+C4:function(a){var z,y,x,w,v,u,t,s
 z=this.B1
 y=J.UQ(z,"threshold")
-x=this.wd
-w=J.U6(x)
-if(J.z8(w.gB(x),0))return
-for(v=this.H,u=J.GP(J.uw(v)),t=this.SF;u.G();){s=u.gl()
-r=J.FW(s.gAv(),v.gAv())
+x=this.ks
+if(x.length>0)return
+for(w=this.H,v=J.mY(J.oe(w)),u=this.YK;v.G();){t=v.gl()
+s=J.L9(t.gAv(),w.gAv())
 if(typeof y!=="number")return H.s(y)
-if(!(r>y||J.FW(J.on(s).gDu(),t.gAv())>y))continue
-w.h(x,X.SJ(z,t,s,this))}},
-o8:function(){},
-Nh:function(){return J.z8(J.q8(J.uw(this.H)),0)},
+if(!(s>y||J.L9(J.on(t).gDu(),u.Av)>y))continue
+x.push(X.SJ(z,u,t,this))}},
+cO:function(){},
+Nh:function(){return J.q8(J.oe(this.H))>0},
 mW:function(a,b,c,d){var z,y
 z=this.H
 this.Vh=H.d(z.gAv())
-this.LH=G.P0(J.FW(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.de(J.Iz(y.gtT(z)),C.oA)){this.Zn="Tag (category)"
-if(d==null)this.vs=G.G0(z.gAv(),this.SF.gAv())
-else this.vs=G.G0(z.gAv(),d.H.gAv())
-this.ki=G.G0(z.gAv(),this.SF.gAv())}else{if(J.de(J.Iz(y.gtT(z)),C.WA)||J.de(J.Iz(y.gtT(z)),C.yP))this.Zn="Garbage Collected Code"
+if(J.xC(J.Iz(y.gtT(z)),C.Z7)){this.Zn="Tag (category)"
+if(d==null)this.vs=G.dj(z.gAv(),this.YK.Av)
+else this.vs=G.dj(z.gAv(),d.H.gAv())
+this.ki=G.dj(z.gAv(),this.YK.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.G0(z.gAv(),this.SF.gAv())
-else this.vs=G.G0(z.gAv(),d.H.gAv())
-this.ki=G.G0(y.gtT(z).gDu(),this.SF.gAv())}z=this.oH
-y=J.w1(z)
-y.h(z,this.vs)
-y.h(z,this.ki)},
+if(d==null)this.vs=G.dj(z.gAv(),this.YK.Av)
+else this.vs=G.dj(z.gAv(),d.H.gAv())
+this.ki=G.dj(y.gtT(z).gDu(),this.YK.Av)}z=this.oH
+z.push(this.vs)
+z.push(this.ki)},
 static:{SJ:function(a,b,c,d){var z,y
 z=H.VM([],[G.Y2])
-y=d!=null?J.WB(d.yt,1):0
+y=d!=null?d.yt+1:0
 z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192","cursor: pointer;",!1,null,null)
 z.k7(d)
 z.mW(a,b,c,d)
 return z}}},
-E7:{
-"^":["V10;pD%-336,zt%-304,eH%-305,NT%-305,Xv%-305,M5%-305,ik%-305,jS%-305,XX%-441,BJ%-305,qO=-85,Hm%-442,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gB1:[function(a){return a.pD},null,null,1,0,337,"profile",308,311],
-sB1:[function(a,b){a.pD=this.ct(a,C.vb,a.pD,b)},null,null,3,0,338,30,[],"profile",308],
-gPL:[function(a){return a.zt},null,null,1,0,307,"hideTagsChecked",308,309],
-sPL:[function(a,b){a.zt=this.ct(a,C.lb,a.zt,b)},null,null,3,0,310,30,[],"hideTagsChecked",308],
-gEW:[function(a){return a.eH},null,null,1,0,312,"sampleCount",308,309],
-sEW:[function(a,b){a.eH=this.ct(a,C.XU,a.eH,b)},null,null,3,0,32,30,[],"sampleCount",308],
-gUo:[function(a){return a.NT},null,null,1,0,312,"refreshTime",308,309],
-sUo:[function(a,b){a.NT=this.ct(a,C.Dj,a.NT,b)},null,null,3,0,32,30,[],"refreshTime",308],
-gEly:[function(a){return a.Xv},null,null,1,0,312,"sampleRate",308,309],
-sEly:[function(a,b){a.Xv=this.ct(a,C.mI,a.Xv,b)},null,null,3,0,32,30,[],"sampleRate",308],
-gIZ:[function(a){return a.M5},null,null,1,0,312,"sampleDepth",308,309],
-sIZ:[function(a,b){a.M5=this.ct(a,C.bE,a.M5,b)},null,null,3,0,32,30,[],"sampleDepth",308],
-gNG:[function(a){return a.ik},null,null,1,0,312,"displayCutoff",308,309],
-sNG:[function(a,b){a.ik=this.ct(a,C.aH,a.ik,b)},null,null,3,0,32,30,[],"displayCutoff",308],
-gQl:[function(a){return a.jS},null,null,1,0,312,"timeSpan",308,309],
-sQl:[function(a,b){a.jS=this.ct(a,C.zz,a.jS,b)},null,null,3,0,32,30,[],"timeSpan",308],
-gib:[function(a){return a.BJ},null,null,1,0,312,"tagSelector",308,309],
-sib:[function(a,b){a.BJ=this.ct(a,C.TW,a.BJ,b)},null,null,3,0,32,30,[],"tagSelector",308],
-pM:[function(a,b){var z,y,x,w
-z=a.pD
+kK:{
+"^":"V11;ix,fv,y7,MQ,Jy,Cv,zo,xO,XX,Kn,EX,Hm=,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gB1:function(a){return a.ix},
+sB1:function(a,b){a.ix=this.ct(a,C.vb,a.ix,b)},
+gPL:function(a){return a.fv},
+sPL:function(a,b){a.fv=this.ct(a,C.He,a.fv,b)},
+gLW:function(a){return a.y7},
+sLW:function(a,b){a.y7=this.ct(a,C.Gs,a.y7,b)},
+gUo:function(a){return a.MQ},
+sUo:function(a,b){a.MQ=this.ct(a,C.Dj,a.MQ,b)},
+gEl:function(a){return a.Jy},
+sEl:function(a,b){a.Jy=this.ct(a,C.YD,a.Jy,b)},
+gnZ:function(a){return a.Cv},
+snZ:function(a,b){a.Cv=this.ct(a,C.bE,a.Cv,b)},
+gNG:function(a){return a.zo},
+sNG:function(a,b){a.zo=this.ct(a,C.aH,a.zo,b)},
+gQl:function(a){return a.xO},
+sQl:function(a,b){a.xO=this.ct(a,C.zz,a.xO,b)},
+gZA:function(a){return a.Kn},
+sZA:function(a,b){a.Kn=this.ct(a,C.TW,a.Kn,b)},
+pM:[function(a,b){var z,y,x,w,v
+z=a.ix
 if(z==null)return
 y=J.UQ(z,"samples")
 x=new P.iP(Date.now(),!1)
 x.EK()
 z=J.AG(y)
-a.eH=this.ct(a,C.XU,a.eH,z)
+a.y7=this.ct(a,C.Gs,a.y7,z)
 z=x.bu(0)
-a.NT=this.ct(a,C.Dj,a.NT,z)
-z=J.AG(J.UQ(a.pD,"depth"))
-a.M5=this.ct(a,C.bE,a.M5,z)
-w=J.UQ(a.pD,"period")
+a.MQ=this.ct(a,C.Dj,a.MQ,z)
+z=J.AG(J.UQ(a.ix,"depth"))
+a.Cv=this.ct(a,C.bE,a.Cv,z)
+w=J.UQ(a.ix,"period")
 if(typeof w!=="number")return H.s(w)
-z=C.CD.yM(1000000/w,0)
-a.Xv=this.ct(a,C.mI,a.Xv,z)
-z=G.mG(J.UQ(a.pD,"timeSpan"))
-a.jS=this.ct(a,C.zz,a.jS,z)
-z=J.AG(J.vX(a.XX,100))+"%"
-a.ik=this.ct(a,C.aH,a.ik,z)
-J.QP(a.pD).N3(a.pD)
-J.kW(a.pD,"threshold",a.XX)
-this.Cx(a)},"$1","gwm",2,0,169,242,[],"profileChanged"],
-i4:[function(a){var z=R.Jk([])
+z=C.CD.Sy(1000000/w,0)
+a.Jy=this.ct(a,C.YD,a.Jy,z)
+z=G.mG(J.UQ(a.ix,"timeSpan"))
+a.xO=this.ct(a,C.zz,a.xO,z)
+z=a.XX
+v=C.ON.bu(z*100)+"%"
+a.zo=this.ct(a,C.aH,a.zo,v)
+J.aT(a.ix).N3(a.ix)
+J.kW(a.ix,"threshold",z)
+this.Dq(a)},"$1","gd0",2,0,15,34],
+q0:function(a){var z=R.tB([])
 a.Hm=new G.XN(z,null,null)
-this.Cx(a)},"$0","gQd",0,0,126,"enteredView"],
-m5:[function(a,b){this.pA(a,null)},"$1","gpi",2,0,169,242,[],"tagSelectorChanged"],
-pA:[function(a,b){var z="profile?tags="+H.d(a.BJ)
-J.QP(a.pD).cv(z).ml(new X.SV(a)).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-Cx:[function(a){if(a.pD==null)return
-this.EX(a)},"$0","gBn",0,0,126,"_update"],
-EX:[function(a){var z,y,x,w,v
-z=J.QP(a.pD).gBC()
+this.Dq(a)},
+m5:[function(a,b){this.RF(a,null)},"$1","gb6",2,0,15,34],
+RF:[function(a,b){var z="profile?tags="+H.d(a.Kn)
+J.aT(a.ix).ox(z).ml(new X.Xy(a)).wM(b)},"$1","gvC",2,0,15,65],
+Dq:function(a){if(a.ix==null)return
+this.a8(a)},
+a8:function(a){var z,y,x,w,v,u,t
+z=J.aT(a.ix).gBC()
 if(z==null)return
-try{a.Hm.rT(X.SJ(a.pD,z,z,null))}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-N.Jx("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},"$0","gzo",0,0,126,"_buildStackTree"],
-ba:[function(a){this.EX(a)},"$0","gvr",0,0,126,"_buildTree"],
-ka:[function(a,b){return"padding-left: "+H.d(J.vX(b.gyt(),16))+"px;"},"$1","gU0",2,0,443,331,[],"padding",309],
-ZZ:[function(a,b){var z=J.bY(J.xH(b.gyt(),1),9)
-if(z>>>0!==z||z>=9)return H.e(C.Ym,z)
-return C.Ym[z]},"$1","gth",2,0,443,331,[],"coloring",309],
-YF:[function(a,b,c,d){var z,y,x,w,v,u
-w=J.RE(b)
-if(!J.de(J.F8(w.gN(b)),"expand")&&!J.de(w.gN(b),d))return
-z=J.u3(d)
-if(!!J.x(z).$isqp)try{w=a.Hm
-v=J.Bx(z)
-if(typeof v!=="number")return v.W()
-w.qU(v-1)}catch(u){w=H.Ru(u)
+try{w=a.Hm
+v=X.SJ(a.ix,z,z,null)
+w=w.WT
+u=J.w1(w)
+u.V1(w)
+v.C4(0)
+u.FV(w,v.ks)}catch(t){w=H.Ru(t)
 y=w
-x=new H.XO(u,null)
-N.Jx("").xH("toggleExpanded",y,x)}},"$3","gpR",6,0,428,21,[],351,[],82,[],"toggleExpanded",309],
-"@":function(){return[C.jR]},
-static:{"^":"B6<-85",jD:[function(a){var z,y,x,w
+x=new H.oP(t,null)
+N.QM("").xH("_buildStackTree",y,x)}this.ct(a,C.ep,null,a.Hm)},
+ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,109,62],
+LZ:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,109,62],
+YF:[function(a,b,c,d){var z,y,x,w,v,u,t,s
+w=J.RE(b)
+if(!J.xC(J.F8(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()
+u=w.WT
+t=J.U6(u)
+z=t.t(u,v-1)
+if(z.r8()===!0)t.UG(u,t.u8(u,z)+1,J.oe(z))
+else w.FS(z)}catch(s){w=H.Ru(s)
+y=w
+x=new H.oP(s,null)
+N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,99,1,70,71],
+static:{"^":"B6",os:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.eH=""
-a.NT=""
-a.Xv=""
-a.M5=""
-a.ik=""
-a.jS=""
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.y7=""
+a.MQ=""
+a.Jy=""
+a.Cv=""
+a.zo=""
+a.xO=""
 a.XX=0.0002
-a.BJ="uv"
-a.qO="#tableTree"
-a.SO=z
-a.B7=y
-a.X0=w
-C.kS.ZL(a)
-C.kS.oX(a)
-return a},null,null,0,0,115,"new IsolateProfileElement$created"]}},
-"+IsolateProfileElement":[444],
-V10:{
-"^":"uL+Pi;",
-$isd3:true},
-SV:{
-"^":"Tp:338;a-85",
-$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-y.spD(z,y.ct(z,C.vb,y.gpD(z),a))},"$1",null,2,0,338,202,[],"call"],
-$isEH:true},
-"+ SV":[315]}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
-"^":"",
-oO:{
-"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.j6]},
-static:{Zgg:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.LN.ZL(a)
-C.LN.oX(a)
-return a},null,null,0,0,115,"new IsolateRefElement$created"]}},
-"+IsolateRefElement":[342]}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
-"^":"",
-Stq:{
-"^":["V11;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
-"@":function(){return[C.aM]},
-static:{N5:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.Qt.ZL(a)
-C.Qt.oX(a)
-return a},null,null,0,0,115,"new IsolateSummaryElement$created"]}},
-"+IsolateSummaryElement":[446],
+a.Kn="uv"
+a.EX="#tableTree"
+a.on=z
+a.BA=y
+a.LL=w
+C.bb.ZL(a)
+C.bb.XI(a)
+return a}}},
 V11:{
 "^":"uL+Pi;",
 $isd3:true},
-IWF:{
-"^":["V12;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
-TJ:[function(a,b){return a.Pw.cv("debug/pause").ml(new D.GG(a))},"$1","gAK",2,0,447,117,[],"pause"],
-nY:[function(a,b){return a.Pw.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,447,117,[],"resume"],
-"@":function(){return[C.Xuf]},
-static:{dm:[function(a){var z,y,x,w
+Xy:{
+"^":"Xs:97;a",
+$1:[function(a){var z=this.a
+z.ix=J.Q5(z,C.vb,z.ix,a)},"$1",null,2,0,null,110,"call"],
+$isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
+"^":"",
+oa:{
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{IB:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.F2.ZL(a)
-C.F2.oX(a)
-return a},null,null,0,0,115,"new IsolateRunStateElement$created"]}},
-"+IsolateRunStateElement":[448],
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.Pe=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.LN.ZL(a)
+C.LN.XI(a)
+return a}}}}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
+"^":"",
+St:{
+"^":"V12;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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
+z=$.Nd()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.nM.ZL(a)
+C.nM.XI(a)
+return a}}},
 V12:{
 "^":"uL+Pi;",
 $isd3:true},
-GG:{
-"^":"Tp:116;a-85",
-$1:[function(a){return J.am(J.qz(this.a))},"$1",null,2,0,116,57,[],"call"],
-$isEH:true},
-"+ GG":[315],
-r8:{
-"^":"Tp:116;a-85",
-$1:[function(a){return J.am(J.qz(this.a))},"$1",null,2,0,116,57,[],"call"],
-$isEH:true},
-"+ r8":[315],
-Yj:{
-"^":["V13;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
-"@":function(){return[C.Ux]},
-static:{b2:[function(a){var z,y,x,w
+IW:{
+"^":"V13;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+god:function(a){return a.ow},
+sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
+Fv:[function(a,b){return a.ow.ox("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,111,81],
+jh:[function(a,b){return a.ow.ox("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,111,81],
+static:{dm:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.rC.ZL(a)
-C.rC.oX(a)
-return a},null,null,0,0,115,"new IsolateLocationElement$created"]}},
-"+IsolateLocationElement":[449],
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.F2.ZL(a)
+C.F2.XI(a)
+return a}}},
 V13:{
 "^":"uL+Pi;",
 $isd3:true},
-Oz:{
-"^":["V14;Pw%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.Pw},null,null,1,0,318,"isolate",308,311],
-sF1:[function(a,b){a.Pw=this.ct(a,C.Z8,a.Pw,b)},null,null,3,0,319,30,[],"isolate",308],
-"@":function(){return[C.Po]},
-static:{RP:[function(a){var z,y,x,w
+GG:{
+"^":"Xs:30;a",
+$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,93,"call"],
+$isEH:true},
+r8:{
+"^":"Xs:30;a",
+$1:[function(a){return J.LE(this.a.ow)},"$1",null,2,0,null,93,"call"],
+$isEH:true},
+Qh:{
+"^":"V14;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+god:function(a){return a.ow},
+sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
+static:{Qj:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.kd.ZL(a)
-C.kd.oX(a)
-return a},null,null,0,0,115,"new IsolateSharedSummaryElement$created"]}},
-"+IsolateSharedSummaryElement":[450],
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.rC.ZL(a)
+C.rC.XI(a)
+return a}}},
 V14:{
 "^":"uL+Pi;",
 $isd3:true},
+Oz:{
+"^":"V15;ow,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+god:function(a){return a.ow},
+sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
+static:{RP:function(a){var z,y,x,w
+z=$.Nd()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.Ji.ZL(a)
+C.Ji.XI(a)
+return a}}},
+V15:{
+"^":"uL+Pi;",
+$isd3:true},
 vT:{
-"^":"a;z3,Nt",
+"^":"a;Y0,WL",
 eC:function(a){var z,y,x,w,v,u
-z=this.z3.Yb
-if(J.de(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Name"])
-z.V7("addColumn",["number","Value"])}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-for(y=J.GP(a.gvc()),x=J.U6(a);y.G();){w=y.gl()
+z=this.Y0.Yb
+if(J.xC(z.nQ("getNumberOfColumns"),0)){z.K9("addColumn",["string","Name"])
+z.K9("addColumn",["number","Value"])}z.K9("removeRows",[0,z.nQ("getNumberOfRows")])
+for(y=J.mY(a.gvc()),x=J.U6(a);y.G();){w=y.gl()
 v=J.uH(x.t(a,w),"%")
 if(0>=v.length)return H.e(v,0)
 u=[]
-C.Nm.FV(u,C.Nm.ez([w,H.IH(v[0],null)],P.En()))
+C.Nm.FV(u,C.Nm.ez([w,H.RR(v[0],null)],P.En()))
 u=new P.Tz(u)
 u.$builtinTypeInfo=[null]
-z.V7("addRow",[u])}},
-W2:function(a){var z=this.Nt
-if(z==null){z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.zV(J.UQ($.NR,"PieChart"),[a])
-this.Nt=z}z.W2(this.z3)}},
-YA:{
-"^":["V15;E1%-451,iF%-452,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-ghw:[function(a){return a.E1},null,null,1,0,453,"counters",308,311],
-shw:[function(a,b){a.E1=this.ct(a,C.MR,a.E1,b)},null,null,3,0,454,30,[],"counters",308],
-ak:[function(a,b){var z,y
-z=a.E1
+z.K9("addRow",[u])}}},
+Mc:{
+"^":"V16;wd,hG,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gKE:function(a){return a.wd},
+sKE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
+ak:[function(a,b){var z,y,x
+if(a.wd==null)return
+if($.Ib().MM.Gv!==0&&a.hG==null)a.hG=new D.vT(new G.Kf(P.zV(C.jN.t($.BY,"DataTable"),null)),null)
+z=a.hG
 if(z==null)return
-a.iF.eC(z)
+z.eC(a.wd)
 y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#counterPieChart")
-if(y!=null)a.iF.W2(y)},"$1","gAB",2,0,169,242,[],"countersChanged"],
-"@":function(){return[C.Bd]},
-static:{BP:[function(a){var z,y,x,w,v
-z=P.zV(J.UQ($.NR,"DataTable"),null)
-y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.iF=new D.vT(new G.ig(z),null)
-a.SO=y
-a.B7=x
-a.X0=v
+if(y!=null){z=a.hG
+x=z.WL
+if(x==null){x=new G.qu(null,P.L5(null,null,null,null,null))
+x.vR=P.zV(C.jN.t($.BY,"PieChart"),[y])
+z.WL=x}x.Am(z.Y0)}},"$1","gZm",2,0,15,34],
+static:{BP:function(a){var z,y,x,w
+z=$.Nd()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.wQ.ZL(a)
-C.wQ.oX(a)
-return a},null,null,0,0,115,"new IsolateCounterChartElement$created"]}},
-"+IsolateCounterChartElement":[455],
-V15:{
+C.wQ.XI(a)
+return a}}},
+V16:{
 "^":"uL+Pi;",
 $isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
 "^":"",
 Lr:{
-"^":"a;hO,Pl",
+"^":"a;Xr,Z5",
 eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.hO.Yb
-if(J.de(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
-for(y=a.gaf(),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=y.lo
-if(J.de(x,"Idle"))continue
-z.V7("addColumn",["number",x])}}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-y=a.gaf()
-w=H.TK(y,"Idle",0,y.length)
-v=a.gZ0()
+z=this.Xr.Yb
+if(J.xC(z.nQ("getNumberOfColumns"),0)){z.K9("addColumn",["string","Time"])
+for(y=J.mY(a.gaf());y.G();){x=y.lo
+if(J.xC(x,"Idle"))continue
+z.K9("addColumn",["number",x])}}z.K9("removeRows",[0,z.nQ("getNumberOfRows")])
+w=J.UU(a.gaf(),"Idle")
+v=a.gij()
 for(u=0;u<a.glI().length;++u){y=a.glI()
 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.yM(t-v,2))}else s.push("")
+s.push("t "+C.CD.Sy(t-v,2))}else s.push("")
 y=a.glI()
 if(u>=y.length)return H.e(y,u)
 r=y[u].wZ
 if(r===0){q=0
 while(!0){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].hw.length))break
+if(!(q<y[u].KE.length))break
 c$1:{if(q===w)break c$1
 s.push(0)}++q}}else{q=0
 while(!0){y=a.glI()
 if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].hw.length))break
+if(!(q<y[u].KE.length))break
 c$1:{if(q===w)break c$1
 y=a.glI()
 if(u>=y.length)return H.e(y,u)
-y=y[u].hw
+y=y[u].KE
 if(q>=y.length)return H.e(y,q)
-s.push(C.CD.yu(J.FW(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.Tz(y)
 y.$builtinTypeInfo=[null]
-z.V7("addRow",[y])}},
-W2:function(a){var z,y
-if(this.Pl==null){z=P.L5(null,null,null,null,null)
-y=new G.qu(null,z)
-y.vR=P.zV(J.UQ($.NR,"SteppedAreaChart"),[a])
-this.Pl=y
-z.u(0,"isStacked",!0)
-this.Pl.bG.u(0,"connectSteps",!1)
-this.Pl.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}this.Pl.W2(this.hO)}},
-qkb:{
-"^":["V16;oY%-445,ts%-456,e6%-457,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gF1:[function(a){return a.oY},null,null,1,0,318,"isolate",308,311],
-sF1:[function(a,b){a.oY=this.ct(a,C.Z8,a.oY,b)},null,null,3,0,319,30,[],"isolate",308],
-vV:[function(a,b){var z=a.oY
-return z.cv(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
-Vp:[function(a){a.oY.m7().ml(new L.BQ(a))},"$0","gjB",0,0,126,"_updateTagProfile"],
-i4:[function(a){Z.uL.prototype.i4.call(this,a)
-a.ts=P.rT(P.k5(0,0,0,0,0,1),this.gjB(a))},"$0","gQd",0,0,126,"enteredView"],
-xo:[function(a){var z
-Z.uL.prototype.xo.call(this,a)
-z=a.ts
-if(z!=null)z.ed()},"$0","gbt",0,0,126,"leftView"],
-Ob:[function(a){var z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#tagProfileChart")
-if(z!=null)a.e6.W2(z)},"$0","gPE",0,0,126,"_drawTagProfileChart"],
-pA:[function(a,b){J.am(a.oY).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-TJ:[function(a,b){return a.oY.cv("debug/pause").ml(new L.CV(a))},"$1","gAK",2,0,447,117,[],"pause"],
-nY:[function(a,b){return a.oY.cv("resume").ml(new L.IT(a))},"$1","gDQ",2,0,447,117,[],"resume"],
-"@":function(){return[C.NG]},
-static:{uD:[function(a){var z,y,x,w,v
-z=P.zV(J.UQ($.NR,"DataTable"),null)
+z.K9("addRow",[y])}}},
+qk:{
+"^":"V17;px,ii,LR,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+god:function(a){return a.px},
+sod:function(a,b){a.px=this.ct(a,C.rB,a.px,b)},
+vV:[function(a,b){var z=a.px
+return z.ox(J.WB(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZ2",2,0,66,67],
+MJ:[function(a){a.px.m7().ml(new L.LX(a))},"$0","gPW",0,0,13],
+q0:function(a){Z.uL.prototype.q0.call(this,a)
+a.ii=P.ww(P.ii(0,0,0,0,0,1),this.gPW(a))},
+Nz:function(a){var z
+Z.uL.prototype.Nz.call(this,a)
+z=a.ii
+if(z!=null)z.ed()},
+RF:[function(a,b){J.LE(a.px).wM(b)},"$1","gvC",2,0,15,65],
+Fv:[function(a,b){return a.px.ox("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,111,81],
+jh:[function(a,b){return a.px.ox("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,111,81],
+static:{KM:function(a){var z,y,x,w,v
+z=P.zV(C.jN.t($.BY,"DataTable"),null)
 y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
-a.e6=new L.Lr(new G.ig(z),null)
-a.SO=y
-a.B7=x
-a.X0=v
-C.Xe.ZL(a)
-C.Xe.oX(a)
-return a},null,null,0,0,115,"new IsolateViewElement$created"]}},
-"+IsolateViewElement":[458],
-V16:{
+x=P.YM(null,null,null,P.qU,W.I0)
+w=P.qU
+v=W.h4
+v=H.VM(new V.qC(P.YM(null,null,null,w,v),null,null),[w,v])
+a.LR=new L.Lr(new G.Kf(z),null)
+a.on=y
+a.BA=x
+a.LL=v
+C.BJ.ZL(a)
+C.BJ.XI(a)
+return a}}},
+V17:{
 "^":"uL+Pi;",
 $isd3:true},
-BQ:{
-"^":"Tp:116;a-85",
-$1:[function(a){var z,y,x
+LX:{
+"^":"Xs:30;a",
+$1:[function(a){var z,y,x,w,v
 z=this.a
-y=J.RE(z)
-y.ge6(z).eC(a)
+y=z.LR
+y.eC(a)
 x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
-if(x!=null)y.ge6(z).W2(x)
-y.sts(z,P.rT(P.k5(0,0,0,0,0,1),y.gjB(z)))},"$1",null,2,0,116,459,[],"call"],
+if(x!=null){if(y.Z5==null){w=P.L5(null,null,null,null,null)
+v=new G.qu(null,w)
+v.vR=P.zV(C.jN.t($.BY,"SteppedAreaChart"),[x])
+y.Z5=v
+w.u(0,"isStacked",!0)
+y.Z5.bG.u(0,"connectSteps",!1)
+y.Z5.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.Z5.Am(y.Xr)}z.ii=P.ww(P.ii(0,0,0,0,0,1),J.yo(z))},"$1",null,2,0,null,112,"call"],
 $isEH:true},
-"+ BQ":[315],
 CV:{
-"^":"Tp:116;a-85",
-$1:[function(a){return J.am(J.Ag(this.a))},"$1",null,2,0,116,57,[],"call"],
+"^":"Xs:30;a",
+$1:[function(a){return J.LE(this.a.px)},"$1",null,2,0,null,93,"call"],
 $isEH:true},
-"+ CV":[315],
-IT:{
-"^":"Tp:116;a-85",
-$1:[function(a){return J.am(J.Ag(this.a))},"$1",null,2,0,116,57,[],"call"],
-$isEH:true},
-"+ IT":[315]}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
+Vq:{
+"^":"Xs:30;a",
+$1:[function(a){return J.LE(this.a.px)},"$1",null,2,0,null,93,"call"],
+$isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
 "^":"",
-fM:{
-"^":"a;Fv,lp",
-KN:function(a,b){var z,y,x,w,v,u,t,s,r,q
-z=this.lp
+xh:{
+"^":"a;hw,jc",
+KN:function(a,b){var z,y,x,w,v,u,t,s
+z=this.jc
 if(z.tg(0,a))return
 z.h(0,a)
-for(y=J.GP(a.gvc()),x=this.Fv,w=J.U6(a),v=b+1;y.G();){u=y.gl()
+for(y=J.mY(a.gvc()),x=this.hw,w=J.U6(a),v=b+1;y.G();){u=y.gl()
 t=w.t(a,u)
 s=J.x(t)
-if(!!s.$isZ0){if(typeof "  "!=="number")return H.s("  ")
-r=b*"  "
-s=typeof r==="string"
-x.vM+=s?r:H.d(r)
-q="\""+H.d(u)+"\": {\n"
-x.vM+=q
+if(!!s.$isZ0){s=C.xB.U("  ",b)
+x.vM+=s
+s="\""+H.d(u)+"\": {\n"
+x.vM+=s
 this.KN(t,v)
-q=x.vM+=s?r:H.d(r)
-x.vM=q+"}\n"}else if(!!s.$isList){if(typeof "  "!=="number")return H.s("  ")
-r=b*"  "
-s=typeof r==="string"
-x.vM+=s?r:H.d(r)
-q="\""+H.d(u)+"\": [\n"
-x.vM+=q
-this.lG(t,v)
-q=x.vM+=s?r:H.d(r)
-x.vM=q+"]\n"}else{if(typeof "  "!=="number")return H.s("  ")
-r=b*"  "
-x.vM+=typeof r==="string"?r:H.d(r)
+s=C.xB.U("  ",b)
+s=x.vM+=s
+x.vM=s+"}\n"}else if(!!s.$isWO){s=C.xB.U("  ",b)
+x.vM+=s
+s="\""+H.d(u)+"\": [\n"
+x.vM+=s
+this.HC(t,v)
+s=C.xB.U("  ",b)
+s=x.vM+=s
+x.vM=s+"]\n"}else{s=C.xB.U("  ",b)
+x.vM+=s
 s="\""+H.d(u)+"\": "+H.d(t)
 s=x.vM+=s
 x.vM=s+"\n"}}z.Rz(0,a)},
-lG:function(a,b){var z,y,x,w,v,u,t,s
-z=this.lp
+HC:function(a,b){var z,y,x,w,v,u
+z=this.jc
 if(z.tg(0,a))return
 z.h(0,a)
-for(y=J.GP(a),x=this.Fv,w=b+1;y.G();){v=y.gl()
+for(y=J.mY(a),x=this.hw,w=b+1;y.G();){v=y.gl()
 u=J.x(v)
-if(!!u.$isZ0){if(typeof "  "!=="number")return H.s("  ")
-t=b*"  "
-u=typeof t==="string"
-s=x.vM+=u?t:H.d(t)
-x.vM=s+"{\n"
+if(!!u.$isZ0){u=C.xB.U("  ",b)
+u=x.vM+=u
+x.vM=u+"{\n"
 this.KN(v,w)
-s=x.vM+=u?t:H.d(t)
-x.vM=s+"}\n"}else if(!!u.$isList){if(typeof "  "!=="number")return H.s("  ")
-t=b*"  "
-u=typeof t==="string"
-s=x.vM+=u?t:H.d(t)
-x.vM=s+"[\n"
-this.lG(v,w)
-s=x.vM+=u?t:H.d(t)
-x.vM=s+"]\n"}else{if(typeof "  "!=="number")return H.s("  ")
-t=b*"  "
-x.vM+=typeof t==="string"?t:H.d(t)
+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.HC(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)}},
 vj:{
-"^":["V17;OZ%-336,X7%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gIr:[function(a){return a.OZ},null,null,1,0,337,"map",308,311],
+"^":"V18;OZ,X7,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gIr:function(a){return a.OZ},
 ez:function(a,b){return this.gIr(a).$1(b)},
-sIr:[function(a,b){a.OZ=this.ct(a,C.p3,a.OZ,b)},null,null,3,0,338,30,[],"map",308],
-gxU:[function(a){return a.X7},null,null,1,0,312,"mapAsString",308,309],
-sxU:[function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},null,null,3,0,32,30,[],"mapAsString",308],
+sIr:function(a,b){a.OZ=this.ct(a,C.SR,a.OZ,b)},
+glp:function(a){return a.X7},
+slp:function(a,b){a.X7=this.ct(a,C.t6,a.X7,b)},
 oC:[function(a,b){var z,y,x
 z=P.p9("")
 y=P.Ls(null,null,null,null)
 x=a.OZ
 z.vM=""
 z.KF("{\n")
-new Z.fM(z,y).KN(x,0)
+new Z.xh(z,y).KN(x,0)
 z.KF("}\n")
 z=z.vM
-a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gHa",2,0,169,242,[],"mapChanged"],
-"@":function(){return[C.KH]},
-static:{mA:[function(a){var z,y,x,w
+a.X7=this.ct(a,C.t6,a.X7,z)},"$1","gdB",2,0,15,34],
+static:{M7:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.Yt.ZL(a)
-C.Yt.oX(a)
-return a},null,null,0,0,115,"new JsonViewElement$created"]}},
-"+JsonViewElement":[460],
-V17:{
+C.Yt.XI(a)
+return a}}},
+V18:{
 "^":"uL+Pi;",
 $isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
 "^":"",
 LU:{
-"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.uy]},
-static:{rA:[function(a){var z,y,x,w
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{rA:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
+a.on=z
+a.BA=y
+a.LL=w
 C.Z3.ZL(a)
-C.Z3.oX(a)
-return a},null,null,0,0,115,"new LibraryRefElement$created"]}},
-"+LibraryRefElement":[342]}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
+C.Z3.XI(a)
+return a}}}}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
 "^":"",
-KL:{
-"^":["V18;a1%-461,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.a1},null,null,1,0,462,"library",308,311],
-stD:[function(a,b){a.a1=this.ct(a,C.EV,a.a1,b)},null,null,3,0,463,30,[],"library",308],
-vV:[function(a,b){return J.QP(a.a1).cv(J.WB(J.F8(a.a1),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,343,225,[],"eval"],
-pA:[function(a,b){J.am(a.a1).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.Oyb]},
-static:{Ro:[function(a){var z,y,x,w
+CX:{
+"^":"V19;iI,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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).ox(J.WB(J.F8(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZ2",2,0,66,67],
+RF:[function(a,b){J.LE(a.iI).wM(b)},"$1","gvC",2,0,15,65],
+static:{as:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.MG.ZL(a)
-C.MG.oX(a)
-return a},null,null,0,0,115,"new LibraryViewElement$created"]}},
-"+LibraryViewElement":[464],
-V18:{
+C.MG.XI(a)
+return a}}},
+V19:{
 "^":"uL+Pi;",
 $isd3:true}}],["logging","package:logging/logging.dart",,N,{
 "^":"",
-TJ:{
-"^":"a;oc>,eT>,n2,Cj>,wd>,Gs",
+JM:{
+"^":"a;oc>,eT>,n2,Cj>,ks>,Gs",
 gB8:function(){var z,y,x
 z=this.eT
-y=z==null||J.de(J.O6(z),"")
+y=z==null||J.xC(J.tE(z),"")
 x=this.oc
 return y?x:z.gB8()+"."+x},
-gOR:function(){if($.RL){var z=this.n2
-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
-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.IE()},
-Im:function(a){return a.P>=this.gOR().P},
+gQG:function(){if($.RL){var z=this.eT
+if(z!=null)return z.gQG()}return $.Y4},
+Im:function(a){return a.P>=this.gQG().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.gQG().P){z=this.gB8()
 y=new P.iP(Date.now(),!1)
 y.EK()
-x=$.xO
-$.xO=x+1
+x=$.Y1
+$.Y1=x+1
 w=new N.HV(a,b,z,y,x,c,d)
-if($.RL)for(v=this;v!=null;){z=J.RE(v)
-z.od(v,w)
-v=z.geT(v)}else J.EY(N.Jx(""),w)}},
-X2:function(a,b,c){return this.Y6(C.Ek,a,b,c)},
+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.Ab,a,b,c)},
 x9:function(a){return this.X2(a,null,null)},
-dL:function(a,b,c){return this.Y6(C.R5,a,b,c)},
+dL:function(a,b,c){return this.Y6(C.eI,a,b,c)},
 J4:function(a){return this.dL(a,null,null)},
-ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
-To:function(a){return this.ZG(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)},
 xH:function(a,b,c){return this.Y6(C.nT,a,b,c)},
 j2:function(a){return this.xH(a,null,null)},
-WB:function(a,b,c){return this.Y6(C.cV,a,b,c)},
-hh:function(a){return this.WB(a,null,null)},
-IE:function(){if($.RL||this.eT==null){var z=this.Gs
-if(z==null){z=P.bK(null,null,!0,N.HV)
-this.Gs=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.Jx("").IE()},
-od:function(a,b){var z=this.Gs
-if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(b)}},
+WB:function(a,b,c){return this.Y6(C.Xm,a,b,c)},
+YX:function(a){return this.WB(a,null,null)},
+cB:function(a){},
 QL:function(a,b,c){var z=this.eT
 if(z!=null)J.Tr(z).u(0,this.oc,this)},
-$isTJ:true,
-static:{"^":"DY",Jx:function(a){return $.U0().to(a,new N.dG(a))}}},
+$isJM:true,
+static:{"^":"Uj",QM:function(a){return $.R2().to(a,new N.dG(a))}}},
 dG:{
-"^":"Tp:115;a",
-$0:[function(){var z,y,x,w,v
+"^":"Xs:47;a",
+$0:function(){var z,y,x,w,v
 z=this.a
 if(C.xB.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
 y=C.xB.cn(z,".")
-if(y===-1)x=z!==""?N.Jx(""):null
-else{x=N.Jx(C.xB.Nj(z,0,y))
-z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,J.O,N.TJ)
-v=new N.TJ(z,x,null,w,H.VM(new Q.Gj(w),[null,null]),null)
+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.JM)
+v=new N.JM(z,x,null,w,H.VM(new Q.A2(w),[null,null]),null)
 v.QL(z,x,w)
-return v},"$0",null,0,0,null,"call"],
+return v},
 $isEH:true},
 qV:{
 "^":"a;oc>,P>",
@@ -11327,344 +10618,288 @@
 giO:function(a){return this.P},
 bu:function(a){return this.oc},
 $isqV:true,
-static:{"^":"K9,tmj,EL,LkO,reI,pd,dc,MHK,ow,lM,B9"}},
+static:{"^":"X9,tmj,Enk,LkO,tY,Fn,dc,zE,Uu,lM,uxc"}},
 HV:{
-"^":"a;OR<,G1>,iJ,Fl<,O0,kc>,I4<",
-bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
-$isHV:true,
-static:{"^":"xO"}}}],["","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/main.dart",,F,{
+"^":"a;QG<,G1>,Mw,Fl,O0,kc>,I4<",
+bu:function(a){return"["+this.QG.oc+"] "+this.Mw+": "+this.G1},
+static:{"^":"Y1"}}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
 "^":"",
-E2:[function(){N.Jx("").sOR(C.IF)
-N.Jx("").gSZ().yI(new F.em())
-N.Jx("").To("Starting Observatory")
-var z=H.VM(new P.Zf(P.Dt(null)),[null])
-N.Jx("").To("Loading Google Charts API")
-J.UQ($.cM(),"google").V7("load",["visualization","1",P.jT(P.EF(["packages",["corechart","table"],"callback",new P.r7(P.xZ(z.gv6(z),!0))],null,null))])
-z.MM.ml(G.vN()).ml(new F.Lb())},"$0","qg",0,0,null],
-em:{
-"^":"Tp:466;",
-$1:[function(a){var z
-if(J.de(a.gOR(),C.nT)){z=J.RE(a)
-if(J.co(z.gG1(a),"Error evaluating expression"))z=J.kE(z.gG1(a),"Can't assign to null: ")===!0||J.kE(z.gG1(a),"Expression is not assignable: ")===!0
-else z=!1}else z=!1
-if(z)return
-P.JS(a.gOR().oc+": "+a.gFl().bu(0)+": "+H.d(J.z2(a)))},"$1",null,2,0,null,465,[],"call"],
-$isEH:true},
-Lb:{
-"^":"Tp:116;",
-$1:[function(a){N.Jx("").To("Initializing Polymer")
-A.Ok()},"$1",null,2,0,null,117,[],"call"],
-$isEH:true}}],["metadata","file:///Users/turnidge/ws/dart-repo/dart/runtime/bin/vmservice/client/web/packages/$sdk/lib/html/html_common/metadata.dart",,B,{
-"^":"",
-jh:{
-"^":"a;T9,Ym",
-static:{"^":"LB,ziq,pjg,nq,xa"}},
-tzK:{
-"^":"a;"},
-bW:{
-"^":"a;oc>"},
-PO:{
-"^":"a;"},
-oBi:{
-"^":"a;"}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
-"^":"",
-F1:{
-"^":["V19;Mz%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gqW:[function(a){return a.Mz},null,null,1,0,307,"pad",308,311],
-sqW:[function(a,b){a.Mz=this.ct(a,C.ZU,a.Mz,b)},null,null,3,0,310,30,[],"pad",308],
-"@":function(){return[C.nW]},
-static:{aD:[function(a){var z,y,x,w
+md:{
+"^":"V20;i4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+giC:function(a){return a.i4},
+siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
+static:{aD:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.Mz=!0
-a.SO=z
-a.B7=y
-a.X0=w
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.i4=!0
+a.on=z
+a.BA=y
+a.LL=w
 C.kD.ZL(a)
-C.kD.oX(a)
-return a},null,null,0,0,115,"new NavBarElement$created"]}},
-"+NavBarElement":[467],
-V19:{
-"^":"uL+Pi;",
-$isd3:true},
-aQ:{
-"^":["V20;KU%-305,V4%-305,Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,312,"link",308,311],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",308],
-gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",308,311],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",308],
-grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
-"@":function(){return[C.u7]},
-static:{AJ:[function(a){var z,y,x,w
-z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.KU="#"
-a.V4="---"
-a.Jo=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.SU.ZL(a)
-C.SU.oX(a)
-return a},null,null,0,0,115,"new NavMenuElement$created"]}},
-"+NavMenuElement":[468],
+C.kD.XI(a)
+return a}}},
 V20:{
 "^":"uL+Pi;",
 $isd3:true},
-Qa:{
-"^":["V21;KU%-305,V4%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gPj:[function(a){return a.KU},null,null,1,0,312,"link",308,311],
-sPj:[function(a,b){a.KU=this.ct(a,C.dB,a.KU,b)},null,null,3,0,32,30,[],"link",308],
-gdU:[function(a){return a.V4},null,null,1,0,312,"anchor",308,311],
-sdU:[function(a,b){a.V4=this.ct(a,C.Es,a.V4,b)},null,null,3,0,32,30,[],"anchor",308],
-"@":function(){return[C.qT]},
-static:{JR:[function(a){var z,y,x,w
+Bm:{
+"^":"V21;KU,V4,fc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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)},
+grZ:function(a){return a.fc},
+srZ:function(a,b){a.fc=this.ct(a,C.uk,a.fc,b)},
+static:{yU:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.KU="#"
 a.V4="---"
-a.SO=z
-a.B7=y
-a.X0=w
-C.nn.ZL(a)
-C.nn.oX(a)
-return a},null,null,0,0,115,"new NavMenuItemElement$created"]}},
-"+NavMenuItemElement":[469],
+a.fc=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.SU.ZL(a)
+C.SU.XI(a)
+return a}}},
 V21:{
 "^":"uL+Pi;",
 $isd3:true},
-Ww:{
-"^":["V22;rU%-85,SB%-304,Hq%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFR:[function(a){return a.rU},null,null,1,0,115,"callback",308,311],
-Ki:function(a){return this.gFR(a).$0()},
-LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:[function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},null,null,3,0,116,30,[],"callback",308],
-gxw:[function(a){return a.SB},null,null,1,0,307,"active",308,311],
-sxw:[function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},null,null,3,0,310,30,[],"active",308],
-gph:[function(a){return a.Hq},null,null,1,0,312,"label",308,311],
-sph:[function(a,b){a.Hq=this.ct(a,C.y2,a.Hq,b)},null,null,3,0,32,30,[],"label",308],
-Ty:[function(a,b,c,d){var z=a.SB
-if(z===!0)return
-a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gyr",6,0,350,21,[],351,[],82,[],"buttonClick"],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gCB",0,0,126,"refreshDone"],
-"@":function(){return[C.XG]},
-static:{zN:[function(a){var z,y,x,w
+Ya:{
+"^":"V22;KU,V4,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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:{JR:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SB=!1
-a.Hq="Refresh"
-a.SO=z
-a.B7=y
-a.X0=w
-C.J7.ZL(a)
-C.J7.oX(a)
-return a},null,null,0,0,115,"new NavRefreshElement$created"]}},
-"+NavRefreshElement":[470],
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.KU="#"
+a.V4="---"
+a.on=z
+a.BA=y
+a.LL=w
+C.nn.ZL(a)
+C.nn.XI(a)
+return a}}},
 V22:{
 "^":"uL+Pi;",
 $isd3:true},
-tz:{
-"^":["V23;Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
-"@":function(){return[C.NT]},
-static:{J8:[function(a){var z,y,x,w
+Ww:{
+"^":"V23;rU,cj,z2,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gFR:function(a){return a.rU},
+LY:function(a,b){return this.gFR(a).$1(b)},
+Ki:function(a){return this.gFR(a).$0()},
+sFR:function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},
+gjl:function(a){return a.cj},
+sjl:function(a,b){a.cj=this.ct(a,C.aP,a.cj,b)},
+gph:function(a){return a.z2},
+sph:function(a,b){a.z2=this.ct(a,C.hf,a.z2,b)},
+Ty:[function(a,b,c,d){var z=a.cj
+if(z===!0)return
+a.cj=this.ct(a,C.aP,z,!0)
+if(a.rU!=null)this.LY(a,this.gCB(a))},"$3","gzY",6,0,69,1,70,71],
+rT:[function(a){a.cj=this.ct(a,C.aP,a.cj,!1)},"$0","gCB",0,0,13],
+static:{ZC:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.Jo=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.lx.ZL(a)
-C.lx.oX(a)
-return a},null,null,0,0,115,"new TopNavMenuElement$created"]}},
-"+TopNavMenuElement":[471],
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.cj=!1
+a.z2="Refresh"
+a.on=z
+a.BA=y
+a.LL=w
+C.J7.ZL(a)
+C.J7.XI(a)
+return a}}},
 V23:{
 "^":"uL+Pi;",
 $isd3:true},
-Mv:{
-"^":["V24;Jo%-304,iy%-445,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
-gF1:[function(a){return a.iy},null,null,1,0,318,"isolate",308,311],
-sF1:[function(a,b){a.iy=this.ct(a,C.Z8,a.iy,b)},null,null,3,0,319,30,[],"isolate",308],
-vD:[function(a,b){this.ct(a,C.Ia,0,1)},"$1","gQ1",2,0,169,242,[],"isolateChanged"],
-gu6:[function(a){var z=a.iy
-if(z!=null)return z.gHP()
-else return""},null,null,1,0,312,"hashLinkWorkaround",308],
-su6:[function(a,b){},null,null,3,0,116,28,[],"hashLinkWorkaround",308],
-"@":function(){return[C.zaS]},
-static:{Du:[function(a){var z,y,x,w
+G1:{
+"^":"V24;fc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+grZ:function(a){return a.fc},
+srZ:function(a,b){a.fc=this.ct(a,C.uk,a.fc,b)},
+static:{J8:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.Jo=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.RR.ZL(a)
-C.RR.oX(a)
-return a},null,null,0,0,115,"new IsolateNavMenuElement$created"]}},
-"+IsolateNavMenuElement":[472],
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.fc=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.lx.ZL(a)
+C.lx.XI(a)
+return a}}},
 V24:{
 "^":"uL+Pi;",
 $isd3:true},
-oM:{
-"^":["V25;Ap%-461,Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtD:[function(a){return a.Ap},null,null,1,0,462,"library",308,311],
-stD:[function(a,b){a.Ap=this.ct(a,C.EV,a.Ap,b)},null,null,3,0,463,30,[],"library",308],
-grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
-"@":function(){return[C.KI]},
-static:{IV:[function(a){var z,y,x,w
+fl:{
+"^":"V25;fc,iy,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+grZ:function(a){return a.fc},
+srZ:function(a,b){a.fc=this.ct(a,C.uk,a.fc,b)},
+god:function(a){return a.iy},
+sod:function(a,b){a.iy=this.ct(a,C.rB,a.iy,b)},
+Wt:[function(a,b){this.ct(a,C.Ge,0,1)},"$1","gQ1",2,0,15,34],
+gu6:function(a){var z=a.iy
+if(z!=null)return z.gHP()
+else return""},
+su6:function(a,b){},
+static:{Du:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.Jo=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.ct.ZL(a)
-C.ct.oX(a)
-return a},null,null,0,0,115,"new LibraryNavMenuElement$created"]}},
-"+LibraryNavMenuElement":[473],
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.fc=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.uF.ZL(a)
+C.uF.XI(a)
+return a}}},
 V25:{
 "^":"uL+Pi;",
 $isd3:true},
-iL:{
-"^":["V26;Au%-336,Jo%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gdG:[function(a){return a.Au},null,null,1,0,337,"cls",308,311],
-sdG:[function(a,b){a.Au=this.ct(a,C.XA,a.Au,b)},null,null,3,0,338,30,[],"cls",308],
-grZ:[function(a){return a.Jo},null,null,1,0,307,"last",308,311],
-srZ:[function(a,b){a.Jo=this.ct(a,C.QL,a.Jo,b)},null,null,3,0,310,30,[],"last",308],
-"@":function(){return[C.qJ]},
-static:{lT:[function(a){var z,y,x,w
+UK:{
+"^":"V26;jq,fc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gHt:function(a){return a.jq},
+sHt:function(a,b){a.jq=this.ct(a,C.EV,a.jq,b)},
+grZ:function(a){return a.fc},
+srZ:function(a,b){a.fc=this.ct(a,C.uk,a.fc,b)},
+static:{JT:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.Jo=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.ae.ZL(a)
-C.ae.oX(a)
-return a},null,null,0,0,115,"new ClassNavMenuElement$created"]}},
-"+ClassNavMenuElement":[474],
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.fc=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.ct.ZL(a)
+C.ct.XI(a)
+return a}}},
 V26:{
 "^":"uL+Pi;",
+$isd3:true},
+wM:{
+"^":"V27;Au,fc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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.fc},
+srZ:function(a,b){a.fc=this.ct(a,C.uk,a.fc,b)},
+static:{GO:function(a){var z,y,x,w
+z=$.Nd()
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.fc=!1
+a.on=z
+a.BA=y
+a.LL=w
+C.HR.ZL(a)
+C.HR.XI(a)
+return a}}},
+V27:{
+"^":"uL+Pi;",
 $isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
 "^":"",
-F1i:{
-"^":["V27;k5%-304,Oe%-475,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzj:[function(a){return a.k5},null,null,1,0,307,"devtools",308,311],
-szj:[function(a,b){a.k5=this.ct(a,C.of,a.k5,b)},null,null,3,0,310,30,[],"devtools",308],
-guw:[function(a){return a.Oe},null,null,1,0,476,"app",308,309],
-suw:[function(a,b){a.Oe=this.ct(a,C.wh,a.Oe,b)},null,null,3,0,477,30,[],"app",308],
-ZB:[function(a){var z
-if(a.k5===!0){z=new U.ho(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+F1:{
+"^":"V28;qC,yT,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gzj:function(a){return a.qC},
+szj:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
+giJ:function(a){return a.yT},
+siJ:function(a,b){a.yT=this.ct(a,C.j2,a.yT,b)},
+q0:function(a){var z
+Z.uL.prototype.q0.call(this,a)
+if(a.qC===!0){z=new U.bl(P.L5(null,null,null,null,null),0,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.PI()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.hq()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}else{z=new U.XK(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,J.O,D.af),P.L5(null,null,null,J.O,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
+a.yT=this.ct(a,C.j2,a.yT,z)}else{z=new U.Fk(null,"unknown","unknown",0,!1,!1,P.bK(null,null,!1,null),P.bK(null,null,!1,null),P.L5(null,null,null,P.qU,D.af),P.L5(null,null,null,P.qU,D.bv),null,null,null,null,null,!1,null,null,null,null,null)
 z.Lw()
 z.SC()
 z=new G.mL(new G.dZ(null,"",null,null),z,null,null,null,null,null)
 z.US()
-a.Oe=this.ct(a,C.wh,a.Oe,z)}},null,null,0,0,115,"created"],
-"@":function(){return[C.kR]},
-static:{fv:[function(a){var z,y,x,w
+a.yT=this.ct(a,C.j2,a.yT,z)}},
+static:{VO:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.k5=!1
-a.SO=z
-a.B7=y
-a.X0=w
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.qC=!1
+a.on=z
+a.BA=y
+a.LL=w
 C.k0.ZL(a)
-C.k0.oX(a)
-C.k0.ZB(a)
-return a},null,null,0,0,115,"new ObservatoryApplicationElement$created"]}},
-"+ObservatoryApplicationElement":[478],
-V27:{
+C.k0.XI(a)
+return a}}},
+V28:{
 "^":"uL+Pi;",
 $isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
 "^":"",
 uL:{
-"^":["xc;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-i4:[function(a){A.zs.prototype.i4.call(this,a)},"$0","gQd",0,0,126,"enteredView"],
-xo:[function(a){A.zs.prototype.xo.call(this,a)},"$0","gbt",0,0,126,"leftView"],
-aC:[function(a,b,c,d){A.zs.prototype.aC.call(this,a,b,c,d)},"$3","gxR",6,0,479,12,[],242,[],243,[],"attributeChanged"],
-b2r:[function(a,b){return G.P0(b)},"$1","gjC",2,0,480,123,[],"formatTimePrecise"],
-nN:[function(a,b){return G.mG(b)},"$1","gSs",2,0,480,123,[],"formatTime"],
-Yy:[function(a,b){return J.Ez(b,2)},"$1","ghY",2,0,480,28,[],"formatSeconds"],
-Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,121,124,[],"formatSize"],
-at:[function(a,b){var z,y,x
-z=J.U6(b)
-y=J.UQ(z.t(b,"script"),"user_name")
-x=J.U6(y)
-return x.yn(y,J.WB(x.cn(y,"/"),1))+":"+H.d(z.t(b,"line"))},"$1","guT",2,0,481,482,[],"fileAndLine"],
-b1:[function(a,b){return J.de(b,"Null")},"$1","gXj",2,0,483,11,[],"isNull"],
-i5:[function(a,b){return J.de(b,"Error")},"$1","gt3",2,0,483,11,[],"isError"],
+"^":"ir;AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+q0:function(a){A.dM.prototype.q0.call(this,a)},
+Nz:function(a){A.dM.prototype.Nz.call(this,a)},
+I9:function(a){A.dM.prototype.I9.call(this,a)},
+wN:function(a,b,c,d){A.dM.prototype.wN.call(this,a,b,c,d)},
+a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,113,114],
+Ze:[function(a,b){return G.Xz(b)},"$1","gbJ",2,0,10,11],
+uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,115,116],
+i5:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,115,116],
 OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gKo",2,0,483,11,[],"isInt"],
-RU:[function(a,b){return J.de(b,"Bool")},"$1","gr9",2,0,483,11,[],"isBool"],
-ze:[function(a,b){return J.de(b,"String")},"$1","gfI",2,0,483,11,[],"isString"],
-rW:[function(a,b){return J.de(b,"Instance")},"$1","gnD",2,0,483,11,[],"isInstance"],
-JG:[function(a,b){return J.de(b,"Double")},"$1","gzxQ",2,0,483,11,[],"isDouble"],
+return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,115,116],
+Qr:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,115,116],
+ff:[function(a,b){return J.xC(b,"String")},"$1","gu7",2,0,115,116],
+fZ:[function(a,b){return J.xC(b,"Instance")},"$1","gNs",2,0,115,116],
+JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,115,116],
 Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gwc",2,0,483,11,[],"isList"],
-tR:[function(a,b){return J.de(b,"Type")},"$1","gqNn",2,0,483,11,[],"isType"],
-AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","gaE",2,0,483,11,[],"isUnexpected"],
-"@":function(){return[C.Br]},
-static:{Hx:[function(a){var z,y,x,w
+return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,115,116],
+tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,115,116],
+SG:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,115,116],
+static:{EE:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.Pf.ZL(a)
-C.Pf.oX(a)
-return a},null,null,0,0,115,"new ObservatoryElement$created"]}},
-"+ObservatoryElement":[484]}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
+C.Pf.XI(a)
+return a}}}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
+"^":"",
+Ap:{
+"^":"a;",
+sP:function(a,b){},
+$isAp:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
 "^":"",
 Pi:{
 "^":"a;",
-gUj:function(a){var z=a.AP
-if(z==null){z=this.gqw(a)
-z=P.bK(this.gl1(a),z,!0,null)
+gqh:function(a){var z=a.AP
+if(z==null){z=this.gcm(a)
+z=P.bK(this.gym(a),z,!0,null)
 a.AP=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"$0","gqw",0,0,126],
-ni:[function(a){a.AP=null},"$0","gl1",0,0,126],
+k0:[function(a){},"$0","gcm",0,0,13],
+NB:[function(a){a.AP=null},"$0","gym",0,0,13],
 BN:[function(a){var z,y,x
 z=a.fn
 a.fn=null
@@ -11672,14 +10907,14 @@
 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,307],
+return!0}return!1},"$0","gDx",0,0,76],
 gnz:function(a){var z,y
 z=a.AP
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
 ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
-nq:function(a,b){if(!this.gnz(a))return
+SZ: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,{
@@ -11688,114 +10923,37 @@
 "^":"a;",
 $isyj:true},
 qI:{
-"^":"yj;WA>,oc>,jL>,zZ>",
+"^":"yj;WA>,oc>,jL,zZ",
 bu:function(a){return"#<PropertyChangeRecord "+H.d(this.oc)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},
-$isqI:true}}],["observe.src.compound_path_observer","package:observe/src/compound_path_observer.dart",,Y,{
+$isqI:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
 "^":"",
-J3:{
-"^":"Pi;b9,kK,Sv,rk,YX,B6,AP,fn",
-kb:function(a){return this.rk.$1(a)},
-gB:function(a){return this.b9.length},
-gP:[function(a){return this.Sv},null,null,1,0,115,"value",308],
-wE:function(a){var z,y,x,w,v
-if(this.YX)return
-this.YX=!0
-z=this.geu()
-for(y=this.b9,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=this.kK;y.G();){w=J.xq(y.lo).w4(!1)
-v=w.Lj
-w.pN=v.cR(z)
-w.o7=P.VH(P.AY(),v)
-w.Bd=v.Al(P.v3())
-x.push(w)}this.Ow()},
-TF:[function(a){if(this.B6)return
-this.B6=!0
-P.rb(this.gMc())},"$1","geu",2,0,169,117,[]],
-Ow:[function(){var z,y
-this.B6=!1
-z=this.b9
-if(z.length===0)return
-y=H.VM(new H.A8(z,new Y.E5()),[null,null]).br(0)
-if(this.rk!=null)y=this.kb(y)
-this.Sv=F.Wi(this,C.ls,this.Sv,y)},"$0","gMc",0,0,126],
-cO:function(a){var z,y
-z=this.b9
-if(z.length===0)return
-if(this.YX)for(y=this.kK,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)y.lo.ed()
-C.Nm.sB(z,0)
-C.Nm.sB(this.kK,0)
-this.Sv=null},
-k0:[function(a){return this.wE(0)},"$0","gqw",0,0,115],
-ni:[function(a){return this.cO(0)},"$0","gl1",0,0,115],
-$isJ3:true},
-E5:{
-"^":"Tp:116;",
-$1:[function(a){return J.Vm(a)},"$1",null,2,0,null,99,[],"call"],
-$isEH:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
-"^":"",
-Y3:[function(){var z,y,x,w,v,u,t,s,r,q
-if($.Td)return
-if($.tW==null)return
-$.Td=!0
+N0:function(){var z,y,x,w,v,u,t,s,r,q
+if($.AM)return
+if($.iq==null)return
+$.AM=!0
 z=0
 y=null
 do{++z
 if(z===1000)y=[]
-x=$.tW
+x=$.iq
 w=[]
 w.$builtinTypeInfo=[F.d3]
-$.tW=w
+$.iq=w
 for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
 s=t.R9
 s=s.iE!==s
 if(s){if(t.BN(0)){if(w)y.push([u,t])
-v=!0}$.tW.push(t)}}}while(z<1000&&v)
-if(w&&v){w=$.iU()
+v=!0}$.iq.push(t)}}}while(z<1000&&v)
+if(w&&v){w=$.T5()
 w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
 for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
 q=J.U6(r)
-w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.el=$.tW.length
-$.Td=!1},"$0","D6",0,0,null],
-Ht:[function(){var z={}
-z.a=!1
-z=new O.o5(z)
-return new P.zG(null,null,null,null,new O.zI(z),new O.id(z),null,null,null,null,null,null)},"$0","Zq",0,0,null],
-o5:{
-"^":"Tp:485;a",
-$2:[function(a,b){var z=this.a
-if(z.a)return
-z.a=!0
-a.RK(b,new O.b5(z))},"$2",null,4,0,null,181,[],166,[],"call"],
-$isEH:true},
-b5:{
-"^":"Tp:115;a",
-$0:[function(){this.a.a=!1
-O.Y3()},"$0",null,0,0,null,"call"],
-$isEH:true},
-zI:{
-"^":"Tp:182;b",
-$4:[function(a,b,c,d){if(d==null)return d
-return new O.Zb(this.b,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
-$isEH:true},
-Zb:{
-"^":"Tp:115;c,d,e,f",
-$0:[function(){this.c.$2(this.d,this.e)
-return this.f.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-id:{
-"^":"Tp:486;UI",
-$4:[function(a,b,c,d){if(d==null)return d
-return new O.iV(this.UI,b,c,d)},"$4",null,8,0,null,180,[],181,[],166,[],128,[],"call"],
-$isEH:true},
-iV:{
-"^":"Tp:116;bK,Gq,Rm,w3",
-$1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,28,[],"call"],
-$isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
+w.j2("In last iteration Observable changed at index "+H.d(q.t(r,0))+", object: "+H.d(q.t(r,1))+".")}}$.ax=$.iq.length
+$.AM=!1}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
 "^":"",
-f6:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
-z=J.WB(J.xH(f,e),1)
+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
 y=J.WB(J.xH(c,b),1)
-if(typeof z!=="number")return H.s(z)
 x=Array(z)
 for(w=x.length,v=0;v<z;++v){if(typeof y!=="number")return H.s(y)
 u=Array(y)
@@ -11807,28 +10965,29 @@
 for(;t<y;++t){if(0>=w)return H.e(x,0)
 u=x[0]
 if(t>=u.length)return H.e(u,t)
-u[t]=t}for(u=J.U6(d),s=J.Qc(b),r=J.U6(a),v=1;v<z;++v)for(q=v-1,p=e+v-1,t=1;t<y;++t){o=J.de(u.t(d,p),r.t(a,J.xH(s.g(b,t),1)))
-n=t-1
-m=x[v]
-l=x[q]
-if(o){if(v>=w)return H.e(x,v)
-if(q>=w)return H.e(x,q)
-if(n>=l.length)return H.e(l,n)
-o=l[n]
-if(t>=m.length)return H.e(m,t)
-m[t]=o}else{if(q>=w)return H.e(x,q)
-if(t>=l.length)return H.e(l,t)
-o=l[t]
-if(typeof o!=="number")return o.g()
+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.xH(u.g(b,t),1)))
+o=x[v]
+n=x[r]
+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(t>=n.length)return H.e(n,t)
+p=n[t]
+if(typeof p!=="number")return p.g()
 if(v>=w)return H.e(x,v)
-l=m.length
-if(n>=l)return H.e(m,n)
-n=m[n]
-if(typeof n!=="number")return n.g()
-n=P.J(o+1,n+1)
-if(t>=l)return H.e(m,t)
-m[t]=n}}return x},"$6","cL",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
-Mw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+n=o.length
+if(m>=n)return H.e(o,m)
+m=o[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},
+kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=a.length
 y=z-1
 if(0>=z)return H.e(a,0)
@@ -11862,71 +11021,74 @@
 v=p
 y=w}else{u.push(2)
 v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},"$1","fZ",2,0,null,260,[]],
-rB:[function(a,b,c){var z,y,x
-for(z=J.U6(a),y=J.U6(b),x=0;x<c;++x)if(!J.de(z.t(a,x),y.t(b,x)))return x
-return c},"$3","QI",6,0,null,261,[],262,[],263,[]],
-xU:[function(a,b,c){var z,y,x,w,v,u
+x=s}}}return H.VM(new H.iK(u),[null]).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)
+if(!J.xC(x,b[y]))return y}return c},
+xU:function(a,b,c){var z,y,x,w,v
 z=J.U6(a)
 y=z.gB(a)
-x=J.U6(b)
-w=x.gB(b)
-v=0
-while(!0){if(v<c){y=J.xH(y,1)
-u=z.t(a,y)
-w=J.xH(w,1)
-u=J.de(u,x.t(b,w))}else u=!1
-if(!u)break;++v}return v},"$3","M9",6,0,null,261,[],262,[],263,[]],
-jj:[function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+x=b.length
+w=0
+while(!0){if(w<c){--y
+v=z.t(a,y);--x
+if(x<0||x>=b.length)return H.e(b,x)
+v=J.xC(v,b[x])}else v=!1
+if(!v)break;++w}return w},
+jj:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=J.Wx(c)
-y=J.Wx(f)
-x=P.J(z.W(c,b),y.W(f,e))
-w=J.x(b)
-v=w.n(b,0)&&e===0?G.rB(a,d,x):0
-u=z.n(c,J.q8(a))&&y.n(f,J.q8(d))?G.xU(a,d,x-v):0
-b=w.g(b,v)
-e+=v
-c=z.W(c,u)
-f=y.W(f,u)
+y=P.J(z.W(c,b),f-e)
+x=J.x(b)
+w=x.n(b,0)&&e===0?G.rN(a,d,y):0
+v=z.n(c,J.q8(a))&&f===d.length?G.xU(a,d,y-w):0
+b=x.g(b,w)
+e+=w
+c=z.W(c,v)
+f-=v
 z=J.Wx(c)
-if(J.de(z.W(c,b),0)&&J.de(J.xH(f,e),0))return C.xD
-if(J.de(b,c)){t=[]
-z=new P.Yp(t)
+if(J.xC(z.W(c,b),0)&&f-e===0)return C.xD
+if(J.xC(b,c)){u=[]
+z=new P.Yp(u)
 z.$builtinTypeInfo=[null]
-s=new G.DA(a,z,t,b,0)
-if(typeof f!=="number")return H.s(f)
-z=J.U6(d)
-for(;e<f;e=r){r=e+1
-J.wT(s.Il,z.t(d,e))}return[s]}else if(e===f){z=z.W(c,b)
-t=[]
-y=new P.Yp(t)
-y.$builtinTypeInfo=[null]
-return[new G.DA(a,y,t,b,z)]}q=G.Mw(G.f6(a,b,c,d,e,f))
-p=[]
-p.$builtinTypeInfo=[G.DA]
-for(z=J.U6(d),o=e,n=b,s=null,m=0;m<q.length;++m)switch(q[m]){case 0:if(s!=null){p.push(s)
-s=null}n=J.WB(n,1);++o
+t=new G.DA(a,z,u,b,0)
+for(;e<f;e=s){z=t.Il
+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))
+q=[]
+q.$builtinTypeInfo=[G.DA]
+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(s==null){t=[]
-y=new P.Yp(t)
-y.$builtinTypeInfo=[null]
-s=new G.DA(a,y,t,n,0)}s.dM=J.WB(s.dM,1)
-n=J.WB(n,1)
-J.wT(s.Il,z.t(d,o));++o
+case 1:if(t==null){u=[]
+z=new P.Yp(u)
+z.$builtinTypeInfo=[null]
+t=new G.DA(a,z,u,o,0)}t.dM=J.WB(t.dM,1)
+o=J.WB(o,1)
+z=t.Il
+if(p>>>0!==p||p>=d.length)return H.e(d,p)
+J.bi(z,d[p]);++p
 break
-case 2:if(s==null){t=[]
-y=new P.Yp(t)
-y.$builtinTypeInfo=[null]
-s=new G.DA(a,y,t,n,0)}s.dM=J.WB(s.dM,1)
-n=J.WB(n,1)
+case 2:if(t==null){u=[]
+z=new P.Yp(u)
+z.$builtinTypeInfo=[null]
+t=new G.DA(a,z,u,o,0)}t.dM=J.WB(t.dM,1)
+o=J.WB(o,1)
 break
-case 3:if(s==null){t=[]
-y=new P.Yp(t)
-y.$builtinTypeInfo=[null]
-s=new G.DA(a,y,t,n,0)}J.wT(s.Il,z.t(d,o));++o
-break}if(s!=null)p.push(s)
-return p},"$6","mu",12,0,null,254,[],255,[],256,[],257,[],258,[],259,[]],
-m1:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+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.Il
+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)
+return q},
+m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
 z=J.RE(b)
 y=z.gWA(b)
 z=z.gvH(b)
@@ -11941,64 +11103,60 @@
 q.jr=J.WB(q.jr,s)
 if(t)continue
 z=u.jr
-y=J.WB(z,J.q8(u.ok.G4))
+y=J.WB(z,u.Uj.G4.length)
 x=q.jr
 p=P.J(y,J.WB(x,q.dM))-P.y(z,x)
-if(p>=0){C.Nm.KI(a,r);--r
-z=J.xH(q.dM,J.q8(q.ok.G4))
+if(p>=0){C.Nm.W4(a,r);--r
+z=J.xH(q.dM,q.Uj.G4.length)
 if(typeof z!=="number")return H.s(z)
 s-=z
-u.dM=J.WB(u.dM,J.xH(q.dM,p))
-o=J.xH(J.WB(J.q8(u.ok.G4),J.q8(q.ok.G4)),p)
-if(J.de(u.dM,0)&&J.de(o,0))t=!0
-else{n=q.Il
-if(J.u6(u.jr,q.jr)){z=u.ok
+z=J.WB(u.dM,J.xH(q.dM,p))
+u.dM=z
+y=u.Uj.G4.length
+x=q.Uj.G4.length
+if(J.xC(z,0)&&y+x-p===0)t=!0
+else{o=q.Il
+if(J.u6(u.jr,q.jr)){z=u.Uj
 z=z.Mu(z,0,J.xH(q.jr,u.jr))
-n.toString
-if(typeof n!=="object"||n===null||!!n.fixed$length)H.vh(P.f("insertAll"))
-H.IC(n,0,z)}if(J.z8(J.WB(u.jr,J.q8(u.ok.G4)),J.WB(q.jr,q.dM))){z=u.ok
-J.bj(n,z.Mu(z,J.xH(J.WB(q.jr,q.dM),u.jr),J.q8(u.ok.G4)))}u.Il=n
-u.ok=q.ok
+o.toString
+if(typeof o!=="object"||o===null||!!o.fixed$length)H.vh(P.f("insertAll"))
+H.IC(o,0,z)}if(J.xZ(J.WB(u.jr,u.Uj.G4.length),J.WB(q.jr,q.dM))){z=u.Uj
+J.bj(o,z.Mu(z,J.xH(J.WB(q.jr,q.dM),u.jr),u.Uj.G4.length))}u.Il=o
+u.Uj=q.Uj
 if(J.u6(q.jr,u.jr))u.jr=q.jr
-t=!1}}else if(J.u6(u.jr,q.jr)){C.Nm.xe(a,r,u);++r
-m=J.xH(u.dM,J.q8(u.ok.G4))
-q.jr=J.WB(q.jr,m)
-if(typeof m!=="number")return H.s(m)
-s+=m
-t=!0}else t=!1}if(!t)a.push(u)},"$2","pE",4,0,null,264,[],29,[]],
-xl:[function(a,b){var z,y
+t=!1}}else if(J.u6(u.jr,q.jr)){C.Nm.aP(a,r,u);++r
+n=J.xH(u.dM,u.Uj.G4.length)
+q.jr=J.WB(q.jr,n)
+if(typeof n!=="number")return H.s(n)
+s+=n
+t=!0}else t=!1}if(!t)a.push(u)},
+xl:function(a,b){var z,y
 z=H.VM([],[G.DA])
 for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},"$2","l0",4,0,null,76,[],265,[]],
-u2:[function(a,b){var z,y,x,w,v,u
-if(b.length===1)return b
+return z},
+Qi:function(a,b){var z,y,x,w,v,u
+if(b.length<=1)return b
 z=[]
-for(y=G.xl(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=a.ao;y.G();){w=y.lo
-if(J.de(w.gNg(),1)&&J.de(J.q8(w.gRt().G4),1)){v=J.i4(w.gRt().G4,0)
+for(y=G.xl(a,b),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=a.Jo;y.G();){w=y.lo
+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]
 u=J.zj(w)
 if(u>>>0!==u||u>=x.length)return H.e(x,u)
-if(!J.de(v,x[u]))z.push(w)
+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.gIl(),0,J.q8(w.gRt().G4)))}return z},"$2","W5",4,0,null,76,[],265,[]],
+C.Nm.FV(z,G.jj(a,v.gvH(w),J.WB(v.gvH(w),w.gNg()),w.gIl(),0,w.gRt().G4.length))}return z},
 DA:{
-"^":"a;WA>,ok,Il<,jr,dM",
+"^":"a;WA>,Uj,Il<,jr,dM",
 gvH:function(a){return this.jr},
-gRt:function(){return this.ok},
+gRt:function(){return this.Uj},
 gNg:function(){return this.dM},
-ck:function(a){var z=this.jr
-if(typeof z!=="number")return H.s(z)
-z=a<z
-if(z)return!1
-if(!J.de(this.dM,J.q8(this.ok.G4)))return!0
-z=J.WB(this.jr,this.dM)
-if(typeof z!=="number")return H.s(z)
-return a<z},
 bu:function(a){var z,y
 z="#<ListChangeRecord index: "+H.d(this.jr)+", removed: "
-y=this.ok
+y=this.Uj
 return z+y.bu(y)+", addedCount: "+H.d(this.dM)+">"},
 $isDA:true,
-static:{XM:function(a,b,c,d){var z
+static:{K6:function(a,b,c,d){var z
 if(d==null)d=[]
 if(c==null)c=0
 z=new P.Yp(d)
@@ -12010,53 +11168,52 @@
 vly:{
 "^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
 "^":"",
-Wi:[function(a,b,c,d){var z=J.RE(a)
-if(z.gnz(a)&&!J.de(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},"$4","Ha",8,0,null,101,[],266,[],242,[],243,[]],
+Wi:function(a,b,c,d){var z=J.RE(a)
+if(z.gnz(a)&&!J.xC(c,d))z.SZ(a,H.VM(new T.qI(a,b,c,d),[null]))
+return d},
 d3:{
 "^":"a;",
 $isd3:true},
-lS:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z,y,x,w,v
+ic:{
+"^":"Xs:50;a,b",
+$2:function(a,b){var z,y,x,w,v
 z=this.b
-y=z.wv.rN(a).gAx()
-if(!J.de(b,y)){x=this.a
+y=$.cp().jD(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]))
-z.V2.u(0,a,y)}},"$2",null,4,0,null,12,[],242,[],"call"],
+z.V2.u(0,a,y)}},
 $isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
 "^":"",
-xh:{
-"^":"Pi;L1,AP,fn",
-gP:[function(a){return this.L1},null,null,1,0,function(){return H.IG(function(a){return{func:"Oy",ret:a}},this.$receiver,"xh")},"value",308],
-sP:[function(a,b){this.L1=F.Wi(this,C.ls,this.L1,b)},null,null,3,0,function(){return H.IG(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"xh")},243,[],"value",308],
-bu:function(a){return"#<"+H.d(new H.cu(H.dJ(this),null))+" value: "+H.d(this.L1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
+iR:{
+"^":"Pi;",
+gP:function(a){return this.u1},
+sP:function(a,b){this.u1=F.Wi(this,C.YI,this.u1,b)},
+bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.u1)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
 "^":"",
 wn:{
-"^":"er;b3,xg,ao,AP,fn",
-gvp:function(){var z=this.xg
-if(z==null){z=P.bK(new Q.Bj(this),null,!0,null)
-this.xg=z}z.toString
+"^":"uFU;ID@,IO,Jo,AP,fn",
+gRT:function(){var z=this.IO
+if(z==null){z=P.bK(new Q.cj(this),null,!0,null)
+this.IO=z}z.toString
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:[function(a){return this.ao.length},null,null,1,0,487,"length",308],
-sB:[function(a,b){var z,y,x,w,v,u
-z=this.ao
+gB:function(a){return this.Jo.length},
+sB:function(a,b){var z,y,x,w,v
+z=this.Jo
 y=z.length
 if(y===b)return
 this.ct(this,C.Wn,y,b)
 x=y===0
-w=J.x(b)
-this.ct(this,C.ai,x,w.n(b,0))
-this.ct(this,C.nZ,!x,!w.n(b,0))
-x=this.xg
-if(x!=null){v=x.iE
-x=v==null?x!=null:v!==x}else x=!1
-if(x)if(w.C(b,y)){if(w.C(b,0)||w.D(b,z.length))H.vh(P.TE(b,0,z.length))
-if(typeof b!=="number")return H.s(b)
+w=b===0
+this.ct(this,C.ai,x,w)
+this.ct(this,C.nZ,!x,!w)
+x=this.IO
+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(y<b||y>z.length)H.vh(P.TE(y,b,z.length))
 x=new H.nH(z,b,y)
 x.$builtinTypeInfo=[null]
@@ -12066,67 +11223,63 @@
 x=x.br(0)
 w=new P.Yp(x)
 w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,x,b,0))}else{x=w.W(b,y)
-u=[]
-w=new P.Yp(u)
-w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,u,y,x))}C.Nm.sB(z,b)},null,null,3,0,363,30,[],"length",308],
-t:[function(a,b){var z=this.ao
+this.b4(new G.DA(this,w,x,b,0))}else{v=[]
+x=new P.Yp(v)
+x.$builtinTypeInfo=[null]
+this.b4(new G.DA(this,x,v,y,b-y))}C.Nm.sB(z,b)},
+t:function(a,b){var z=this.Jo
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},"$1","gIA",2,0,function(){return H.IG(function(a){return{func:"Zg",ret:a,args:[J.bU]}},this.$receiver,"wn")},15,[],"[]",308],
-u:[function(a,b,c){var z,y,x,w
-z=this.ao
+return z[b]},
+u:function(a,b,c){var z,y,x,w
+z=this.Jo
 if(b>>>0!==b||b>=z.length)return H.e(z,b)
 y=z[b]
-x=this.xg
+x=this.IO
 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)
-z[b]=c},"$2","gj3",4,0,function(){return H.IG(function(a){return{func:"l7",void:true,args:[J.bU,a]}},this.$receiver,"wn")},15,[],30,[],"[]=",308],
-gl0:[function(a){return P.lD.prototype.gl0.call(this,this)},null,null,1,0,307,"isEmpty",308],
-gor:[function(a){return P.lD.prototype.gor.call(this,this)},null,null,1,0,307,"isNotEmpty",308],
+this.b4(new G.DA(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)},
 Mh:function(a,b,c){var z,y,x
 z=J.x(c)
-if(!z.$isList&&!z.$isz5)c=z.br(c)
+if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.xg
+z=this.IO
 if(z!=null){x=z.iE
 z=x==null?z!=null:x!==z}else z=!1
-if(z&&J.z8(y,0)){z=this.ao
-H.K0(z,b,y)
-this.iH(G.XM(this,b,y,H.q9(z,b,y,null).br(0)))}H.ed(this.ao,b,c)},
+if(z&&y>0){z=this.Jo
+H.xF(z,b,y)
+this.b4(G.K6(this,b,y,H.j5(z,b,y,null).br(0)))}H.xr(this.Jo,b,c)},
 h:function(a,b){var z,y,x,w
-z=this.ao
+z=this.Jo
 y=z.length
-this.nU(y,y+1)
-x=this.xg
+this.n9(y,y+1)
+x=this.IO
 if(x!=null){w=x.iE
 x=w==null?x!=null:w!==x}else x=!1
-if(x)this.iH(G.XM(this,y,1,null))
+if(x)this.b4(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.Jo
 y=z.length
 C.Nm.FV(z,b)
-this.nU(y,z.length)
+this.n9(y,z.length)
 x=z.length-y
-z=this.xg
+z=this.IO
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.iH(G.XM(this,y,x,null))},
-Rz:function(a,b){var z,y
-for(z=this.ao,y=0;y<z.length;++y)if(J.de(z[y],b)){this.UZ(0,y,y+1)
-return!0}return!1},
+if(z&&x>0)this.b4(G.K6(this,y,x,null))},
 UZ: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)))
-y=!(c<b)
-if(!y||c>this.ao.length)H.vh(P.TE(c,b,this.gB(this)))
+if(!z||b>this.Jo.length)H.vh(P.TE(b,0,this.gB(this)))
+y=c>=b
+if(!y||c>this.Jo.length)H.vh(P.TE(c,b,this.gB(this)))
 x=c-b
-w=this.ao
+w=this.Jo
 v=w.length
 u=v-x
 this.ct(this,C.Wn,v,u)
@@ -12134,7 +11287,7 @@
 u=u===0
 this.ct(this,C.ai,t,u)
 this.ct(this,C.nZ,!t,!u)
-u=this.xg
+u=this.IO
 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))
@@ -12147,118 +11300,137 @@
 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.b4(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
+UG:function(a,b,c){var z,y,x,w
+if(b<0||b>this.Jo.length)throw H.b(P.TE(b,0,this.gB(this)))
 z=J.x(c)
-if(!z.$isList&&!z.$isz5)c=z.br(c)
+if(!z.$isWO&&!0)c=z.br(c)
 y=J.q8(c)
-z=this.ao
+z=this.Jo
 x=z.length
-if(typeof y!=="number")return H.s(y)
 C.Nm.sB(z,x+y)
 w=z.length
 H.qG(z,b+y,w,this,b)
-H.ed(z,b,c)
-this.nU(x,z.length)
-z=this.xg
+H.xr(z,b,c)
+this.n9(x,z.length)
+z=this.IO
 if(z!=null){w=z.iE
 z=w==null?z!=null:w!==z}else z=!1
-if(z&&y>0)this.iH(G.XM(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(z&&y>0)this.b4(G.K6(this,b,y,null))},
+aP:function(a,b,c){var z,y,x
+if(b>this.Jo.length)throw H.b(P.TE(b,0,this.gB(this)))
+z=this.Jo
 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.nU(y-1,y)
-y=this.xg
+this.n9(y-1,y)
+y=this.IO
 if(y!=null){x=y.iE
 y=x==null?y!=null:x!==y}else y=!1
-if(y)this.iH(G.XM(this,b,1,null))
+if(y)this.b4(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.xg
+b4:function(a){var z,y
+z=this.IO
 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)},
-nU:function(a,b){var z,y
+if(this.ID==null){this.ID=[]
+P.rb(this.gL6())}this.ID.push(a)},
+n9:function(a,b){var z,y
 this.ct(this,C.Wn,a,b)
 z=a===0
-y=J.x(b)
-this.ct(this,C.ai,z,y.n(b,0))
-this.ct(this,C.nZ,!z,!y.n(b,0))},
-Lu:[function(){var z,y,x
-z=this.b3
+y=b===0
+this.ct(this,C.ai,z,y)
+this.ct(this,C.nZ,!z,!y)},
+cv:[function(){var z,y,x
+z=this.ID
 if(z==null)return!1
-y=G.u2(this,z)
-this.b3=null
-z=this.xg
+y=G.Qi(this,z)
+this.ID=null
+z=this.IO
 if(z!=null){x=z.iE
 x=x==null?z!=null:x!==z}else x=!1
-if(x){x=H.VM(new P.Yp(y),[G.DA])
+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,307],
+return!0}return!1},"$0","gL6",0,0,76],
 $iswn:true,
 static:{uX:function(a,b){var z=H.VM([],[b])
-return H.VM(new Q.wn(null,null,z,null,null),[b])}}},
-er:{
-"^":"ar+Pi;",
+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
+if(a===b)throw H.b(P.u("can't use same list for previous and current"))
+for(z=J.mY(c),y=J.w1(b);z.G();){x=z.gl()
+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)
+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))
+r=J.Wx(u)
+if(r.C(u,w)||r.D(u,a.length))H.vh(P.TE(u,w,a.length))
+q=r.W(u,w)
+p=t.gB(t)
+r=J.Wx(q)
+if(r.F(q,p)){o=r.W(q,p)
+n=s.g(w,p)
+s=a.length
+if(typeof o!=="number")return H.s(o)
+m=s-o
+H.qG(a,w,n,t,0)
+if(o!==0){H.qG(a,n,m,a,u)
+C.Nm.sB(a,m)}}else{o=J.xH(p,q)
+r=a.length
+if(typeof o!=="number")return H.s(o)
+l=r+o
+n=s.g(w,p)
+C.Nm.sB(a,l)
+H.qG(a,n,l,a,u)
+H.qG(a,w,n,t,0)}}}}},
+uFU:{
+"^":"rm+Pi;",
 $isd3:true},
-Bj:{
-"^":"Tp:115;a",
-$0:[function(){this.a.xg=null},"$0",null,0,0,null,"call"],
+cj:{
+"^":"Xs:47;a",
+$0:function(){this.a.IO=null},
 $isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
 "^":"",
-HA:{
-"^":"yj;G3>,jL>,zZ>,JD,dr",
+ya:{
+"^":"yj;G3>,jL,zZ,aC,w5",
 bu:function(a){var z
-if(this.JD)z="insert"
-else z=this.dr?"remove":"set"
+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)+">"},
-$isHA:true},
+$isya:true},
 qC:{
 "^":"Pi;Zp,AP,fn",
-gvc:[function(){return this.Zp.gvc()},null,null,1,0,function(){return H.IG(function(a,b){return{func:"T0",ret:[P.QV,a]}},this.$receiver,"qC")},"keys",308],
-gUQ:[function(a){var z=this.Zp
-return z.gUQ(z)},null,null,1,0,function(){return H.IG(function(a,b){return{func:"dtC",ret:[P.QV,b]}},this.$receiver,"qC")},"values",308],
-gB:[function(a){var z=this.Zp
-return z.gB(z)},null,null,1,0,487,"length",308],
-gl0:[function(a){var z=this.Zp
-return z.gB(z)===0},null,null,1,0,307,"isEmpty",308],
-gor:[function(a){var z=this.Zp
-return z.gB(z)!==0},null,null,1,0,307,"isNotEmpty",308],
-di:[function(a){return this.Zp.di(a)},"$1","gmc",2,0,488,30,[],"containsValue",308],
-x4:[function(a){return this.Zp.x4(a)},"$1","gV9",2,0,488,49,[],"containsKey",308],
-t:[function(a,b){return this.Zp.t(0,b)},"$1","gIA",2,0,function(){return H.IG(function(a,b){return{func:"JB",ret:b,args:[P.a]}},this.$receiver,"qC")},49,[],"[]",308],
-u:[function(a,b,c){var z,y,x,w,v
-z=this.Zp
-y=z.gB(z)
-x=z.t(0,b)
+gvc:function(){return this.Zp.gvc()},
+gUQ:function(a){var z=this.Zp
+return z.gUQ(z)},
+gB:function(a){var z=this.Zp
+return z.gB(z)},
+gl0:function(a){var z=this.Zp
+return z.gB(z)===0},
+gor:function(a){var z=this.Zp
+return z.gB(z)!==0},
+t:function(a,b){return this.Zp.t(0,b)},
+u:function(a,b,c){var z,y,x,w
+z=this.AP
+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
+x=z.gB(z)
+w=z.t(0,b)
 z.u(0,b,c)
-w=this.AP
-if(w!=null){v=w.iE
-w=v==null?w!=null:v!==w}else w=!1
-if(w){z=z.gB(z)
-if(y!==z){F.Wi(this,C.Wn,y,z)
-this.nq(this,H.VM(new V.HA(b,null,c,!0,!1),[null,null]))}else if(!J.de(x,c))this.nq(this,H.VM(new V.HA(b,x,c,!1,!1),[null,null]))}},"$2","gj3",4,0,function(){return H.IG(function(a,b){return{func:"un",void:true,args:[a,b]}},this.$receiver,"qC")},49,[],30,[],"[]=",308],
+if(x!==z.gB(z)){F.Wi(this,C.Wn,x,z.gB(z))
+this.SZ(this,H.VM(new V.ya(b,null,c,!0,!1),[null,null]))
+this.G8()}else if(!J.xC(w,c)){this.SZ(this,H.VM(new V.ya(b,w,c,!1,!1),[null,null]))
+this.SZ(this,H.VM(new T.qI(this,C.Yn,null,null),[null]))}},
 FV:function(a,b){J.kH(b,new V.zT(this))},
-Rz:function(a,b){var z,y,x,w,v
-z=this.Zp
-y=z.gB(z)
-x=z.Rz(0,b)
-w=this.AP
-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.HA(b,x,null,!1,!0),[null,null]))
-F.Wi(this,C.Wn,y,z.gB(z))}return x},
 V1:function(a){var z,y,x,w
 z=this.Zp
 y=z.gB(z)
@@ -12266,2023 +11438,2076 @@
 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)}z.V1(0)},
+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)},
+G8:function(){this.SZ(this,H.VM(new T.qI(this,C.Yy,null,null),[null]))
+this.SZ(this,H.VM(new T.qI(this,C.Yn,null,null),[null]))},
 $isqC:true,
 $isZ0:true,
-static:{WF:function(a,b,c){var z=V.Bq(a,b,c)
-z.FV(0,a)
-return z},Bq:function(a,b,c){var z,y
-z=J.x(a)
-if(!!z.$isNb)y=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
-else y=!!z.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.Py(null,null,null,b,c),null,null),[b,c])
-return y}}},
+static:{AB:function(a,b,c){var z
+if(!!a.$isBa)z=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
+else z=!!a.$isFo?H.VM(new V.qC(P.L5(null,null,null,b,c),null,null),[b,c]):H.VM(new V.qC(P.YM(null,null,null,b,c),null,null),[b,c])
+return z}}},
 zT:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,49,[],30,[],"call"],
+"^":"Xs;a",
+$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,51,16,"call"],
 $isEH:true,
 $signature:function(){return H.IG(function(a,b){return{func:"Bi",args:[a,b]}},this.a,"qC")}},
 Lo:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z=this.a
-z.nq(z,H.VM(new V.HA(a,b,null,!1,!0),[null,null]))},"$2",null,4,0,null,49,[],30,[],"call"],
-$isEH:true}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
+"^":"Xs:50;a",
+$2:function(a,b){var z=this.a
+z.SZ(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,{
 "^":"",
-Wa:[function(a,b){var z=J.x(a)
-if(!!z.$isqI)return J.de(a.oc,b)
-if(!!z.$isHA){z=J.x(b)
-if(!!z.$iswv)b=z.gfN(b)
-return J.de(a.G3,b)}return!1},"$2","Uv",4,0,null,29,[],49,[]],
-yf:[function(a,b){var z,y,x,w
+cc:{
+"^":"Ap;fq,Pc,op,Vq,qU",
+QI:function(a){return this.Pc.$1(a)},
+EO:function(a){return this.Vq.$1(a)},
+TR:function(a,b){var z
+this.Vq=b
+z=this.QI(J.mu(this.fq,this.gv7()))
+this.qU=z
+return z},
+jA:[function(a){var z=this.QI(a)
+if(J.xC(z,this.qU))return
+this.qU=z
+return this.EO(z)},"$1","gv7",2,0,30,35],
+S6:function(a){var z=this.fq
+if(z!=null)J.x0(z)
+this.fq=null
+this.Pc=null
+this.op=null
+this.Vq=null
+this.qU=null},
+gP:function(a){var z=this.QI(J.Vm(this.fq))
+this.qU=z
+return z},
+sP:function(a,b){J.Fc(this.fq,b)}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
+"^":"",
+yf:function(a,b){var z,y,x,w,v
 if(a==null)return
-x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$iswv){z=H.vn(a)
-y=H.jO(J.bB(z.gAx()).LU)
-try{if(L.TH(y,b)){x=z.rN(b).gAx()
-return x}if(L.M6(y,C.fz)){x=J.UQ(a,J.GL(b))
-return x}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
-if(x.Im(C.Ek))x.x9("can't get "+H.d(b)+" in "+H.d(a))
-return},"$2","MT",4,0,null,6,[],74,[]],
-ir:[function(a,b,c){var z,y,x,w
+z=b
+if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a)))return J.UQ(a,b)}else if(!!J.x(b).$isIN){z=a
+y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
+if(!y){z=a
+y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
+z=y&&!C.Nm.tg(C.WK,b)}else z=!0
+if(z)return J.UQ(a,$.b7().eB.t(0,b))
+try{z=a
+y=b
+x=$.cp().Gu.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)).$isMC){z=J.bB(a)
+v=$.mX().Qk(z,C.OV)
+if(!(v!=null&&v.fY===C.it&&!v.Fo))throw w}else throw w}}z=$.Ku()
+if(z.Im(C.Ab))z.x9("can't get "+H.d(b)+" in "+H.d(a))
+return},
+h6:function(a,b,c){var z,y,x
 if(a==null)return!1
-x=b
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(a).$isList&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
-return!0}}else if(!!J.x(b).$iswv){z=H.vn(a)
-y=H.jO(J.bB(z.gAx()).LU)
-try{if(L.dR(y,b)){x=c
-z.tu(b,2,[x],C.CM)
-H.vn(x)
-return!0}if(L.M6(y,C.eC)){J.kW(a,J.GL(b),c)
-return!0}}catch(w){if(!!J.x(H.Ru(w)).$ismp){if(!L.M6(y,C.OV))throw w}else throw w}}x=$.aT()
-if(x.Im(C.Ek))x.x9("can't set "+H.d(b)+" in "+H.d(a))
-return!1},"$3","J6",6,0,null,6,[],74,[],30,[]],
-TH:[function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().nb
-if(z.x4(b))return!0
-if(z.x4(C.OV))return!0
-a=L.pY(a)}return!1},"$2","fY",4,0,null,11,[],12,[]],
-dR:[function(a,b){var z,y
-z=new H.GD(H.u1(H.d(b.gfN(b))+"="))
-for(;!J.de(a,$.aA());){y=a.gYK().nb
-if(!!J.x(y.t(0,b)).$isRY)return!0
-if(y.x4(z))return!0
-if(y.x4(C.OV))return!0
-a=L.pY(a)}return!1},"$2","we",4,0,null,11,[],12,[]],
-M6:[function(a,b){var z
-for(;!J.de(a,$.aA());){z=a.gYK().nb.t(0,b)
-if(!!J.x(z).$isRS&&z.guU())return!0
-a=L.pY(a)}return!1},"$2","Wt",4,0,null,11,[],12,[]],
-pY:[function(a){var z,y
-try{z=a.gAY()
-return z}catch(y){H.Ru(y)
-return $.aA()}},"$1","WV",2,0,null,11,[]],
-cB:[function(a){a=J.JA(a,$.c3(),"")
+z=b
+if(typeof z==="number"&&Math.floor(z)===z){if(!!J.x(a).$isWO&&J.J5(b,0)&&J.u6(b,J.q8(a))){J.kW(a,b,c)
+return!0}}else if(!!J.x(b).$isIN){z=a
+y=H.RB(z,"$isCo",[P.qU,null],"$asCo")
+if(!y){z=a
+y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
+z=y&&!C.Nm.tg(C.WK,b)}else z=!0
+if(z){J.kW(a,$.b7().eB.t(0,b),c)
+return!0}try{$.cp().Cq(a,b,c)
+return!0}catch(x){if(!!J.x(H.Ru(x)).$isMC){z=J.bB(a)
+if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.Ku()
+if(z.Im(C.Ab))z.x9("can't set "+H.d(b)+" in "+H.d(a))
+return!1},
+cB:function(a){a=J.rr(a)
 if(a==="")return!0
 if(0>=a.length)return H.e(a,0)
 if(a[0]===".")return!1
-return $.tN().zD(a)},"$1","wf",2,0,null,94,[]],
+return $.tN().zD(a)},
 WR:{
-"^":"Pi;ay,YB,BK,kN,cs,cT,AP,fn",
-E4:function(a){return this.cT.$1(a)},
-gWA:function(a){var z=this.kN
-if(0>=z.length)return H.e(z,0)
-return z[0]},
-gP:[function(a){var z,y
-if(!this.YB)return
-z=this.AP
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z)this.ov()
-return C.Nm.grZ(this.kN)},null,null,1,0,115,"value",308],
-sP:[function(a,b){var z,y,x,w
-z=this.BK
+"^":"AR;I3,pn,LG,jR,xX,jB,Hy",
+gEQ:function(){return this.I3==null},
+sP:function(a,b){var z=this.I3
+if(z!=null)z.rL(this.pn,b)},
+gX6:function(){return 2},
+TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
+BB:function(){this.LG=L.BH(this,this.pn)
+this.Oq(!0)},
+fV:function(){this.Hy=null
+this.I3=null
+this.pn=null},
+GA:function(a){this.I3.kJ(this.pn,a)},
+Oq:function(a){var z,y
+z=this.Hy
+y=this.I3.Tl(this.pn)
+this.Hy=y
+if(a||J.xC(y,z))return!1
+this.WP(this.Hy,z)
+return!0},
+Pz:function(){return this.Oq(!1)},
+$isAp:true},
+Tv:{
+"^":"a;Ih",
+gB:function(a){return this.Ih.length},
+gl0:function(a){return this.Ih.length===0},
+gPu:function(){return!0},
+bu:function(a){if(!this.gPu())return"<invalid path>"
+return H.VM(new H.lJ(this.Ih,new L.f7()),[null,null]).zV(0,".")},
+n:function(a,b){var z,y,x,w,v
+if(b==null)return!1
+if(this===b)return!0
+if(!J.x(b).$isTv)return!1
+if(this.gPu()!==b.gPu())return!1
+z=this.Ih
 y=z.length
-if(y===0)return
-x=this.AP
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-if(!x)this.Zy(y-1)
-x=this.kN
-w=y-1
-if(w<0||w>=x.length)return H.e(x,w)
-x=x[w]
-if(w>=z.length)return H.e(z,w)
-if(L.ir(x,z[w],b)){z=this.kN
-if(y>=z.length)return H.e(z,y)
-z[y]=b}},null,null,3,0,489,243,[],"value",308],
-k0:[function(a){O.Pi.prototype.k0.call(this,this)
-this.ov()
-this.XI()},"$0","gqw",0,0,126],
-ni:[function(a){var z,y
-for(z=0;y=this.cs,z<y.length;++z){y=y[z]
-if(y!=null){y.ed()
-y=this.cs
-if(z>=y.length)return H.e(y,z)
-y[z]=null}}O.Pi.prototype.ni.call(this,this)},"$0","gl1",0,0,126],
-Zy:function(a){var z,y,x,w,v,u
-if(a==null)a=this.BK.length
-z=this.BK
+x=b.Ih
+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.Ih,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
+x=536870911&x+((524287&x)<<10>>>0)
+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
+if(!this.gPu())return
+for(z=this.Ih,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+if(a==null)return
+a=L.yf(a,y)}return a},
+rL:function(a,b){var z,y,x
+z=this.Ih
 y=z.length-1
-if(typeof a!=="number")return H.s(a)
-x=this.cT!=null
-w=0
-for(;w<a;){v=this.kN
-if(w>=v.length)return H.e(v,w)
-v=v[w]
-if(w>=z.length)return H.e(z,w)
-u=L.yf(v,z[w])
-if(w===y&&x)u=this.E4(u)
-v=this.kN;++w
-if(w>=v.length)return H.e(v,w)
-v[w]=u}},
-ov:function(){return this.Zy(null)},
-hd:function(a){var z,y,x,w,v,u,t,s,r
-for(z=this.BK,y=z.length-1,x=this.cT!=null,w=a,v=null,u=null;w<=y;w=s){t=this.kN
-s=w+1
-r=t.length
-if(s>=r)return H.e(t,s)
-v=t[s]
-if(w>=r)return H.e(t,w)
-t=t[w]
-if(w>=z.length)return H.e(z,w)
-u=L.yf(t,z[w])
-if(w===y&&x)u=this.E4(u)
-if(v==null?u==null:v===u){this.Rl(a,w)
-return}t=this.kN
-if(s>=t.length)return H.e(t,s)
-t[s]=u}this.ij(a)
-if(this.gnz(this)&&!J.de(v,u)){z=new T.qI(this,C.ls,v,u)
-z.$builtinTypeInfo=[null]
-this.nq(this,z)}},
-Rl:function(a,b){var z,y
-if(b==null)b=this.BK.length
-if(typeof b!=="number")return H.s(b)
-z=a
-for(;z<b;++z){y=this.cs
-if(z>=y.length)return H.e(y,z)
-y=y[z]
-if(y!=null)y.ed()
-this.Kh(z)}},
-XI:function(){return this.Rl(0,null)},
-ij:function(a){return this.Rl(a,null)},
-Kh:function(a){var z,y,x,w,v
-z=this.kN
-if(a>=z.length)return H.e(z,a)
-y=z[a]
-z=this.BK
-if(a>=z.length)return H.e(z,a)
-x=z[a]
-if(typeof x==="number"&&Math.floor(x)===x){if(!!J.x(y).$iswn){z=this.cs
-w=y.gvp().w4(!1)
-v=w.Lj
-w.pN=v.cR(new L.Px(this,a,x))
-w.o7=P.VH(P.AY(),v)
-w.Bd=v.Al(P.v3())
-if(a>=z.length)return H.e(z,a)
-z[a]=w}}else{z=J.x(y)
-if(!!z.$isd3){v=this.cs
-w=z.gUj(y).w4(!1)
-z=w.Lj
-w.pN=z.cR(new L.C4(this,a,x))
-w.o7=P.VH(P.AY(),z)
-w.Bd=z.Al(P.v3())
-if(a>=v.length)return H.e(v,a)
-v[a]=w}}},
-d4:function(a,b,c){var z,y,x,w
-if(this.YB)for(z=J.rr(b).split("."),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]),y=this.BK;z.G();){x=z.lo
-if(J.de(x,""))continue
-w=H.BU(x,10,new L.qL())
-y.push(w!=null?w:new H.GD(H.u1(x)))}z=this.BK
-this.kN=H.VM(Array(z.length+1),[P.a])
-if(z.length===0&&c!=null)a=c.$1(a)
-y=this.kN
-if(0>=y.length)return H.e(y,0)
-y[0]=a
-this.cs=H.VM(Array(z.length),[P.MO])},
-$isWR:true,
-static:{Sk:function(a,b,c){var z=new L.WR(b,L.cB(b),H.VM([],[P.a]),null,null,c,null,null)
-z.d4(a,b,c)
-return z}}},
-qL:{
-"^":"Tp:116;",
-$1:[function(a){return},"$1",null,2,0,null,117,[],"call"],
+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.yf(a,z[x])}if(y>=z.length)return H.e(z,y)
+return L.h6(a,z[y],b)},
+kJ:function(a,b){var z,y,x,w
+if(!this.gPu()||this.Ih.length===0)return
+z=this.Ih
+y=z.length-1
+for(x=0;a!=null;x=w){b.$1(a)
+if(x>=y)break
+w=x+1
+if(x>=z.length)return H.e(z,x)
+a=L.yf(a,z[x])}},
+$isTv:true,
+static:{hk:function(a){var z,y,x,w,v,u,t,s
+if(!!J.x(a).$isWO){z=P.F(a,!1,null)
+y=new H.a7(z,z.length,0,null)
+y.$builtinTypeInfo=[H.Kp(z,0)]
+for(;y.G();){x=y.lo
+if((typeof x!=="number"||Math.floor(x)!==x)&&!J.x(x).$isIN)throw H.b(P.u("List must contain only ints and Symbols"))}return new L.Tv(z)}if(a==null)a=""
+w=$.fX().t(0,a)
+if(w!=null)return w
+if(!L.cB(a))return $.C4()
+v=[]
+y=J.rr(a).split(".")
+u=new H.a7(y,y.length,0,null)
+u.$builtinTypeInfo=[H.Kp(y,0)]
+for(;u.G();){x=u.lo
+if(J.xC(x,""))continue
+t=H.BU(x,10,new L.oq())
+v.push(t!=null?t:$.b7().d8.t(0,x))}w=new L.Tv(C.Nm.tt(v,!1))
+y=$.fX()
+if(y.X5>=100){y.toString
+u=new P.i5(y)
+u.$builtinTypeInfo=[H.Kp(y,0)]
+s=u.gA(u)
+if(!s.G())H.vh(H.DU())
+y.Rz(0,s.gl())}y.u(0,a,w)
+return w}}},
+oq:{
+"^":"Xs:30;",
+$1:function(a){return},
 $isEH:true},
-Px:{
-"^":"Tp:490;a,b,c",
-$1:[function(a){var z,y
-for(z=J.GP(a),y=this.c;z.G();)if(z.gl().ck(y)){this.a.hd(this.b)
-return}},"$1",null,2,0,null,265,[],"call"],
+f7:{
+"^":"Xs:30;",
+$1:[function(a){return!!J.x(a).$isIN?$.b7().eB.t(0,a):a},"$1",null,2,0,null,117,"call"],
 $isEH:true},
-C4:{
-"^":"Tp:491;d,e,f",
-$1:[function(a){var z,y
-for(z=J.GP(a),y=this.f;z.G();)if(L.Wa(z.gl(),y)){this.d.hd(this.e)
-return}},"$1",null,2,0,null,265,[],"call"],
+vH:{
+"^":"Tv;Ih",
+gPu:function(){return!1},
+static:{"^":"qa"}},
+MdQ:{
+"^":"Xs:47;",
+$0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.ol("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
 $isEH:true},
-Md:{
-"^":"Tp:115;",
-$0:[function(){return new H.VR(H.v4("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
+NV:{
+"^":"AR;LG,Bg,jR,xX,jB,Hy",
+gEQ:function(){return this.Bg==null},
+gX6:function(){return 3},
+TR:function(a,b){return L.AR.prototype.TR.call(this,this,b)},
+BB:function(){var z,y,x,w
+this.Oq(!0)
+for(z=this.Bg,y=z.length,x=0;x<y;x+=2){w=z[x]
+if(w!==C.dV){z=$.xG
+if(z!=null){y=z.zT
+y=y==null?w!=null:y!==w}else y=!0
+if(y){z=new L.zG(w,P.GV(null,null,null,null),null,null,!1)
+$.xG=z}z.R3.u(0,this.jR,this)
+this.GA(z.gTT())
+this.LG=null
+break}}},
+fV:function(){var z,y,x,w
+this.Hy=null
+for(z=0;y=this.Bg,x=y.length,z<x;z+=2)if(y[z]===C.dV){w=z+1
+if(w>=x)return H.e(y,w)
+J.x0(y[w])}this.Bg=null},
+yN:function(a,b){var z
+if(this.xX!=null||this.Bg==null)throw H.b(P.w("Cannot add paths once started."))
+if(!J.x(b).$isTv)b=L.hk(b)
+z=this.Bg
+z.push(a)
+z.push(b)},
+ti:function(a){return this.yN(a,null)},
+GA:function(a){var z,y,x,w,v
+for(z=0;y=this.Bg,x=y.length,z<x;z+=2){w=y[z]
+if(w!==C.dV){v=z+1
+if(v>=x)return H.e(y,v)
+H.Go(y[v],"$isTv").kJ(w,a)}}},
+Oq:function(a){var z,y,x,w,v,u,t,s,r
+J.wg(this.Hy,C.jn.cU(this.Bg.length,2))
+for(z=!1,y=null,x=0;w=this.Bg,v=w.length,x<v;x+=2){u=x+1
+if(u>=v)return H.e(w,u)
+t=w[u]
+s=w[x]
+if(s===C.dV){H.Go(t,"$isAp")
+r=t.gP(t)}else r=H.Go(t,"$isTv").Tl(s)
+if(a){J.kW(this.Hy,C.jn.cU(x,2),r)
+continue}w=this.Hy
+v=C.jn.cU(x,2)
+if(J.xC(r,J.UQ(w,v)))continue
+w=this.jB
+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.Hy,v))}J.kW(this.Hy,v,r)
+z=!0}if(!z)return!1
+this.JQ(this.Hy,y,w)
+return!0},
+Pz:function(){return this.Oq(!1)},
+$isAp:true},
+iNc:{
+"^":"a;"},
+AR:{
+"^":"Ap;jR<",
+d9:function(){return this.xX.$0()},
+hM:function(a){return this.xX.$1(a)},
+Lt:function(a,b){return this.xX.$2(a,b)},
+bO:function(a,b,c){return this.xX.$3(a,b,c)},
+gcF:function(){return this.xX!=null},
+TR:function(a,b){if(this.xX!=null||this.gEQ())throw H.b(P.w("Observer has already been opened."))
+if(X.Lx(b)>this.gX6())throw H.b(P.u("callback should take "+this.gX6()+" or fewer arguments"))
+this.xX=b
+this.jB=P.J(this.gX6(),X.aW(b))
+this.BB()
+return this.Hy},
+gP:function(a){this.Oq(!0)
+return this.Hy},
+S6:function(a){if(this.xX==null)return
+this.fV()
+this.Hy=null
+this.xX=null},
+di:[function(a){if(this.xX!=null)this.Fe()},"$1","gQ8",2,0,15,81],
+Fe:function(){var z=0
+while(!0){if(!(z<1000&&this.Pz()))break;++z}return z>0},
+JQ:function(a,b,c){var z,y,x,w
+try{switch(this.jB){case 0:this.d9()
+break
+case 1:this.hM(a)
+break
+case 2:this.Lt(a,b)
+break
+case 3:this.bO(a,b,c)
+break}}catch(x){w=H.Ru(x)
+z=w
+y=new H.oP(x,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0(z,y)}},
+WP:function(a,b){return this.JQ(a,b,null)}},
+zG:{
+"^":"a;zT,R3,ZY,bl,bV",
+TR:function(a,b){this.R3.u(0,b.gjR(),b)
+b.GA(this.gTT())},
+wE:[function(a){var z=J.x(a)
+if(!!z.$iswn)this.Uq(a.gRT())
+if(!!z.$isd3)this.Uq(z.gqh(a))},"$1","gTT",2,0,118],
+Uq:function(a){var z,y
+if(this.ZY==null)this.ZY=P.YM(null,null,null,null,null)
+z=this.bl
+y=z!=null?z.Rz(0,a):null
+if(y!=null)this.ZY.u(0,a,y)
+else if(!this.ZY.x4(a))this.ZY.u(0,a,a.yI(this.gp7()))},
+CH:[function(a){var z,y,x,w,v
+if(!this.bV)return
+z=this.bl
+if(z==null)z=P.YM(null,null,null,null,null)
+this.bl=this.ZY
+this.ZY=z
+for(y=this.R3,y=H.VM(new P.ro(y),[H.Kp(y,0),H.Kp(y,1)]),x=y.Fb,w=H.Kp(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.qv]),x.qT,x.bb,null),[H.Kp(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
+if(v.gcF())v.GA(this.gTT())}for(y=this.bl,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
+this.bl=null},"$0","gSI",0,0,13],
+Hi:[function(a){var z,y
+for(z=this.R3,z=H.VM(new P.ro(z),[H.Kp(z,0),H.Kp(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+if(y.gcF())y.Pz()}this.bV=!0
+P.rb(this.gSI(this))},"$1","gp7",2,0,15,119],
+static:{"^":"xG",BH:function(a,b){var z,y
+z=$.xG
+if(z!=null){y=z.zT
+y=y==null?b!=null:y!==b}else y=!0
+if(y){z=new L.zG(b,P.GV(null,null,null,null),null,null,!1)
+$.xG=z}z.R3.u(0,a.jR,a)
+a.GA(z.gTT())}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
 "^":"",
-Jk:[function(a){var z,y,x
+tB:[function(a){var z,y,x
 z=J.x(a)
 if(!!z.$isd3)return a
-if(!!z.$isZ0){y=V.Bq(a,null,null)
-z.aN(a,new R.km(y))
-return y}if(!!z.$isQV){z=z.ez(a,R.np())
+if(!!z.$isZ0){y=V.AB(a,null,null)
+z.aN(a,new R.yx(y))
+return y}if(!!z.$iscX){z=z.ez(a,R.Ft())
 x=Q.uX(null,null)
 x.FV(0,z)
-return x}return a},"$1","np",2,0,116,30,[]],
-km:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,R.Jk(a),R.Jk(b))},"$2",null,4,0,null,376,[],122,[],"call"],
+return x}return a},"$1","Ft",2,0,30,16],
+yx:{
+"^":"Xs:50;a",
+$2:function(a,b){this.a.u(0,R.tB(a),R.tB(b))},
 $isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
 "^":"",
-JX:[function(){var z,y
-z=document.createElement("style",null)
-J.c9(z,".polymer-veiled { opacity: 0; } \n.polymer-unveil{ -webkit-transition: opacity 0.3s; transition: opacity 0.3s; }\n")
-y=document.querySelector("head")
-y.insertBefore(z,y.firstChild)
-A.B2()
-$.mC().MM.ml(new A.Zj())},"$0","Ti",0,0,null],
-B2:[function(){var z,y,x
-for(z=$.IN(),z=H.VM(new H.a7(z,1,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-for(x=W.vD(document.querySelectorAll(y),null),x=x.gA(x);x.G();)J.wT(J.pP(x.lo),"polymer-veiled")}},"$0","Gi",0,0,null],
-yV:[function(a){var z,y
-z=$.xY().Rz(0,a)
-if(z!=null)for(y=J.GP(z);y.G();)J.Or(y.gl())},"$1","Km",2,0,null,12,[]],
-oF:[function(a,b){var z,y,x,w
-if(J.de(a,$.H8()))return b
-b=A.oF(a.gAY(),b)
-for(z=a.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
-if(y.gFo()||y.gq4())continue
-x=J.x(y)
-if(!(!!x.$isRY&&!x.gV5(y)))w=!!x.$isRS&&y.glT()
-else w=!0
-if(w)for(w=J.GP(y.gc9());w.G();)if(!!J.x(w.lo.gAx()).$isyL){if(!x.$isRS||A.bc(a,y)){if(b==null)b=P.Fl(null,null)
-b.u(0,y.gIf(),y)}break}}return b},"$2","Cd",4,0,null,267,[],268,[]],
-Oy:[function(a,b){var z,y
-do{z=a.gYK().nb.t(0,b)
-y=J.x(z)
-if(!!y.$isRS&&z.glT()&&A.bc(a,z)||!!y.$isRY)return z
-a=a.gAY()}while(!J.de(a,$.H8()))
-return},"$2","il",4,0,null,267,[],74,[]],
-bc:[function(a,b){var z,y
-z=H.u1(H.d(b.gIf().fN)+"=")
-y=a.gYK().nb.t(0,new H.GD(z))
-return!!J.x(y).$isRS&&y.ghB()},"$2","i8",4,0,null,267,[],269,[]],
-YG:[function(a,b,c){var z,y,x
-z=$.cM()
-if(z==null||a==null)return
-if(!z.Bm("ShadowDOMPolyfill"))return
-y=J.UQ(z,"Platform")
+oF:function(a,b){var z,y,x
+for(z=$.mX().Me(0,a,C.YV),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+x=J.RE(y)
+if(x.gV5(y)===!0)continue
+if(b==null)b=P.Fl(null,null)
+b.u(0,L.hk([x.goc(y)]),y)}return b},
+YG:function(a,b,c){var z,y
+if(a==null||$.Nc()!==!0)return
+z=J.UQ($.ca(),"Platform")
+if(z==null)return
+y=J.UQ(z,"ShadowCSS")
 if(y==null)return
-x=J.UQ(y,"ShadowCSS")
-if(x==null)return
-x.V7("shimStyling",[a,b,c])},"$3","OA",6,0,null,270,[],12,[],271,[]],
-Hl:[function(a){var z,y,x,w,v,u
+y.K9("shimStyling",[a,b,c])},
+Hl:function(a){var z,y,x,w,v
 if(a==null)return""
+if($.ok)return""
 w=J.RE(a)
 z=w.gmH(a)
-if(J.de(z,""))z=w.gQg(a).MW.getAttribute("href")
-w=$.cM()
-if(w!=null&&w.Bm("HTMLImports")){if(typeof a==="number"||typeof a==="string"||typeof a==="boolean"||!1)H.vh(P.u("object cannot be a num, string, bool, or null"))
-v=J.UQ(P.ND(P.wY(a)),"__resource")
-if(v!=null)return v
-$.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\"")
-return""}try{w=new XMLHttpRequest()
+if(J.xC(z,""))z=w.gQg(a).MW.getAttribute("href")
+try{w=new XMLHttpRequest()
 C.W3.eo(w,"GET",z,!1)
 w.send()
 w=w.responseText
-return w}catch(u){w=H.Ru(u)
-if(!!J.x(w).$isNh){y=w
-x=new H.XO(u,null)
-$.vM().J4("failed to get stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
-return""}else throw u}},"$1","NI",2,0,null,272,[]],
-Ad:[function(a,b){var z
-if(b==null)b=C.Tu
-$.Ej().u(0,a,b)
-z=$.p2().Rz(0,a)
-if(z!=null)J.Or(z)},"$2","ZK",2,2,null,85,12,[],11,[]],
-xv:[function(a){A.pb(a,new A.Mq())},"$1","N1",2,0,null,273,[]],
-pb:[function(a,b){var z
+return w}catch(v){w=H.Ru(v)
+if(!!J.x(w).$isBK){y=w
+x=new H.oP(v,null)
+$.Es().J4("failed to XHR stylesheet text href=\""+H.d(z)+"\" error: "+H.d(y)+", trace: "+H.d(x))
+return""}else throw v}},
+fS:[function(a){var z,y
+z=$.b7().eB.t(0,a)
+if(z==null)return!1
+y=J.rY(z)
+return y.Tc(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","NL",2,0,41,42],
+Ad:function(a,b){$.Ej().u(0,a,b)
+H.Go(J.UQ($.ca(),"Polymer"),"$isr7").PO([a])},
+xv:function(a){A.pb(a,new A.YC())},
+pb:function(a,b){var z
 if(a==null)return
 b.$1(a)
-for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},"$2","e0",4,0,null,273,[],164,[]],
-lJ:[function(a,b,c,d){if(!J.co(b,"on-"))return d.$3(a,b,c)
-return new A.L6(a,b)},"$4","y4",8,0,null,274,[],12,[],273,[],275,[]],
-z9:[function(a){var z
-for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-return $.od().t(0,a)},"$1","b4",2,0,null,273,[]],
-HR:[function(a,b,c){var z,y,x
-z=H.vn(a)
-y=A.Rk(H.jO(J.bB(z.Ax).LU),b)
-if(y!=null){x=y.gMP()
-x=x.ev(x,new A.uJ())
-C.Nm.sB(c,x.gB(x))}return z.CI(b,c).Ax},"$3","xi",6,0,null,48,[],276,[],19,[]],
-Rk:[function(a,b){var z
-do{z=a.gYK().nb.t(0,b)
-if(!!J.x(z).$isRS)return z
-a=a.gAY()}while(a!=null)},"$2","ov",4,0,null,11,[],12,[]],
-ZI:[function(a,b){var z,y
+for(z=a.firstChild;z!=null;z=z.nextSibling)A.pb(z,b)},
+pf:function(a,b,c){return new A.L6(a,b)},
+ZI:function(a,b){var z,y
 if(a==null)return
 z=document.createElement("style",null)
-J.c9(z,J.nJ(a))
+J.t3(z,J.dY(a))
 y=a.getAttribute("element")
 if(y!=null)z.setAttribute("element",y)
-b.appendChild(z)},"$2","tO",4,0,null,277,[],278,[]],
-pX:[function(){var z=window
-C.ol.hr(z)
-C.ol.oB(z,W.aF(new A.hm()))},"$0","ji",0,0,null],
-al:[function(a,b){var z,y,x
-z=J.x(b)
-y=!!z.$isRY?z.gt5(b):H.Go(b,"$isRS").gdw()
-z=J.RE(y)
-if(J.de(z.gUx(y),C.PU)||J.de(z.gUx(y),C.nN))if(a!=null){x=A.h5(a)
-if(x!=null)return P.re(x)
-return H.jO(J.bB(H.vn(a).Ax).LU)}return y},"$2","bP",4,0,null,30,[],74,[]],
-h5:[function(a){if(a==null)return C.Qf
-if(typeof a==="number"&&Math.floor(a)===a)return C.yw
-if(typeof a==="number")return C.O4
-if(typeof a==="boolean")return C.HL
-if(typeof a==="string")return C.Db
-if(!!J.x(a).$isiP)return C.Yc
-return},"$1","v9",2,0,null,30,[]],
-Ok:[function(){if($.uP){var z=$.X3.iT(O.Ht())
-z.Gr(A.PB())
-return z}A.ei()
-return $.X3},"$0","ym",0,0,null],
-ei:[function(){var z=document
-W.wi(window,z,"polymer-element",C.Bm,null)
-A.Jv()
-A.JX()
-$.ax().ml(new A.rD())},"$0","PB",0,0,126],
-Jv:[function(){var z,y,x,w,v,u,t
-for(w=$.UP(),w=H.VM(new H.a7(w,w.length,0,null),[H.Kp(w,0)]);w.G();){z=w.lo
-try{A.pw(z)}catch(v){u=H.Ru(v)
-y=u
-x=new H.XO(v,null)
-u=new P.vs(0,$.X3,null,null,null,null,null,null)
-u.$builtinTypeInfo=[null]
-new P.Zf(u).$builtinTypeInfo=[null]
-t=y
-if(t==null)H.vh(P.u("Error must not be null"))
-if(u.Gv!==0)H.vh(P.w("Future already completed"))
-u.CG(t,x)}}},"$0","vH",0,0,null],
-GA:[function(a,b,c,d){var z,y,x,w,v,u
-if(c==null)c=P.Ls(null,null,null,W.YN)
-if(d==null){d=[]
-d.$builtinTypeInfo=[J.O]}if(a==null){z="warning: "+H.d(b)+" not found."
-y=$.oK
-if(y==null)H.qw(z)
-else y.$1(z)
-return d}if(c.tg(0,a))return d
-c.h(c,a)
-for(y=W.vD(a.querySelectorAll("script,link[rel=\"import\"]"),null),y=y.gA(y),x=!1;y.G();){w=y.lo
-v=J.x(w)
-if(!!v.$isQj)A.GA(w.import,w.href,c,d)
-else if(!!v.$isj2&&w.type==="application/dart")if(!x){u=v.gLA(w)
-d.push(u===""?b:u)
-x=!0}else{z="warning: more than one Dart script tag in "+H.d(b)+". Dartium currently only allows a single Dart script tag per document."
-v=$.oK
-if(v==null)H.qw(z)
-else v.$1(z)}}return d},"$4","fE",4,4,null,85,85,279,[],280,[],281,[],282,[]],
-pw:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
-z=$.RQ()
-z.toString
-y=P.hK(a)
-x=y.Fi
-if(x!==""){w=y.ku
-v=y.gJf(y)
-u=y.gtp(y)
-t=z.SK(y.r0)
-s=y.tP}else{if(y.gJf(y)!==""){w=y.ku
-v=y.gJf(y)
-u=y.gtp(y)
-t=z.SK(y.r0)
-s=y.tP}else{r=y.r0
-if(r===""){t=z.r0
-s=y.tP
-s=s!==""?s:z.tP}else{r=J.co(r,"/")
-q=y.r0
-t=r?z.SK(q):z.SK(z.Ky(z.r0,q))
-s=y.tP}w=z.ku
-v=z.gJf(z)
-u=z.gtp(z)}x=z.Fi}p=P.R6(y.Ka,v,t,null,u,s,null,x,w)
-y=$.UG().nb
-o=y.t(0,p)
-n=p.r0
-if(p.Fi===z.Fi)if(p.gWu()===z.gWu())if(J.rY(n).Tc(n,".dart"))z=C.xB.tg(n,"/packages/")||C.xB.nC(n,"packages/")
-else z=!1
-else z=!1
-else z=!1
-if(z){z=p.r0
-m=y.t(0,P.hK("package:"+C.xB.yn(z,J.U6(z).cn(z,"packages/")+9)))
-if(m!=null)o=m}if(o==null){$.M7().To(p.bu(0)+" library not found")
-return}z=o.gYK().nb
-z=z.gUQ(z)
-y=new A.Fn()
-r=new H.U5(z,y)
-r.$builtinTypeInfo=[H.ip(z,"mW",0)]
-z=z.gA(z)
-y=new H.SO(z,y)
-y.$builtinTypeInfo=[H.Kp(r,0)]
-for(;y.G();)A.ZB(o,z.gl())
-z=o.gYK().nb
-z=z.gUQ(z)
-y=new A.e3()
-r=new H.U5(z,y)
-r.$builtinTypeInfo=[H.ip(z,"mW",0)]
-z=z.gA(z)
-y=new H.SO(z,y)
-y.$builtinTypeInfo=[H.Kp(r,0)]
-for(;y.G();){l=z.gl()
-for(r=J.GP(l.gc9());r.G();){k=r.lo.gAx()
-if(!!J.x(k).$isV3){q=k.ns
-j=l.gYj()
-$.Ej().u(0,q,j)
-i=$.p2().Rz(0,q)
-if(i!=null)J.Or(i)}}}},"$1","qt",2,0,null,283,[]],
-ZB:[function(a,b){var z,y,x
-for(z=J.GP(b.gc9());y=!1,z.G();)if(z.lo.gAx()===C.xd){y=!0
-break}if(!y)return
-if(!b.gFo()){x="warning: methods marked with @initMethod should be static, "+J.AG(b.gIf())+" is not."
-z=$.oK
-if(z==null)H.qw(x)
-else z.$1(x)
-return}z=b.gMP()
-z=z.ev(z,new A.pM())
-if(z.gA(z).G()){x="warning: methods marked with @initMethod should take no arguments, "+J.AG(b.gIf())+" expects some."
-z=$.oK
-if(z==null)H.qw(x)
-else z.$1(x)
-return}a.CI(b.gIf(),C.xD)},"$2","Ii",4,0,null,101,[],233,[]],
-Zj:{
-"^":"Tp:116;",
-$1:[function(a){A.pX()},"$1",null,2,0,null,117,[],"call"],
-$isEH:true},
+b.appendChild(z)},
+X1:function(a,b){var z
+A.JP()
+$.ok=b
+for(z=H.VM(new H.a7(a,57,0,null),[H.Kp(a,0)]);z.G();)z.lo.$0()},
+JP:function(){var z,y,x,w,v
+z=J.UQ($.ca(),"Polymer")
+if(z==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; if you do that be sure to include the platform polyfills."))
+y=$.X3
+z.K9("whenPolymerReady",[y.ce(new A.hp())])
+x=J.UQ(P.Oe(document.createElement("polymer-element",null)),"__proto__")
+if(!!J.x(x).$isKV)x=P.Oe(x)
+w=J.U6(x)
+v=w.t(x,"register")
+if(v==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
+w.u(x,"register",new P.r7(P.z8(new A.k2(y,v),!0)))},
 XP:{
-"^":"qE;zx,kw,aa,RT,Q7=,NF=,hf=,xX=,cI,lD,Gd=,lk",
-gt5:function(a){return a.zx},
-gP1:function(a){return a.aa},
-goc:function(a){return a.RT},
-gZf:function(a){var z,y
-z=a.querySelector("template")
-if(z!=null)y=J.G6(!!J.x(z).$isTU?z:M.Ky(z))
+"^":"a;FL<,t5>,P1<,oc>,Q7<,NF<,iK<,kK<,of,lD,PS<,Ve",
+gZf:function(){var z,y
+z=J.c1(this.FL,"template")
+if(z!=null)y=J.NQ(!!J.x(z).$isvy?z:M.Ky(z))
 else y=null
 return y},
-yx:function(a){var z,y,x,w,v
-if(this.y0(a,a.RT))return
-z=a.getAttribute("extends")
-if(this.PM(a,z))return
-y=a.RT
-x=$.Ej()
-a.zx=x.t(0,y)
-x=x.t(0,z)
-a.kw=x
-if(x!=null)a.aa=$.cd().t(0,z)
-w=P.re(a.zx)
-this.YU(a,w,a.aa)
-x=a.Q7
-if(x!=null)a.NF=this.qC(a,x)
-this.q1(a,w)
-$.cd().u(0,y,a)
-this.Vk(a)
-this.W3(a,a.Gd)
-this.Mi(a)
-this.f6(a)
-this.yq(a)
-A.ZI(this.J3(a,this.kO(a,"global"),"global"),document.head)
-A.YG(this.gZf(a),y,z)
-w=P.re(a.zx)
-v=w.gYK().nb.t(0,C.c8)
-if(v!=null&&!!J.x(v).$isRS&&v.gFo()&&v.guU())w.CI(C.c8,[a])
-this.Ba(a,y)
-A.yV(a.RT)},
-y0:function(a,b){if($.Ej().t(0,b)!=null)return!1
-$.p2().u(0,b,a)
-if(a.hasAttribute("noscript")===!0)A.Ad(b,null)
-return!0},
-PM:function(a,b){if(b!=null&&C.xB.u8(b,"-")>=0)if(!$.cd().x4(b)){J.wT($.xY().to(b,new A.q6()),a)
-return!0}return!1},
-Ba:function(a,b){var z,y,x,w
-for(z=a,y=null;z!=null;){x=J.RE(z)
-y=x.gQg(z).MW.getAttribute("extends")
-z=x.gP1(z)}x=document
-w=a.zx
-W.wi(window,x,b,w,y)},
-YU:function(a,b,c){var z,y,x,w,v,u
-if(c!=null&&J.YP(c)!=null){z=J.YP(c)
+FU:function(){var z,y,x,w
+if($.Nc()!==!0){z=this.gZf()
+if(z==null)return
+for(y=J.MK(z,"shadow"),y=y.gA(y);y.G();){x=y.lo
+w=J.RE(x)
+if(J.FN(w.gUN(x)))w.mx(x,document.createElement("content",null))}}},
+Ba:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
+for(z=null,y=this;y!=null;){z=J.Vs(y.gFL()).MW.getAttribute("extends")
+y=y.gP1()}x=document
+w=this.t5
+v=window
+u=J.Xr(w)
+if(u==null)H.vh(P.u(w))
+t=u.prototype
+s=J.Nq(w,"created")
+if(s==null)H.vh(P.u(H.d(w)+" has no constructor called 'created'"))
+J.m0(W.r3("article",null))
+r=u.$nativeSuperclassTag
+if(r==null)H.vh(P.u(w))
+w=z==null
+if(w){if(!J.xC(r,"HTMLElement"))H.vh(P.f("Class must provide extendsTag if base native class is not HtmlElement"))}else if(!(x.createElement(z) instanceof window[r]))H.vh(P.f("extendsTag does not match base native class"))
+q=v[r]
+p={}
+p.createdCallback={value:function(b){return function(){return b(this)}}(H.tR(W.Rl(s,t),1))}
+p.attachedCallback={value:function(b){return function(){return b(this)}}(H.tR(W.B4(),1))}
+p.detachedCallback={value:function(b){return function(){return b(this)}}(H.tR(W.Z6(),1))}
+p.attributeChangedCallback={value:function(b){return function(c,d,e){return b(this,c,d,e)}}(H.tR(W.A6(),4))}
+o=Object.create(q.prototype,p)
+v=H.Va(t)
+Object.defineProperty(o,init.dispatchPropertyName,{value:v,enumerable:false,writable:true,configurable:true})
+n={prototype:o}
+if(!w)n.extends=z
+x.registerElement(a,n)},
+Zw:function(a){var z,y,x,w,v,u,t,s,r
+if(a!=null&&a.gQ7()!=null){z=a.gQ7()
 y=P.L5(null,null,null,null,null)
 y.FV(0,z)
-a.Q7=y}a.Q7=A.oF(b,a.Q7)
-x=a.getAttribute("attributes")
-if(x!=null){z=x.split(C.xB.tg(x,",")?",":" ")
-z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
-for(;z.G();){w=J.rr(z.lo)
-if(w!==""){y=a.Q7
-y=y!=null&&y.x4(w)}else y=!1
-if(y)continue
-v=new H.GD(H.u1(w))
-u=A.Oy(b,v)
-if(u==null){window
-y="property for attribute "+w+" of polymer-element name="+H.d(a.RT)+" not found."
-if(typeof console!="undefined")console.warn(y)
-continue}y=a.Q7
-if(y==null){y=P.Fl(null,null)
-a.Q7=y}y.u(0,v,u)}}},
-Vk:function(a){var z,y
-z=P.L5(null,null,null,J.O,P.a)
-a.xX=z
-y=a.aa
-if(y!=null)z.FV(0,J.Ng(y))
-new W.i7(a).aN(0,new A.CK(a))},
-W3:function(a,b){new W.i7(a).aN(0,new A.LJ(b))},
-Mi:function(a){var z=this.Hs(a,"[rel=stylesheet]")
-a.cI=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},
-f6:function(a){var z=this.Hs(a,"style[polymer-scope]")
-a.lD=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.QC(z.lo)},
-yq:function(a){var z,y,x,w,v,u,t
-z=a.cI
+this.Q7=y}z=this.t5
+this.Q7=A.oF(z,this.Q7)
+x=J.Vs(this.FL).MW.getAttribute("attributes")
+if(x!=null)for(y=C.xB.Fr(x,$.zZ()),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
+if(v==="")continue
+u=$.b7().d8.t(0,v)
+t=L.hk([u])
+s=this.Q7
+if(s!=null&&s.x4(t))continue
+r=$.mX().CV(z,u)
+if(r==null||r.fY===C.it||r.V5){window
+s="property for attribute "+v+" of polymer-element name="+H.d(w)+" not found."
+if(typeof console!="undefined")console.warn(s)
+continue}s=this.Q7
+if(s==null){s=P.Fl(null,null)
+this.Q7=s}s.u(0,t,r)}},
+Vk:function(){var z,y
+z=P.L5(null,null,null,P.qU,P.a)
+this.kK=z
+y=this.P1
+if(y!=null)z.FV(0,y.gkK())
+J.Vs(this.FL).aN(0,new A.eY(this))},
+W3:function(a){J.Vs(this.FL).aN(0,new A.BO(a))},
+Mi:function(){var z=this.Hs("[rel=stylesheet]")
+this.of=z
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.wp(z.lo)},
+f6:function(){var z=this.Hs("style[polymer-scope]")
+this.lD=z
+for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.wp(z.lo)},
+m1:function(){var z,y,x,w,v,u,t
+z=this.of
 z.toString
 y=H.VM(new H.U5(z,new A.ZG()),[null])
-x=this.gZf(a)
+x=this.gZf()
 if(x!=null){w=P.p9("")
-for(z=H.VM(new H.SO(J.GP(y.l6),y.T6),[H.Kp(y,0)]),v=z.OI;z.G();){u=A.Hl(v.gl())
+for(z=H.VM(new H.SO(J.mY(y.l6),y.T6),[H.Kp(y,0)]),v=z.OI;z.G();){u=A.Hl(v.gl())
 t=w.vM+=typeof u==="string"?u:H.d(u)
 w.vM=t+"\n"}if(w.vM.length>0){z=document.createElement("style",null)
-J.c9(z,H.d(w))
+J.t3(z,H.d(w))
 v=J.RE(x)
-v.mK(x,z,v.gp8(x))}}},
-oP:function(a,b,c){var z,y,x
-z=W.vD(a.querySelectorAll(b),null)
+v.FO(x,z,v.gPZ(x))}}},
+Wz:function(a,b){var z,y,x
+z=J.MK(this.FL,a)
 y=z.br(z)
-x=this.gZf(a)
-if(x!=null)C.Nm.FV(y,J.pe(x,b))
+x=this.gZf()
+if(x!=null)C.Nm.FV(y,J.MK(x,a))
 return y},
-Hs:function(a,b){return this.oP(a,b,null)},
-kO:function(a,b){var z,y,x,w,v,u
+Hs:function(a){return this.Wz(a,null)},
+kO:function(a){var z,y,x,w,v,u
 z=P.p9("")
-y=new A.Oc("[polymer-scope="+b+"]")
-for(x=a.cI,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.SO(J.GP(x.l6),x.T6),[H.Kp(x,0)]),w=x.OI;x.G();){v=A.Hl(w.gl())
+y=new A.ua("[polymer-scope="+a+"]")
+for(x=this.of,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.SO(J.mY(x.l6),x.T6),[H.Kp(x,0)]),w=x.OI;x.G();){v=A.Hl(w.gl())
 u=z.vM+=typeof v==="string"?v:H.d(v)
-z.vM=u+"\n\n"}for(x=a.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.SO(J.GP(y.l6),y.T6),[H.Kp(y,0)]),x=y.OI;y.G();){w=x.gl().ghg()
-w=z.vM+=w
+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.SO(J.mY(y.l6),y.T6),[H.Kp(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},
-J3:function(a,b,c){var z
-if(b==="")return
+J3:function(a,b){var z
+if(a==="")return
 z=document.createElement("style",null)
-J.c9(z,b)
-z.setAttribute("element",H.d(a.RT)+"-"+c)
+J.t3(z,a)
+z.setAttribute("element",H.d(this.oc)+"-"+b)
 return z},
-q1:function(a,b){var z,y,x,w
-if(J.de(b,$.H8()))return
-this.q1(a,b.gAY())
-for(z=b.gYK().nb,z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
-if(!J.x(y).$isRS||y.gFo()||!y.guU())continue
-x=y.gIf().fN
-w=J.rY(x)
-if(w.Tc(x,"Changed")&&!w.n(x,"attributeChanged")){if(a.hf==null)a.hf=P.L5(null,null,null,null,null)
-x=w.Nj(x,0,J.xH(w.gB(x),7))
-a.hf.u(0,new H.GD(H.u1(x)),y.gIf())}}},
-qC:function(a,b){var z=P.L5(null,null,null,J.O,null)
-b.aN(0,new A.MX(z))
+rH:function(){var z,y,x,w,v
+for(z=$.HN(),z=$.mX().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+if(this.iK==null)this.iK=P.YM(null,null,null,null,null)
+x=J.RE(y)
+w=x.goc(y)
+v=$.b7().eB.t(0,w)
+w=J.U6(v)
+v=w.Nj(v,0,J.xH(w.gB(v),7))
+this.iK.u(0,L.hk(v),[x.goc(y)])}},
+I7:function(){var z,y,x
+for(z=$.mX().Me(0,this.t5,C.Xk),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo.gDv()
+x=new H.a7(y,y.length,0,null)
+x.$builtinTypeInfo=[H.Kp(y,0)]
+for(;x.G();)continue}},
+Yl:function(a){var z=P.L5(null,null,null,P.qU,null)
+a.aN(0,new A.MX(z))
 return z},
-du:function(a){a.RT=a.getAttribute("name")
-this.yx(a)},
-$isXP:true,
-static:{"^":"Rlv",XL:function(a){a.Gd=P.Fl(null,null)
-C.zb.ZL(a)
-C.zb.du(a)
-return a}}},
-q6:{
-"^":"Tp:115;",
-$0:[function(){return[]},"$0",null,0,0,null,"call"],
+$isXP:true},
+eY:{
+"^":"Xs:50;a",
+$2:function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
 $isEH:true},
-CK:{
-"^":"Tp:300;a",
-$2:[function(a,b){if(C.kr.x4(a)!==!0&&!J.co(a,"on-"))this.a.xX.u(0,a,b)},"$2",null,4,0,null,12,[],30,[],"call"],
-$isEH:true},
-LJ:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z,y,x
+BO:{
+"^":"Xs:50;a",
+$2:function(a,b){var z,y,x
 z=J.rY(a)
 if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
 x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},"$2",null,4,0,null,12,[],30,[],"call"],
+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},
 ZG:{
-"^":"Tp:116;",
-$1:[function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},"$1",null,2,0,null,94,[],"call"],
+"^":"Xs:30;",
+$1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
 $isEH:true},
-Oc:{
-"^":"Tp:116;a",
-$1:[function(a){return J.Kf(a,this.a)},"$1",null,2,0,null,94,[],"call"],
+ua:{
+"^":"Xs:30;a",
+$1:function(a){return J.RF(a,this.a)},
+$isEH:true},
+ix:{
+"^":"Xs:47;",
+$0:function(){return[]},
 $isEH:true},
 MX:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,J.Mz(J.GL(a)),b)},"$2",null,4,0,null,12,[],30,[],"call"],
+"^":"Xs:120;a",
+$2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
 $isEH:true},
-w12:{
-"^":"Tp:115;",
-$0:[function(){var z=P.L5(null,null,null,J.O,J.O)
-C.FS.aN(0,new A.r3y(z))
-return z},"$0",null,0,0,null,"call"],
+DOe:{
+"^":"Xs:47;",
+$0:function(){var z=P.L5(null,null,null,P.qU,P.qU)
+C.SP.aN(0,new A.LfS(z))
+return z},
 $isEH:true},
-r3y:{
-"^":"Tp:300;a",
-$2:[function(a,b){this.a.u(0,b,a)},"$2",null,4,0,null,492,[],493,[],"call"],
+LfS:{
+"^":"Xs:50;a",
+$2:function(a,b){this.a.u(0,b,a)},
 $isEH:true},
 yL:{
-"^":"ndx;",
-$isyL:true},
-zs:{
-"^":["a;KM:X0=-306",function(){return[C.Nw]}],
+"^":"ndx;"},
+dM:{
+"^":"a;",
 Pa:function(a){var z
 if(W.Pv(this.gM0(a).defaultView)==null)z=$.Bh>0
 else z=!0
-if(z)this.Ec(a)},
-Ec:function(a){var z,y
+if(z)this.es(a)},
+es:function(a){var z,y
 z=this.gQg(a).MW.getAttribute("is")
 y=z==null||z===""?this.gqn(a):z
-a.dZ=$.cd().t(0,y)
+a.a6=$.RA().t(0,y)
 this.Xl(a)
-this.Z2(a)
+this.oR(a)
 this.fk(a)
 this.Uc(a)
 $.Bh=$.Bh+1
-this.z2(a,a.dZ)
-$.Bh=$.Bh-1},
-i4:function(a){if(a.dZ==null)this.Ec(a)
-this.BT(a,!0)},
-xo:function(a){this.x3(a)},
-z2:function(a,b){if(b!=null){this.z2(a,J.lB(b))
-this.d0(a,b)}},
-d0:function(a,b){var z,y,x,w
+this.Oh(a,a.a6)
+$.Bh=$.Bh-1
+this.I9(a)},
+I9:function(a){},
+q0:function(a){if(a.a6==null)this.es(a)
+this.dH(a,!0)},
+Nz:function(a){this.x3(a)},
+Oh:function(a,b){if(b!=null){this.Oh(a,b.gP1())
+this.aI(a,b.gFL())}},
+aI:function(a,b){var z,y,x,w
 z=J.RE(b)
-y=z.Ja(b,"template")
-if(y!=null)if(J.Vs(a.dZ).MW.hasAttribute("lightdom")===!0){this.Se(a,y)
-x=null}else x=this.Tp(a,y)
+y=z.Wk(b,"template")
+if(y!=null)if(J.Vs(a.a6.gFL()).MW.hasAttribute("lightdom")===!0){this.Se(a,y)
+x=null}else x=this.TH(a,y)
 else x=null
 if(!J.x(x).$isI0)return
 w=z.gQg(b).MW.getAttribute("name")
 if(w==null)return
-a.B7.u(0,w,x)},
+a.BA.u(0,w,x)},
 Se:function(a,b){var z,y
 if(b==null)return
-z=!!J.x(b).$isTU?b:M.Ky(b)
-y=z.ZK(a,a.SO)
-this.jx(a,y)
-this.lj(a,a)
+z=!!J.x(b).$isvy?b:M.Ky(b)
+y=z.ZK(a,a.on)
+this.mx(a,y)
+this.Ec(a,a)
 return y},
-Tp:function(a,b){var z,y
+TH:function(a,b){var z,y
 if(b==null)return
 this.gIW(a)
 z=this.er(a)
-$.od().u(0,z,a)
+$.RV().u(0,z,a)
 z.applyAuthorStyles=!1
 z.resetStyleInheritance=!1
-y=!!J.x(b).$isTU?b:M.Ky(b)
-z.appendChild(y.ZK(a,a.SO))
-this.lj(a,z)
+y=!!J.x(b).$isvy?b:M.Ky(b)
+z.appendChild(y.ZK(a,a.on))
+this.Ec(a,z)
 return z},
-lj:function(a,b){var z,y,x,w
-for(z=J.pe(b,"[id]"),z=z.gA(z),y=a.X0,x=J.w1(y);z.G();){w=z.lo
-x.u(y,J.F8(w),w)}},
-aC:function(a,b,c,d){var z=J.x(b)
+Ec:function(a,b){var z,y,x
+for(z=J.MK(b,"[id]"),z=z.gA(z),y=a.LL;z.G();){x=z.lo
+y.u(0,J.F8(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){J.Ng(a.dZ).aN(0,new A.WC(a))},
-fk:function(a){if(J.ak(a.dZ)==null)return
+oR:function(a){a.a6.gkK().aN(0,new A.Sv(a))},
+fk:function(a){if(a.a6.gNF()==null)return
 this.gQg(a).aN(0,this.ghW(a))},
-D3:[function(a,b,c){var z,y,x,w
+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.kE(c,$.iB())===!0)return
-y=H.vn(a)
-x=y.rN(z.gIf()).gAx()
-w=Z.Zh(c,x,A.al(x,z))
-if(w==null?x!=null:w!==x){y.tu(z.gIf(),2,[w],C.CM)
-H.vn(w)}},"$2","ghW",4,0,494,12,[],30,[]],
-B2:function(a,b){var z=J.ak(a.dZ)
+if(c==null||J.x5(c,$.iB())===!0)return
+y=J.RE(z)
+x=y.goc(z)
+w=$.cp().jD(a,x)
+v=y.gt5(z)
+x=J.x(v)
+u=Z.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.HH))&&w!=null?J.bB(w):v)
+if(u==null?w!=null:u!==w){y=y.goc(z)
+$.cp().Cq(a,y,u)}},"$2","ghW",4,0,121],
+B2:function(a,b){var z=a.a6.gNF()
 if(z==null)return
 return z.t(0,b)},
 TW:function(a,b){if(b==null)return
 if(typeof b==="boolean")return b?"":null
-else if(typeof b==="string"||typeof b==="number"&&Math.floor(b)===b||typeof b==="number")return H.d(b)
+else if(typeof b==="string"||typeof b==="number")return H.d(b)
 return},
-Id:function(a,b){var z,y
-z=H.vn(a).rN(b).gAx()
+QS:function(a,b){var z,y
+if(!J.xC(J.q8(b),1))throw H.b(P.u("path must be length 1"))
+z=b.Tl(a)
 y=this.TW(a,z)
-if(y!=null)this.gQg(a).MW.setAttribute(J.GL(b),y)
-else if(typeof z==="boolean")this.gQg(a).Rz(0,J.GL(b))},
-Z1:function(a,b,c,d){var z,y,x,w,v,u,t
-if(a.dZ==null)this.Ec(a)
+if(y!=null)this.gQg(a).MW.setAttribute(H.d(b),y)
+else if(typeof z==="boolean")this.gQg(a).Rz(0,H.d(b))},
+nR:function(a,b,c,d){var z,y,x,w,v
+if(a.a6==null)this.es(a)
 z=this.B2(a,b)
-if(z==null)return J.Jj(M.Ky(a),b,c,d)
-else{J.MV(M.Ky(a),b)
-y=z.gIf()
-x=$.ZH()
-if(x.Im(C.R5))x.J4("["+H.d(c)+"]: bindProperties: ["+H.d(d)+"] to ["+H.d(this.gqn(a))+"].["+J.AG(y)+"]")
-w=L.Sk(c,d,null)
-if(w.gP(w)==null)w.sP(0,H.vn(a).rN(y).gAx())
-x=H.vn(a)
-v=y.fN
-u=d!=null?d:""
-t=new A.Bf(x,y,null,null,a,c,null,null,v,u)
-t.Og(a,v,c,d)
-t.bw(a,y,c,d)
-this.Id(a,z.gIf())
-J.kW(J.QE(M.Ky(a)),b,t)
-return t}},
+if(z==null)return J.FS(M.Ky(a),b,c,d)
+else{J.SB(M.Ky(a),b)
+y=J.RE(z)
+x=y.goc(z)
+w=$.ZH()
+if(w.Im(C.eI))w.J4("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gqn(a))+"].[name]")
+w=J.RE(c)
+if(w.gP(c)==null)w.sP(c,$.cp().jD(a,x))
+v=new A.Bf(a,x,c,null,null)
+v.Jq=this.gqh(a).yI(v.gXQ())
+w=J.mu(c,v.gap())
+v.dY=w
+$.cp().Cq(a,x,w)
+this.QS(a,L.hk([y.goc(z)]))
+J.kW(J.QE(M.Ky(a)),b,v)
+return v}},
 gCd:function(a){return J.QE(M.Ky(a))},
-Ih:function(a,b){return J.MV(M.Ky(a),b)},
+Yj:function(a,b){return J.SB(M.Ky(a),b)},
 x3:function(a){var z,y
-if(a.Uk===!0)return
-$.P5().J4("["+H.d(this.gqn(a))+"] asyncUnbindAll")
-z=a.oq
+if(a.q9===!0)return
+$.RI().J4("["+H.d(this.gqn(a))+"] asyncUnbindAll")
+z=a.YE
 y=this.gJg(a)
 if(z!=null)z.TP(0)
 else z=new A.S0(null,null)
-z.M3=y
-z.ih=P.rT(C.ny,z.gv6(z))
-a.oq=z},
+z.jd=y
+z.ih=P.ww(C.RT,z.gv6(z))
+a.YE=z},
 GB:[function(a){var z,y
-if(a.Uk===!0)return
-z=a.Wz
-if(z!=null){z.ed()
-a.Wz=null}this.C0(a)
-J.AA(M.Ky(a))
+if(a.q9===!0)return
+z=a.JB
+if(z!=null){z.S6(0)
+a.JB=null}this.C0(a)
+J.D9(M.Ky(a))
 y=this.gIW(a)
 for(;y!=null;){A.xv(y)
-y=y.olderShadowRoot}a.Uk=!0},"$0","gJg",0,0,126],
-BT:function(a,b){var z
-if(a.Uk===!0){$.P5().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
-return}$.P5().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
-z=a.oq
+y=y.olderShadowRoot}a.q9=!0},"$0","gJg",0,0,13],
+dH:function(a,b){var z
+if(a.q9===!0){$.RI().j2("["+H.d(this.gqn(a))+"] already unbound, cannot cancel unbindAll")
+return}$.RI().J4("["+H.d(this.gqn(a))+"] cancelUnbindAll")
+z=a.YE
 if(z!=null){z.TP(0)
-a.oq=null}if(b===!0)return
+a.YE=null}if(b===!0)return
 A.pb(this.gIW(a),new A.TV())},
-oW:function(a){return this.BT(a,null)},
-Xl:function(a){var z,y,x,w,v
-z=J.xR(a.dZ)
-y=J.YP(a.dZ)
-if(z!=null)for(x=H.VM(new P.i5(z),[H.Kp(z,0)]),w=x.Fb,x=H.VM(new P.N6(w,w.zN,null,null),[H.Kp(x,0)]),x.zq=x.Fb.H9;x.G();){v=x.fD
-this.rJ(a,v,H.vn(a).rN(v),null)}if(z!=null||y!=null)a.Wz=this.gUj(a).yI(this.gnu(a))},
-Pv:[function(a,b){var z,y,x,w,v
-z=J.xR(a.dZ)
-y=J.YP(a.dZ)
-x=P.L5(null,null,null,P.wv,A.bS)
-for(w=J.GP(b);w.G();){v=w.gl()
-if(!J.x(v).$isqI)continue
-J.iF(x.to(v.oc,new A.Oa(v)),v.zZ)}x.aN(0,new A.n1(a,b,z,y))},"$1","gnu",2,0,495,496,[]],
+oW:function(a){return this.dH(a,null)},
+Xl:function(a){var z,y,x,w,v,u,t
+z=a.a6.giK()
+y=a.a6.gQ7()
+x=z==null
+w=!x
+if(!x||y!=null){x=$.ps
+$.ps=x+1
+v=new L.NV(null,[],x,null,null,null)
+v.Hy=[]
+a.JB=v
+if(w)for(x=H.VM(new P.fG(z),[H.Kp(z,0)]),u=x.Fb,x=H.VM(new P.EQ(u,u.Ig(),0,null),[H.Kp(x,0)]);x.G();){t=x.fD
+v.yN(a,t)
+this.rJ(a,t,t.Tl(a),null)}if(y!=null)for(x=y.gvc(),u=x.Fb,x=H.VM(new P.N6(u,u.zN,null,null),[H.Kp(x,0)]),x.zq=x.Fb.H9;x.G();){t=x.fD
+if(!w||!z.x4(t))v.yN(a,t)}L.AR.prototype.TR.call(v,v,this.gnu(a))}},
+FQ:[function(a,b,c,d){J.kH(c,new A.n1(a,b,c,d,a.a6.giK(),a.a6.gQ7(),P.op(null,null,null,null)))},"$3","gnu",6,0,122],
 rJ:function(a,b,c,d){var z,y,x,w,v
-z=J.xR(a.dZ)
+z=a.a6.giK()
 if(z==null)return
 y=z.t(0,b)
 if(y==null)return
-if(!!J.x(d).$iswn){x=$.a3()
-if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
-this.l5(a,H.d(J.GL(b))+"__array")}if(!!J.x(c).$iswn){x=$.a3()
-if(x.Im(C.R5))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
-w=c.gvp().w4(!1)
+if(!!J.x(d).$iswn){x=$.dn()
+if(x.Im(C.eI))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: unregister observer "+H.d(b))
+this.l5(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.dn()
+if(x.Im(C.eI))x.J4("["+H.d(this.gqn(a))+"] observeArrayValue: register observer "+H.d(b))
+w=c.gRT().w4(!1)
 x=w.Lj
-w.pN=x.cR(new A.xf(a,d,y))
-w.o7=P.VH(P.AY(),x)
-w.Bd=x.Al(P.v3())
-x=H.d(J.GL(b))+"__array"
-v=a.Sa
-if(v==null){v=P.L5(null,null,null,J.O,P.MO)
-a.Sa=v}v.u(0,x,w)}},
-l5:function(a,b){var z=a.Sa.Rz(0,b)
+x.toString
+w.pN=new A.V1(a,d,y)
+w.o7=P.VH(P.Mm(),x)
+w.Bd=P.v3()
+x=H.d(b)+"__array"
+v=a.nh
+if(v==null){v=P.L5(null,null,null,P.qU,P.MO)
+a.nh=v}v.u(0,x,w)}},
+l5:function(a,b){var z=a.nh.Rz(0,b)
 if(z==null)return!1
 z.ed()
 return!0},
-C0:function(a){var z=a.Sa
+C0:function(a){var z=a.nh
 if(z==null)return
-for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)z.lo.ed()
-a.Sa.V1(0)
-a.Sa=null},
+for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)z.lo.ed()
+a.nh.V1(0)
+a.nh=null},
 Uc:function(a){var z,y
-z=J.yxg(a.dZ)
+z=a.a6.gPS()
 if(z.gl0(z))return
-y=$.SS()
-if(y.Im(C.R5))y.J4("["+H.d(this.gqn(a))+"] addHostListeners: "+z.bu(0))
+y=$.Uk()
+if(y.Im(C.eI))y.J4("["+H.d(this.gqn(a))+"] addHostListeners: "+z.bu(0))
 this.UH(a,a,z.gvc(),this.gD4(a))},
 UH:function(a,b,c,d){var z,y,x,w,v,u,t
 for(z=c.Fb,z=H.VM(new P.N6(z,z.zN,null,null),[H.Kp(c,0)]),z.zq=z.Fb.H9,y=J.RE(b);z.G();){x=z.fD
 w=y.gI(b).t(0,x)
 v=w.Ph
 u=w.Sg
-t=new W.Ov(0,w.uv,v,W.aF(d),u)
+t=new W.fd(0,w.bi,v,W.aF(d),u)
 t.$builtinTypeInfo=[H.Kp(w,0)]
-w=t.u7
-if(w!=null&&t.VP<=0)J.cZ(t.uv,v,w,u)}},
+w=t.G9
+if(w!=null&&t.VP<=0)J.cZ(t.bi,v,w,u)}},
 iw:[function(a,b){var z,y,x,w,v,u,t
 z=J.RE(b)
 if(z.gXt(b)!==!0)return
-y=$.SS()
-x=y.Im(C.R5)
+y=$.Uk()
+x=y.Im(C.eI)
 if(x)y.J4(">>> ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")
-w=J.yxg(a.dZ)
+w=a.a6.gPS()
 v=z.gt5(b)
-u=J.UQ($.QX(),v)
+u=J.UQ($.pT(),v)
 t=w.t(0,u!=null?u:v)
 if(t!=null){if(x)y.J4("["+H.d(this.gqn(a))+"] found host handler name ["+t+"]")
-this.ea(a,a,t,[b,!!z.$isHe?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,497,325,[]],
-ea:function(a,b,c,d){var z,y
-z=$.SS()
-y=z.Im(C.R5)
+this.ea(a,a,t,[b,!!z.$iseC?z.gey(b):null,a])}if(x)y.J4("<<< ["+H.d(this.gqn(a))+"]: hostEventListener("+H.d(z.gt5(b))+")")},"$1","gD4",2,0,123,59],
+ea:function(a,b,c,d){var z,y,x,w
+z=$.Uk()
+y=z.Im(C.eI)
 if(y)z.J4(">>> ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))
-if(!!J.x(c).$isEH)H.im(c,d,P.Te(null))
-else if(typeof c==="string")A.HR(b,new H.GD(H.u1(c)),d)
-else z.j2("invalid callback")
+if(!!J.x(c).$isEH){x=X.aW(c)
+if(x===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
+C.Nm.sB(d,x)
+H.im(c,d,P.Te(null))}else if(typeof c==="string"){w=$.b7().d8.t(0,c)
+$.cp().Ck(b,w,d,!0,null)}else z.j2("invalid callback")
 if(y)z.To("<<< ["+H.d(this.gqn(a))+"]: dispatch "+H.d(c))},
-$iszs:true,
-$isTU:true,
+$isdM:true,
+$isvy:true,
 $isd3:true,
-$iscv:true,
-$isD0:true,
+$ish4:true,
+$isPZ:true,
 $isKV:true},
-WC:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z=J.Vs(this.a)
+Sv:{
+"^":"Xs:50;a",
+$2:function(a,b){var z=J.Vs(this.a)
 if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).$0())
-z.t(0,a)},"$2",null,4,0,null,12,[],30,[],"call"],
+z.t(0,a)},
 $isEH:true},
 Xi:{
-"^":"Tp:115;b",
-$0:[function(){return this.b},"$0",null,0,0,null,"call"],
+"^":"Xs:47;b",
+$0:function(){return this.b},
 $isEH:true},
 TV:{
-"^":"Tp:116;",
-$1:[function(a){var z=J.x(a)
-if(!!z.$iszs)z.oW(a)},"$1",null,2,0,null,211,[],"call"],
+"^":"Xs:30;",
+$1:function(a){var z=J.x(a)
+if(!!z.$isdM)z.oW(a)},
 $isEH:true},
-Mq:{
-"^":"Tp:116;",
-$1:[function(a){return J.AA(!!J.x(a).$isTU?a:M.Ky(a))},"$1",null,2,0,null,273,[],"call"],
-$isEH:true},
-Oa:{
-"^":"Tp:115;a",
-$0:[function(){return new A.bS(this.a.jL,null)},"$0",null,0,0,null,"call"],
+YC:{
+"^":"Xs:30;",
+$1:function(a){return J.D9(!!J.x(a).$isvy?a:M.Ky(a))},
 $isEH:true},
 n1:{
-"^":"Tp:300;b,c,d,e",
-$2:[function(a,b){var z,y,x
-z=this.e
-if(z!=null&&z.x4(a))J.Jr(this.b,a)
+"^":"Xs:50;a,b,c,d,e,f,UI",
+$2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o
 z=this.d
-if(z==null)return
-y=z.t(0,a)
-if(y!=null){z=this.b
-x=J.RE(b)
-J.Ut(z,a,x.gzZ(b),x.gjL(b))
-A.HR(z,y,[x.gjL(b),x.gzZ(b),this.c])}},"$2",null,4,0,null,12,[],498,[],"call"],
+if(typeof a!=="number")return H.s(a)
+y=2*a+1
+if(y>>>0!==y||y>=z.length)return H.e(z,y)
+x=z[y]
+y=this.f
+if(y!=null&&y.x4(x))J.Ip(this.a,x)
+y=this.e
+if(y==null)return
+w=y.t(0,x)
+if(w==null)return
+for(y=J.mY(w),v=this.b,u=J.U6(v),t=this.a,s=J.RE(t),r=this.c,q=this.UI;y.G();){p=y.gl()
+if(!q.h(0,p))continue
+o=u.t(v,a)
+s.rJ(t,x,o,b)
+$.cp().Ck(t,p,[b,o,v,r,z],!0,null)}},"$2",null,4,0,null,124,34,"call"],
 $isEH:true},
-xf:{
-"^":"Tp:116;a,b,c",
-$1:[function(a){A.HR(this.a,this.c,[this.b])},"$1",null,2,0,null,496,[],"call"],
+V1:{
+"^":"Xs:30;a,b,c",
+$1:[function(a){var z,y,x,w
+for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
+$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,125,"call"],
 $isEH:true},
 L6:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z,y,x
-z=$.SS()
-if(z.Im(C.R5))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
+"^":"Xs:129;a,b",
+$3:[function(a,b,c){var z,y,x
+z=$.Uk()
+if(z.Im(C.eI))z.J4("event: ["+H.d(b)+"]."+H.d(this.b)+" => ["+H.d(a)+"]."+this.a+"())")
 y=J.ZZ(this.b,3)
-x=C.FS.t(0,y)
+x=C.SP.t(0,y)
 if(x!=null)y=x
-z=J.f5(b).t(0,y)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(new A.Rs(this.a,a,b)),z.Sg),[H.Kp(z,0)]).Zz()
-return H.VM(new A.xh(null,null,null),[null])},"$2",null,4,0,null,292,[],273,[],"call"],
-$isEH:true},
-Rs:{
-"^":"Tp:116;c,d,e",
-$1:[function(a){var z,y,x,w,v,u
-z=this.e
-y=A.z9(z)
-x=J.x(y)
-if(!x.$iszs)return
-w=this.c
-if(0>=w.length)return H.e(w,0)
-if(w[0]==="@"){v=this.d
-u=L.Sk(v,C.xB.yn(w,1),null)
-w=u.gP(u)}else v=y
-u=J.x(a)
-x.ea(y,v,w,[a,!!u.$isHe?u.gey(a):null,z])},"$1",null,2,0,null,325,[],"call"],
-$isEH:true},
-uJ:{
-"^":"Tp:116;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,499,[],"call"],
-$isEH:true},
-hm:{
-"^":"Tp:116;",
-$1:[function(a){var z,y,x,w
-z=W.vD(document.querySelectorAll(".polymer-veiled"),null)
-for(y=z.gA(z);y.G();){x=J.pP(y.lo)
-w=J.w1(x)
-w.h(x,"polymer-unveil")
-w.Rz(x,"polymer-veiled")}if(z.gor(z)){y=C.hi.aM(window)
-y.gtH(y).ml(new A.Ji(z))}},"$1",null,2,0,null,117,[],"call"],
-$isEH:true},
-Ji:{
-"^":"Tp:116;a",
-$1:[function(a){var z
-for(z=this.a,z=z.gA(z);z.G();)J.V1(J.pP(z.lo),"polymer-unveil")},"$1",null,2,0,null,117,[],"call"],
+return new A.zI(b,y,a,this.a,null)},"$3",null,6,0,null,126,127,128,"call"],
 $isEH:true},
 Bf:{
-"^":"TR;I6,iU,Jq,dY,qP,ZY,xS,PB,eS,ay",
-cO:function(a){if(this.qP==null)return
-this.Jq.ed()
-X.TR.prototype.cO.call(this,this)},
-EC:function(a){this.dY=a
-this.I6.tu(this.iU,2,[a],C.CM)
-H.vn(a)},
-td:[function(a){var z,y,x,w
-for(z=J.GP(a),y=this.iU;z.G();){x=z.gl()
-if(!!J.x(x).$isqI&&J.de(x.oc,y)){w=this.I6.rN(y).gAx()
+"^":"Ap;I6,iU,uv,Jq,dY",
+AB:[function(a){this.dY=a
+$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,15,35],
+ho:[function(a){var z,y,x,w,v
+for(z=J.mY(a),y=this.iU;z.G();){x=z.gl()
+if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
+w=$.cp().Gu.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
-if(z==null?w!=null:z!==w)J.ta(this.xS,w)
-return}}},"$1","giz",2,0,500,265,[]],
-bw:function(a,b,c,d){this.Jq=J.xq(a).yI(this.giz())}},
-xc:{
-"^":["Ot;AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-oX:function(a){this.Pa(a)},
+if(z==null?v!=null:z!==v)J.Fc(this.uv,v)
+return}}},"$1","gXQ",2,0,130,119],
+TR:function(a,b){return J.mu(this.uv,b)},
+gP:function(a){return J.Vm(this.uv)},
+sP:function(a,b){J.Fc(this.uv,b)
+return b},
+S6:function(a){var z=this.Jq
+if(z!=null){z.ed()
+this.Jq=null}J.x0(this.uv)}},
+ir:{
+"^":"Ot;AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+XI:function(a){this.Pa(a)},
 static:{G7:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.Iv.ZL(a)
-C.Iv.oX(a)
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.Vk.ZL(a)
+C.Vk.XI(a)
 return a}}},
 jpR:{
-"^":["qE+zs;KM:X0=-306",function(){return[C.Nw]}],
-$iszs:true,
-$isTU:true,
+"^":"Bo+dM;",
+$isdM:true,
+$isvy:true,
 $isd3:true,
-$iscv:true,
-$isD0:true,
+$ish4:true,
+$isPZ:true,
 $isKV:true},
 Ot:{
 "^":"jpR+Pi;",
 $isd3:true},
-bS:{
-"^":"a;jL>,zZ*",
-$isbS:true},
-HJ:{
-"^":"e9;nF"},
+N9:{
+"^":"uN;jw",
+pm:function(a,b,c){if(J.co(b,"on-"))return A.pf(a,b,c)
+return T.uN.prototype.pm.call(this,a,b,c)}},
+zI:{
+"^":"Ap;v3,pB,U1,ED,Jq",
+zU:[function(a){var z,y,x,w,v,u
+z=this.v3
+y=A.tT(z)
+x=J.x(y)
+if(!x.$isdM)return
+w=this.ED
+if(C.xB.nC(w,"@")){v=this.U1
+w=L.hk(C.xB.yn(w,1)).Tl(v)}else v=y
+u=J.x(a)
+x.ea(y,v,w,[a,!!u.$iseC?u.gey(a):null,z])},"$1","gwi",2,0,30,59],
+gP:function(a){return},
+TR:function(a,b){var z=J.PB(this.v3).t(0,this.pB)
+z=H.VM(new W.fd(0,z.bi,z.Ph,W.aF(this.gwi()),z.Sg),[H.Kp(z,0)])
+z.Zz()
+this.Jq=z},
+S6:function(a){var z
+if(this.Jq!=null){z=$.Uk()
+if(z.Im(C.eI))z.J4("event.remove: ["+H.d(this.v3)+"]."+H.d(this.pB)+" => ["+H.d(this.U1)+"]."+this.ED+"())")
+this.Jq.ed()
+this.Jq=null}},
+static:{tT:function(a){var z
+for(;z=J.RE(a),z.gBy(a)!=null;)a=z.gBy(a)
+return $.RV().t(0,a)}}},
 S0:{
-"^":"a;M3,ih",
-Ws:function(){return this.M3.$0()},
+"^":"a;jd,ih",
+Ws:function(){return this.jd.$0()},
 TP:function(a){var z=this.ih
 if(z!=null){z.ed()
 this.ih=null}},
 tZ:[function(a){if(this.ih!=null){this.TP(0)
-this.Ws()}},"$0","gv6",0,0,126]},
-V3:{
-"^":"a;ns",
-$isV3:true},
-rD:{
-"^":"Tp:116;",
-$1:[function(a){var z=$.mC().MM
+this.Ws()}},"$0","gv6",0,0,13]},
+hp:{
+"^":"Xs:47;",
+$0:[function(){var z=$.ln().MM
 if(z.Gv!==0)H.vh(P.w("Future already completed"))
 z.OH(null)
-return},"$1",null,2,0,null,117,[],"call"],
+return},"$0",null,0,0,null,"call"],
 $isEH:true},
-Fn:{
-"^":"Tp:116;",
-$1:[function(a){return!!J.x(a).$isRS},"$1",null,2,0,null,501,[],"call"],
+k2:{
+"^":"Xs:133;a,b",
+$3:[function(a,b,c){var z,y,x
+z=$.Ej().t(0,b)
+if(z!=null){y=$.RA().t(0,c)
+x=this.a
+x.toString
+return P.T8(x,null,x,new A.v4(a,b,z,y))}return this.b.qP([b,c],a)},"$3",null,6,0,null,131,33,132,"call"],
 $isEH:true},
-e3:{
-"^":"Tp:116;",
-$1:[function(a){return!!J.x(a).$isMs},"$1",null,2,0,null,501,[],"call"],
-$isEH:true},
-pM:{
-"^":"Tp:116;",
-$1:[function(a){return!a.gQ2()},"$1",null,2,0,null,499,[],"call"],
-$isEH:true},
-Mh:{
-"^":"a;"}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
+v4:{
+"^":"Xs:47;c,d,e,f",
+$0:function(){var z,y,x,w,v,u
+z=this.d
+y=this.e
+x=this.f
+w=P.Fl(null,null)
+v=new A.XP(this.c,y,x,z,null,null,null,null,null,null,w,null)
+v.Zw(x)
+u=v.Q7
+if(u!=null)v.NF=v.Yl(u)
+v.rH()
+v.I7()
+$.RA().u(0,z,v)
+v.Vk()
+v.W3(w)
+v.Mi()
+v.f6()
+v.m1()
+A.ZI(v.J3(v.kO("global"),"global"),document.head)
+v.FU()
+w=v.gZf()
+A.YG(w,z,x!=null?J.tE(x):null)
+if($.mX().n6(y,C.MT))$.cp().Ck(y,C.MT,[v],!1,null)
+v.Ba(z)
+return},
+$isEH:true}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
 "^":"",
-Zh:[function(a,b,c){var z,y,x
-z=J.UQ($.CT(),J.Ba(c))
+Zh:function(a,b,c){var z,y,x
+z=$.QL().t(0,c)
 if(z!=null)return z.$2(a,b)
-try{y=C.xr.kV(J.JA(a,"'","\""))
+try{y=C.zc.kV(J.JA(a,"'","\""))
 return y}catch(x){H.Ru(x)
-return a}},"$3","jo",6,0,null,30,[],284,[],11,[]],
-W6:{
-"^":"Tp:115;",
-$0:[function(){var z=P.L5(null,null,null,null,null)
-z.u(0,C.AZ,new Z.Lf())
-z.u(0,C.ok,new Z.fT())
-z.u(0,C.N4,new Z.pp())
-z.u(0,C.Kc,new Z.nl())
-z.u(0,C.PC,new Z.ik())
-z.u(0,C.md,new Z.LfS())
-return z},"$0",null,0,0,null,"call"],
+return a}},
+Md:{
+"^":"Xs:50;",
+$2:function(a,b){return a},
 $isEH:true},
-Lf:{
-"^":"Tp:300;",
-$2:[function(a,b){return a},"$2",null,4,0,null,28,[],117,[],"call"],
+lP:{
+"^":"Xs:50;",
+$2:function(a,b){return a},
+$isEH:true},
+Uf:{
+"^":"Xs:50;",
+$2:function(a,b){var z,y
+try{z=P.zu(a)
+return z}catch(y){H.Ru(y)
+return b}},
+$isEH:true},
+Ra:{
+"^":"Xs:50;",
+$2:function(a,b){return!J.xC(a,"false")},
+$isEH:true},
+wJY:{
+"^":"Xs:50;",
+$2:function(a,b){return H.BU(a,null,new Z.fT(b))},
 $isEH:true},
 fT:{
-"^":"Tp:300;",
-$2:[function(a,b){return a},"$2",null,4,0,null,28,[],117,[],"call"],
+"^":"Xs:30;a",
+$1:function(a){return this.a},
 $isEH:true},
-pp:{
-"^":"Tp:300;",
-$2:[function(a,b){var z,y
-try{z=P.Gl(a)
-return z}catch(y){H.Ru(y)
-return b}},"$2",null,4,0,null,28,[],502,[],"call"],
+zOQ:{
+"^":"Xs:50;",
+$2:function(a,b){return H.RR(a,new Z.Lf(b))},
 $isEH:true},
-nl:{
-"^":"Tp:300;",
-$2:[function(a,b){return!J.de(a,"false")},"$2",null,4,0,null,28,[],117,[],"call"],
-$isEH:true},
-ik:{
-"^":"Tp:300;",
-$2:[function(a,b){return H.BU(a,null,new Z.mf(b))},"$2",null,4,0,null,28,[],502,[],"call"],
-$isEH:true},
-mf:{
-"^":"Tp:116;a",
-$1:[function(a){return this.a},"$1",null,2,0,null,117,[],"call"],
-$isEH:true},
-LfS:{
-"^":"Tp:300;",
-$2:[function(a,b){return H.IH(a,new Z.HK(b))},"$2",null,4,0,null,28,[],502,[],"call"],
-$isEH:true},
-HK:{
-"^":"Tp:116;b",
-$1:[function(a){return this.b},"$1",null,2,0,null,117,[],"call"],
+Lf:{
+"^":"Xs:30;b",
+$1:function(a){return this.b},
 $isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
 "^":"",
-ul:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.Vk(a.gvc(),new T.o8(a)).zV(0," ")
-else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","qP",2,0,206,122,[]],
-PX:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.kl(a.gvc(),new T.ex(a)).zV(0,";")
-else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Fx",2,0,206,122,[]],
-o8:{
-"^":"Tp:116;a",
-$1:[function(a){return J.de(this.a.t(0,a),!0)},"$1",null,2,0,null,376,[],"call"],
+dA:[function(a){var z=J.x(a)
+if(!!z.$isZ0)z=J.vo(a.gvc(),new T.o8f(a)).zV(0," ")
+else z=!!z.$iscX?z.zV(a," "):a
+return z},"$1","T4",2,0,25],
+qN:[function(a){var z=J.x(a)
+if(!!z.$isZ0)z=J.kl(a.gvc(),new T.GL(a)).zV(0,";")
+else z=!!z.$iscX?z.zV(a,";"):a
+return z},"$1","xe",2,0,25],
+o8f:{
+"^":"Xs:30;a",
+$1:function(a){return J.xC(this.a.t(0,a),!0)},
 $isEH:true},
-ex:{
-"^":"Tp:116;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,376,[],"call"],
+GL:{
+"^":"Xs:30;a",
+$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,134,"call"],
 $isEH:true},
-e9:{
-"^":"T4p;",
-op:[function(a,b,c){var z,y,x
-if(a==null)return
-z=new Y.hc(H.VM([],[Y.Pn]),P.p9(""),new P.WU(a,0,0,null),null)
-y=new U.tc()
+uN:{
+"^":"VE;",
+pm:function(a,b,c){var z,y,x
+z=new Y.pa(H.VM([],[Y.qS]),P.p9(""),new P.WU(a,0,0,null),null)
+y=new U.Fs()
 y=new T.FX(y,z,null,null)
-z=z.zl()
-y.qM=z
-y.fL=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
-y.w5()
-x=y.o9()
+z=z.rD()
+y.mV=z
+y.vi=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])
+y.Bp()
+x=y.Te()
 if(M.wR(c)){z=J.x(b)
-z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isEZ}else z=!1
+z=(z.n(b,"bind")||z.n(b,"repeat"))&&!!J.x(x).$isWH}else z=!1
 if(z)return
-return new T.Xy(this,b,x)},"$3","gca",6,0,503,274,[],12,[],273,[]],
-CE:function(a){return new T.uK(this)}},
-Xy:{
-"^":"Tp:300;a,b,c",
-$2:[function(a,b){var z
-if(!J.x(a).$isz6){z=this.a.nF
-a=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}z=!!J.x(b).$iscv
-if(z&&J.de(this.b,"class"))return T.FL(this.c,a,T.qP())
-if(z&&J.de(this.b,"style"))return T.FL(this.c,a,T.Fx())
-return T.FL(this.c,a,null)},"$2",null,4,0,null,292,[],273,[],"call"],
+return new T.H1(this,b,x)},
+A5:function(a){return new T.uK(this)}},
+H1:{
+"^":"Xs:129;a,b,c",
+$3:[function(a,b,c){var z,y
+if(!J.x(a).$isPF)a=K.xV(a,this.a.jw)
+z=!!J.x(b).$ish4
+y=z&&J.xC(this.b,"class")?T.T4():null
+if(z&&J.xC(this.b,"style"))y=T.xe()
+if(c===!0)return T.rD(this.c,a,y)
+return new T.tI(a,y,this.c,null,null,null)},"$3",null,6,0,null,126,127,128,"call"],
 $isEH:true},
 uK:{
-"^":"Tp:116;a",
-$1:[function(a){var z
-if(!!J.x(a).$isz6)z=a
-else{z=this.a.nF
-z=new K.z6(null,a,V.WF(z==null?P.Fl(null,null):z,null,null),null)}return z},"$1",null,2,0,null,292,[],"call"],
+"^":"Xs:30;a",
+$1:[function(a){return!!J.x(a).$isPF?a:K.xV(a,this.a.jw)},"$1",null,2,0,null,126,"call"],
 $isEH:true},
-mY:{
-"^":"Pi;a9,Cu,uI,Y7,AP,fn",
-u0:function(a){return this.uI.$1(a)},
-KX:[function(a){var z,y
-z=this.Y7
-if(!!J.x(a).$isfk){y=J.OS(J.kl(a.bm,new T.mB(this,a)),!1)
-this.Y7=y}else{y=this.uI==null?a:this.u0(a)
-this.Y7=y}F.Wi(this,C.ls,z,y)},"$1","gUG",2,0,116,122,[]],
-gP:[function(a){return this.Y7},null,null,1,0,115,"value",308],
-sP:[function(a,b){var z,y,x
-try{K.jX(this.Cu,b,this.a9)}catch(y){x=H.Ru(y)
-if(!!J.x(x).$isB0){z=x
-$.eH().j2("Error evaluating expression '"+H.d(this.Cu)+"': "+J.z2(z))}else throw y}},null,null,3,0,116,122,[],"value",308],
-yB:function(a,b,c){var z,y,x,w
-y=this.Cu
-y.gju().yI(this.gUG()).fm(0,new T.GX(this))
-try{J.UK(y,new K.Ed(this.a9))
-y.gLl()
-this.KX(y.gLl())}catch(x){w=H.Ru(x)
-if(!!J.x(w).$isB0){z=w
-$.eH().j2("Error evaluating expression '"+H.d(y)+"': "+J.z2(z))}else throw x}},
-static:{FL:function(a,b,c){var z=new T.mY(b,a.RR(0,new K.G1(b,P.NZ(null,null))),c,null,null,null)
-z.yB(a,b,c)
-return z}}},
-GX:{
-"^":"Tp:116;a",
-$1:[function(a){$.eH().j2("Error evaluating expression '"+H.d(this.a.Cu)+"': "+H.d(J.z2(a)))},"$1",null,2,0,null,21,[],"call"],
+tI:{
+"^":"Ap;a9,uI,lV,Nl,DY,ZR",
+Co:function(a){return this.Nl.$1(a)},
+lY:[function(a){var z,y
+z=this.ZR
+y=T.r6(a,this.a9,this.uI)
+this.ZR=y
+if(this.Nl!=null&&!J.xC(z,y))this.Co(this.ZR)},"$1","gR5",2,0,30,135],
+gP:function(a){if(this.Nl!=null)return this.ZR
+return T.rD(this.lV,this.a9,this.uI)},
+sP:function(a,b){var z,y,x,w,v
+try{w=this.a9
+z=K.jX(this.lV,b,w)
+this.ZR=T.r6(z,w,this.uI)}catch(v){w=H.Ru(v)
+y=w
+x=new H.oP(v,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.lV)+"': "+H.d(y),x)}},
+TR:function(a,b){var z,y,x,w,v,u,t
+if(this.Nl!=null)throw H.b(P.w("already open"))
+this.Nl=b
+w=this.lV
+v=this.a9
+u=H.VM(new P.Sw(null,0,0,0),[null])
+u.Eo(null,null)
+z=J.okV(w,new K.XZ(v,u))
+this.lV=z
+u=z.glr().yI(this.gR5())
+u.fm(0,new T.Tg(z))
+this.DY=u
+try{w=z
+J.okV(w,new K.Ed(v))
+w.gK3()
+this.ZR=T.r6(z.gK3(),v,this.uI)}catch(t){w=H.Ru(t)
+y=w
+x=new H.oP(t,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(z)+"': "+H.d(y),x)}return this.ZR},
+S6:function(a){if(this.Nl==null)return
+this.DY.ed()
+this.DY=null
+this.lV=H.Go(this.lV,"$isdE").mA
+this.Nl=null},
+static:{rD:function(a,b,c){var z,y,x,w
+try{x=T.r6(K.ld(a,b),b,c)
+return x}catch(w){x=H.Ru(w)
+z=x
+y=new H.oP(w,null)
+H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(z),y)}return},r6:function(a,b,c){if(!!J.x(a).$isfk)return J.OS(J.kl(a.bm,new T.bI(a,b)),!1)
+else return c==null?a:c.$1(a)}}},
+bI:{
+"^":"Xs:30;a,b",
+$1:[function(a){var z=this.a.xG
+if(J.xC(z,"this"))H.vh(K.xn("'this' cannot be used as a variable name."))
+return new K.PO(this.b,z,a)},"$1",null,2,0,null,124,"call"],
 $isEH:true},
-mB:{
-"^":"Tp:116;a,b",
-$1:[function(a){var z=P.L5(null,null,null,null,null)
-z.u(0,this.b.F5,a)
-return new K.z6(this.a.a9,null,V.WF(z,null,null),null)},"$1",null,2,0,null,334,[],"call"],
+Tg:{
+"^":"Xs:50;a",
+$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a)+"': "+H.d(a),b)},"$2",null,4,0,null,1,117,"call"],
 $isEH:true}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
 "^":"",
-XF:{
-"^":"xh;vq,L1,AP,fn",
+De:{
+"^":"iR;vq,u1,AP,fn",
 vb:function(a,b){this.vq.yI(new B.bX(b,this))},
-$asxh:function(a){return[null]},
-static:{z4:function(a,b){var z=H.VM(new B.XF(a,null,null,null),[b])
+$asiR:function(a){return[null]},
+static:{zR:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
 z.vb(a,b)
 return z}}},
 bX:{
-"^":"Tp;a,b",
+"^":"Xs;a,b",
 $1:[function(a){var z=this.b
-z.L1=F.Wi(z,C.ls,z.L1,a)},"$1",null,2,0,null,334,[],"call"],
+z.u1=F.Wi(z,C.YI,z.u1,a)},"$1",null,2,0,null,124,"call"],
 $isEH:true,
-$signature:function(){return H.IG(function(a){return{func:"CV",args:[a]}},this.b,"XF")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
+$signature:function(){return H.IG(function(a){return{func:"Pw",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
 "^":"",
-OH:[function(a,b){var z=J.UK(a,new K.G1(b,P.NZ(null,null)))
-J.UK(z,new K.Ed(b))
-return z.gLv()},"$2","tk",4,0,null,285,[],278,[]],
-jX:[function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
+ld:function(a,b){var z,y
+z=new P.Sw(null,0,0,0)
+z.$builtinTypeInfo=[null]
+z.Eo(null,null)
+y=J.okV(a,new K.XZ(b,z))
+J.okV(y,new K.Ed(b))
+return y.gVi()},
+jX:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z={}
 z.a=a
 y=new K.c4(z)
 x=H.VM([],[U.hw])
-for(;w=z.a,v=J.x(w),!!v.$isuk;){if(!J.de(v.gkp(w),"|"))break
+for(;w=z.a,v=J.x(w),!!v.$isMp;){if(!J.xC(v.gxS(w),"|"))break
 x.push(v.gT8(w))
 z.a=v.gBb(w)}w=z.a
 v=J.x(w)
-if(!!v.$isw6){u=v.gP(w)
-t=C.OL
+if(!!v.$iselO){u=v.gP(w)
+t=C.x4
 s=!1}else if(!!v.$iszX){if(!J.x(w.gJn()).$isno)y.$0()
 t=z.a.ghP()
 u=J.Vm(z.a.gJn())
 s=!0}else{if(!!v.$isx9){t=w.ghP()
-u=J.O6(z.a)}else if(!!v.$isJy){t=w.ghP()
-if(J.vF(z.a)!=null){if(z.a.gre()!=null)y.$0()
-u=J.vF(z.a)}else{y.$0()
+u=J.tE(z.a)}else if(!!v.$isJy){t=w.ghP()
+if(J.I1(z.a)!=null){if(z.a.gre()!=null)y.$0()
+u=J.I1(z.a)}else{y.$0()
 u=null}}else{y.$0()
 t=null
 u=null}s=!1}for(z=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);z.G();){r=z.lo
-q=J.UK(r,new K.G1(c,P.NZ(null,null)))
-J.UK(q,new K.Ed(c))
-q.gLv()
-throw H.b(K.kG("filter must implement Transformer: "+H.d(r)))}p=K.OH(t,c)
-if(p==null)throw H.b(K.kG("Can't assign to null: "+H.d(t)))
+y=new P.Sw(null,0,0,0)
+y.$builtinTypeInfo=[null]
+y.Eo(null,null)
+q=J.okV(r,new K.XZ(c,y))
+J.okV(q,new K.Ed(c))
+q.gVi()
+throw H.b(K.xn("filter must implement Transformer: "+H.d(r)))}p=K.ld(t,c)
+if(p==null)throw H.b(K.xn("Can't assign to null: "+H.d(t)))
 if(s)J.kW(p,u,b)
-else{H.vn(p).tu(new H.GD(H.u1(u)),2,[b],C.CM)
-H.vn(b)}},"$3","wA",6,0,null,285,[],30,[],278,[]],
-ci:[function(a){if(!!J.x(a).$isqh)return B.z4(a,null)
-return a},"$1","W1",2,0,null,122,[]],
-Uf:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.WB(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
-wJY:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.xH(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
-zOQ:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.vX(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
-W6o:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.FW(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
-MdQ:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.de(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
-YJG:{
-"^":"Tp:300;",
-$2:[function(a,b){return!J.de(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
-DOe:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.z8(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
+else{z=$.b7().d8.t(0,u)
+$.cp().Cq(p,z,b)}return b},
+xV:function(a,b){var z,y,x
+z=new K.nk(a)
+if(b==null)y=z
+else{y=P.L5(null,null,null,P.qU,P.a)
+y.FV(0,b)
+x=new K.Ph(z,y)
+if(y.x4("this"))H.vh(K.xn("'this' cannot be used as a variable name."))
+y=x}return y},
 lPa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.J5(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
+"^":"Xs:50;",
+$2:function(a,b){return J.WB(a,b)},
 $isEH:true},
 Ufa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.u6(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
+"^":"Xs:50;",
+$2:function(a,b){return J.xH(a,b)},
 $isEH:true},
 Raa:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.Bl(a,b)},"$2",null,4,0,null,118,[],199,[],"call"],
+"^":"Xs:50;",
+$2:function(a,b){return J.vX(a,b)},
 $isEH:true},
 w0:{
-"^":"Tp:300;",
-$2:[function(a,b){return a===!0||b===!0},"$2",null,4,0,null,118,[],199,[],"call"],
-$isEH:true},
-w4:{
-"^":"Tp:300;",
-$2:[function(a,b){return a===!0&&b===!0},"$2",null,4,0,null,118,[],199,[],"call"],
+"^":"Xs:50;",
+$2:function(a,b){return J.L9(a,b)},
 $isEH:true},
 w5:{
-"^":"Tp:300;",
-$2:[function(a,b){var z=H.Og(P.a)
-z=H.KT(z,[z]).BD(b)
-if(z)return b.$1(a)
-throw H.b(K.kG("Filters must be a one-argument function."))},"$2",null,4,0,null,118,[],128,[],"call"],
-$isEH:true},
-w7:{
-"^":"Tp:116;",
-$1:[function(a){return a},"$1",null,2,0,null,118,[],"call"],
+"^":"Xs:50;",
+$2:function(a,b){return J.xC(a,b)},
 $isEH:true},
 w10:{
-"^":"Tp:116;",
-$1:[function(a){return J.Z7(a)},"$1",null,2,0,null,118,[],"call"],
+"^":"Xs:50;",
+$2:function(a,b){return!J.xC(a,b)},
 $isEH:true},
 w11:{
-"^":"Tp:116;",
-$1:[function(a){return a!==!0},"$1",null,2,0,null,118,[],"call"],
+"^":"Xs:50;",
+$2:function(a,b){return J.xZ(a,b)},
+$isEH:true},
+w12:{
+"^":"Xs:50;",
+$2:function(a,b){return J.J5(a,b)},
+$isEH:true},
+w13:{
+"^":"Xs:50;",
+$2:function(a,b){return J.u6(a,b)},
+$isEH:true},
+w14:{
+"^":"Xs:50;",
+$2:function(a,b){return J.Bl(a,b)},
+$isEH:true},
+w15:{
+"^":"Xs:50;",
+$2:function(a,b){return a===!0||b===!0},
+$isEH:true},
+w16:{
+"^":"Xs:50;",
+$2:function(a,b){return a===!0&&b===!0},
+$isEH:true},
+w17:{
+"^":"Xs:50;",
+$2:function(a,b){var z=H.Og(P.a)
+z=H.KT(z,[z]).BD(b)
+if(z)return b.$1(a)
+throw H.b(K.xn("Filters must be a one-argument function."))},
+$isEH:true},
+w18:{
+"^":"Xs:30;",
+$1:function(a){return a},
+$isEH:true},
+w19:{
+"^":"Xs:30;",
+$1:function(a){return J.jzo(a)},
+$isEH:true},
+w20:{
+"^":"Xs:30;",
+$1:function(a){return a!==!0},
 $isEH:true},
 c4:{
-"^":"Tp:115;a",
-$0:[function(){return H.vh(K.kG("Expression is not assignable: "+H.d(this.a.a)))},"$0",null,0,0,null,"call"],
+"^":"Xs:47;a",
+$0:function(){return H.vh(K.xn("Expression is not assignable: "+H.d(this.a.a)))},
 $isEH:true},
-z6:{
-"^":"a;eT>,k8<,bq,G9",
-gCH:function(){var z=this.G9
-if(z!=null)return z
-z=H.vn(this.k8)
-this.G9=z
-return z},
-t:function(a,b){var z,y,x,w
-if(J.de(b,"this"))return this.k8
-else{z=this.bq.Zp
-if(z.x4(b))return K.ci(z.t(0,b))
-else if(this.k8!=null){y=new H.GD(H.u1(b))
-x=Z.y1(H.jO(J.bB(this.gCH().Ax).LU),y)
-z=J.x(x)
-if(!z.$isRY)w=!!z.$isRS&&x.glT()
-else w=!0
-if(w)return K.ci(this.gCH().rN(y).gAx())
-else if(!!z.$isRS)return new K.wL(this.gCH(),y)}}z=this.eT
-if(z!=null)return K.ci(z.t(0,b))
-else throw H.b(K.kG("variable '"+H.d(b)+"' not found"))},
-tI:function(a){var z
-if(J.de(a,"this"))return
-else{z=this.bq
-if(z.Zp.x4(a))return z
-else{z=H.u1(a)
-if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return this.k8}}z=this.eT
-if(z!=null)return z.tI(a)},
-tg:function(a,b){var z
-if(this.bq.Zp.x4(b))return!0
-else{z=H.u1(b)
-if(Z.y1(H.jO(J.bB(this.gCH().Ax).LU),new H.GD(z))!=null)return!0}z=this.eT
-if(z!=null)return z.tg(0,b)
-return!1},
-$isz6:true},
-Ay:{
-"^":"a;bO?,Lv<",
-gju:function(){var z=this.k6
+PF:{
+"^":"a;",
+u:function(a,b,c){throw H.b(P.f("[]= is not supported in Scope."))},
+$isPF:true,
+$isCo:true,
+$asCo:function(){return[P.qU,P.a]}},
+nk:{
+"^":"PF;ku<",
+t:function(a,b){var z,y
+if(J.xC(b,"this"))return this.ku
+z=$.b7().d8.t(0,b)
+y=this.ku
+if(y==null||z==null)throw H.b(K.xn("variable '"+H.d(b)+"' not found"))
+y=$.cp().jD(y,z)
+return!!J.x(y).$iscb?B.zR(y,null):y},
+aX:function(a){return!J.xC(a,"this")}},
+PO:{
+"^":"PF;eT>,Z0,P>",
+gku:function(){return this.eT.gku()},
+t:function(a,b){var z
+if(J.xC(this.Z0,b)){z=this.P
+return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
+aX:function(a){if(J.xC(this.Z0,a))return!1
+return this.eT.aX(a)}},
+Ph:{
+"^":"PF;eT>,Z3<",
+gku:function(){return this.eT.ku},
+t:function(a,b){var z=this.Z3
+if(z.x4(b)){z=z.t(0,b)
+return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
+aX:function(a){if(this.Z3.x4(a))return!1
+return!J.xC(a,"this")}},
+dE:{
+"^":"a;KX?,Vi<",
+glr:function(){var z=this.BM
 return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gLl:function(){return this.Lv},
-eC:function(a){return this.Qh(a)},
-Qh:function(a){},
-DX:function(a){var z
-this.yc(0,a)
-z=this.bO
-if(z!=null)z.DX(a)},
-yc:function(a,b){var z,y,x
-z=this.tj
+gK3:function(){return this.Vi},
+PJ:function(a){},
+b9:function(a){var z
+this.oO(a)
+z=this.KX
+if(z!=null)z.b9(a)},
+oO:function(a){var z,y,x
+z=this.kP
 if(z!=null){z.ed()
-this.tj=null}y=this.Lv
-this.Qh(b)
-z=this.Lv
-if(z==null?y!=null:z!==y){x=this.k6
+this.kP=null}y=this.Vi
+this.PJ(a)
+z=this.Vi
+if(z==null?y!=null:z!==y){x=this.BM
 if(x.Gv>=4)H.vh(x.q7())
 x.Iv(z)}},
-bu:function(a){return this.KL.bu(0)},
+bu:function(a){return this.mA.bu(0)},
+$isdE:true,
 $ishw:true},
 Ed:{
-"^":"d2;Jd",
-xn:function(a){a.yc(0,this.Jd)},
-ky:function(a){J.UK(a.gT8(a),this)
-a.yc(0,this.Jd)}},
-G1:{
-"^":"fr;Jd,ZGj",
-W9:function(a){return new K.Wh(a,null,null,null,P.bK(null,null,!1,null))},
+"^":"cfS;qu",
+xn:function(a){a.oO(this.qu)},
+ky:function(a){J.okV(a.gT8(a),this)
+a.oO(this.qu)}},
+XZ:{
+"^":"Jg;qu,lk",
+W9:function(a){return new K.uD(a,null,null,null,P.bK(null,null,!1,null))},
 LT:function(a){return a.wz.RR(0,this)},
-co:function(a){var z,y
-z=J.UK(a.ghP(),this)
+T7:function(a){var z,y
+z=J.okV(a.ghP(),this)
 y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(y)
+z.sKX(y)
 return y},
 CU:function(a){var z,y,x
-z=J.UK(a.ghP(),this)
-y=J.UK(a.gJn(),this)
+z=J.okV(a.ghP(),this)
+y=J.okV(a.gJn(),this)
 x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(x)
-y.sbO(x)
+z.sKX(x)
+y.sKX(x)
 return x},
-ZR:function(a){var z,y,x,w,v
-z=J.UK(a.ghP(),this)
-y=a.gre()
-if(y==null)x=null
-else{w=this.gnG()
-y.toString
-x=H.VM(new H.A8(y,w),[null,null]).tt(0,!1)}v=new K.fa(z,x,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(v)
-if(x!=null)H.bQ(x,new K.Os(v))
+og:function(a){var z,y,x,w,v
+z=J.okV(a.ghP(),this)
+if(a.gre()==null)y=null
+else{x=a.gre()
+w=this.gnG()
+x.toString
+y=H.VM(new H.lJ(x,w),[null,null]).tt(0,!1)}v=new K.xJ(z,y,a,null,null,null,P.bK(null,null,!1,null))
+z.sKX(v)
+if(y!=null)H.bQ(y,new K.o4(v))
 return v},
-ti:function(a){return new K.x5(a,null,null,null,P.bK(null,null,!1,null))},
+oD:function(a){return new K.z0(a,null,null,null,P.bK(null,null,!1,null))},
+Zh:function(a){var z,y
+z=H.VM(new H.lJ(a.ghL(),this.gnG()),[null,null]).tt(0,!1)
+y=new K.kL(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.gPu(a),this.gnG()),[null,null]).tt(0,!1)
+z=H.VM(new H.lJ(a.gRl(a),this.gnG()),[null,null]).tt(0,!1)
 y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
 H.bQ(z,new K.B8(y))
 return y},
 YV:function(a){var z,y,x
-z=J.UK(a.gG3(a),this)
-y=J.UK(a.gv4(),this)
+z=J.okV(a.gG3(a),this)
+y=J.okV(a.gv4(),this)
 x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(x)
-y.sbO(x)
+z.sKX(x)
+y.sKX(x)
 return x},
 qv:function(a){return new K.ek(a,null,null,null,P.bK(null,null,!1,null))},
-im:function(a){var z,y,x
-z=J.UK(a.gBb(a),this)
-y=J.UK(a.gT8(a),this)
+ex:function(a){var z,y,x
+z=J.okV(a.gBb(a),this)
+y=J.okV(a.gT8(a),this)
 x=new K.iv(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(x)
-y.sbO(x)
+z.sKX(x)
+y.sKX(x)
 return x},
 Hx:function(a){var z,y
-z=J.UK(a.gwz(),this)
+z=J.okV(a.gwz(),this)
 y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sbO(y)
+z.sKX(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)
+w=new K.dD(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
+z.sKX(w)
+y.sKX(w)
+x.sKX(w)
+return w},
 ky:function(a){var z,y,x
-z=J.UK(a.gBb(a),this)
-y=J.UK(a.gT8(a),this)
+z=J.okV(a.gBb(a),this)
+y=J.okV(a.gT8(a),this)
 x=new K.VA(z,y,a,null,null,null,P.bK(null,null,!1,null))
-y.sbO(x)
+y.sKX(x)
 return x}},
-Os:{
-"^":"Tp:116;a",
-$1:[function(a){var z=this.a
-a.sbO(z)
-return z},"$1",null,2,0,null,118,[],"call"],
+o4:{
+"^":"Xs:30;a",
+$1:function(a){var z=this.a
+a.sKX(z)
+return z},
+$isEH:true},
+XV:{
+"^":"Xs:30;a",
+$1:function(a){var z=this.a
+a.sKX(z)
+return z},
 $isEH:true},
 B8:{
-"^":"Tp:116;a",
-$1:[function(a){var z=this.a
-a.sbO(z)
-return z},"$1",null,2,0,null,21,[],"call"],
+"^":"Xs:30;a",
+$1:function(a){var z=this.a
+a.sKX(z)
+return z},
 $isEH:true},
-Wh:{
-"^":"Ay;KL,bO,tj,Lv,k6",
-Qh:function(a){this.Lv=a.gk8()},
+uD:{
+"^":"dE;mA,KX,kP,Vi,BM",
+PJ:function(a){this.Vi=a.gku()},
 RR:function(a,b){return b.W9(this)},
-$asAy:function(){return[U.EZ]},
-$isEZ:true,
+$asdE:function(){return[U.WH]},
+$isWH:true,
 $ishw:true},
-x5:{
-"^":"Ay;KL,bO,tj,Lv,k6",
-gP:function(a){var z=this.KL
+z0:{
+"^":"dE;mA,KX,kP,Vi,BM",
+gP:function(a){var z=this.mA
 return z.gP(z)},
-Qh:function(a){var z=this.KL
-this.Lv=z.gP(z)},
-RR:function(a,b){return b.ti(this)},
-$asAy:function(){return[U.no]},
+PJ:function(a){var z=this.mA
+this.Vi=z.gP(z)},
+RR:function(a,b){return b.oD(this)},
+$asdE:function(){return[U.no]},
 $asno:function(){return[null]},
 $isno:true,
 $ishw:true},
-ev:{
-"^":"Ay;Pu>,KL,bO,tj,Lv,k6",
-Qh:function(a){this.Lv=H.n3(this.Pu,P.L5(null,null,null,null,null),new K.ID())},
-RR:function(a,b){return b.o0(this)},
-$asAy:function(){return[U.kB]},
-$iskB:true,
+kL:{
+"^":"dE;hL<,mA,KX,kP,Vi,BM",
+PJ:function(a){this.Vi=H.VM(new H.lJ(this.hL,new K.Hv()),[null,null]).tt(0,!1)},
+RR:function(a,b){return b.Zh(this)},
+$asdE:function(){return[U.c0]},
+$isc0:true,
 $ishw:true},
-ID:{
-"^":"Tp:300;",
-$2:[function(a,b){J.kW(a,J.WI(b).gLv(),b.gv4().gLv())
-return a},"$2",null,4,0,null,202,[],21,[],"call"],
+Hv:{
+"^":"Xs:30;",
+$1:[function(a){return a.gVi()},"$1",null,2,0,null,124,"call"],
+$isEH:true},
+ev:{
+"^":"dE;Rl>,mA,KX,kP,Vi,BM",
+PJ:function(a){this.Vi=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Xv())},
+RR:function(a,b){return b.o0(this)},
+$asdE:function(){return[U.Qb]},
+$isQb:true,
+$ishw:true},
+Xv:{
+"^":"Xs:50;",
+$2:function(a,b){J.kW(a,J.Kt(b).gVi(),b.gv4().gVi())
+return a},
 $isEH:true},
 qR:{
-"^":"Ay;G3>,v4<,KL,bO,tj,Lv,k6",
+"^":"dE;G3>,v4<,mA,KX,kP,Vi,BM",
 RR:function(a,b){return b.YV(this)},
-$asAy:function(){return[U.wk]},
-$iswk:true,
+$asdE:function(){return[U.ae]},
+$isae:true,
 $ishw:true},
 ek:{
-"^":"Ay;KL,bO,tj,Lv,k6",
-gP:function(a){var z=this.KL
+"^":"dE;mA,KX,kP,Vi,BM",
+gP:function(a){var z=this.mA
 return z.gP(z)},
-Qh:function(a){var z,y,x
-z=this.KL
-this.Lv=J.UQ(a,z.gP(z))
-y=a.tI(z.gP(z))
+PJ:function(a){var z,y,x,w
+z=this.mA
+this.Vi=a.t(0,z.gP(z))
+if(!a.aX(z.gP(z)))return
+y=a.gku()
 x=J.x(y)
-if(!!x.$isd3){z=H.u1(z.gP(z))
-this.tj=x.gUj(y).yI(new K.Qv(this,a,new H.GD(z)))}},
+if(!x.$isd3)return
+z=z.gP(z)
+w=$.b7().d8.t(0,z)
+this.kP=x.gqh(y).yI(new K.OC(this,a,w))},
 RR:function(a,b){return b.qv(this)},
-$asAy:function(){return[U.w6]},
-$isw6:true,
+$asdE:function(){return[U.elO]},
+$iselO:true,
 $ishw:true},
-Qv:{
-"^":"Tp:116;a,b,c",
-$1:[function(a){if(J.ja(a,new K.Xm(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
+OC:{
+"^":"Xs:30;a,b,c",
+$1:[function(a){if(J.xq(a,new K.av(this.c))===!0)this.a.b9(this.b)},"$1",null,2,0,null,125,"call"],
 $isEH:true},
-Xm:{
-"^":"Tp:116;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+av:{
+"^":"Xs:30;d",
+$1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 mv:{
-"^":"Ay;wz<,KL,bO,tj,Lv,k6",
-gkp:function(a){var z=this.KL
-return z.gkp(z)},
-Qh:function(a){var z,y
-z=this.KL
-y=$.ww().t(0,z.gkp(z))
-if(J.de(z.gkp(z),"!")){z=this.wz.gLv()
-this.Lv=y.$1(z==null?!1:z)}else{z=this.wz
-this.Lv=z.gLv()==null?null:y.$1(z.gLv())}},
+"^":"dE;wz<,mA,KX,kP,Vi,BM",
+gxS:function(a){var z=this.mA
+return z.gxS(z)},
+PJ:function(a){var z,y
+z=this.mA
+y=$.fs().t(0,z.gxS(z))
+if(J.xC(z.gxS(z),"!")){z=this.wz.gVi()
+this.Vi=y.$1(z==null?!1:z)}else{z=this.wz
+this.Vi=z.gVi()==null?null:y.$1(z.gVi())}},
 RR:function(a,b){return b.Hx(this)},
-$asAy:function(){return[U.jK]},
-$isjK:true,
+$asdE:function(){return[U.cJ]},
+$iscJ:true,
 $ishw:true},
 iv:{
-"^":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
-gkp:function(a){var z=this.KL
-return z.gkp(z)},
-Qh:function(a){var z,y,x
-z=this.KL
-y=$.Ra().t(0,z.gkp(z))
-if(J.de(z.gkp(z),"&&")||J.de(z.gkp(z),"||")){z=this.Bb.gLv()
+"^":"dE;Bb>,T8>,mA,KX,kP,Vi,BM",
+gxS:function(a){var z=this.mA
+return z.gxS(z)},
+PJ:function(a){var z,y,x
+z=this.mA
+y=$.Jl().t(0,z.gxS(z))
+if(J.xC(z.gxS(z),"&&")||J.xC(z.gxS(z),"||")){z=this.Bb.gVi()
 if(z==null)z=!1
-x=this.T8.gLv()
-this.Lv=y.$2(z,x==null?!1:x)}else if(J.de(z.gkp(z),"==")||J.de(z.gkp(z),"!="))this.Lv=y.$2(this.Bb.gLv(),this.T8.gLv())
+x=this.T8.gVi()
+this.Vi=y.$2(z,x==null?!1:x)}else if(J.xC(z.gxS(z),"==")||J.xC(z.gxS(z),"!="))this.Vi=y.$2(this.Bb.gVi(),this.T8.gVi())
 else{x=this.Bb
-if(x.gLv()==null||this.T8.gLv()==null)this.Lv=null
-else{if(J.de(z.gkp(z),"|")&&!!J.x(x.gLv()).$iswn)this.tj=H.Go(x.gLv(),"$iswn").gvp().yI(new K.uA(this,a))
-this.Lv=y.$2(x.gLv(),this.T8.gLv())}}},
-RR:function(a,b){return b.im(this)},
-$asAy:function(){return[U.uk]},
-$isuk:true,
+if(x.gVi()==null||this.T8.gVi()==null)this.Vi=null
+else{if(J.xC(z.gxS(z),"|")&&!!J.x(x.gVi()).$iswn)this.kP=H.Go(x.gVi(),"$iswn").gRT().yI(new K.P8(this,a))
+this.Vi=y.$2(x.gVi(),this.T8.gVi())}}},
+RR:function(a,b){return b.ex(this)},
+$asdE:function(){return[U.Mp]},
+$isMp:true,
 $ishw:true},
-uA:{
-"^":"Tp:116;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,117,[],"call"],
+P8:{
+"^":"Xs:30;a,b",
+$1:[function(a){return this.a.b9(this.b)},"$1",null,2,0,null,81,"call"],
 $isEH:true},
+dD:{
+"^":"dE;dc<,Sl<,ru<,mA,KX,kP,Vi,BM",
+PJ:function(a){var z=this.dc.gVi()
+this.Vi=(z==null?!1:z)===!0?this.Sl.gVi():this.ru.gVi()},
+RR:function(a,b){return b.RD(this)},
+$asdE:function(){return[U.HB]},
+$isHB:true,
+$ishw:true},
 vl:{
-"^":"Ay;hP<,KL,bO,tj,Lv,k6",
-goc:function(a){var z=this.KL
+"^":"dE;hP<,mA,KX,kP,Vi,BM",
+goc:function(a){var z=this.mA
 return z.goc(z)},
-Qh:function(a){var z,y,x,w
-z=this.hP.gLv()
-if(z==null){this.Lv=null
-return}y=H.vn(z)
-x=this.KL
-w=new H.GD(H.u1(x.goc(x)))
-this.Lv=y.rN(w).gAx()
-x=J.x(z)
-if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.Li(this,a,w))},
-RR:function(a,b){return b.co(this)},
-$asAy:function(){return[U.x9]},
+PJ:function(a){var z,y,x
+z=this.hP.gVi()
+if(z==null){this.Vi=null
+return}y=this.mA
+y=y.goc(y)
+x=$.b7().d8.t(0,y)
+this.Vi=$.cp().jD(z,x)
+y=J.x(z)
+if(!!y.$isd3)this.kP=y.gqh(z).yI(new K.Zu(this,a,x))},
+RR:function(a,b){return b.T7(this)},
+$asdE:function(){return[U.x9]},
 $isx9:true,
 $ishw:true},
-Li:{
-"^":"Tp:116;a,b,c",
-$1:[function(a){if(J.ja(a,new K.WK(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
+Zu:{
+"^":"Xs:30;a,b,c",
+$1:[function(a){if(J.xq(a,new K.WKb(this.c))===!0)this.a.b9(this.b)},"$1",null,2,0,null,125,"call"],
 $isEH:true},
-WK:{
-"^":"Tp:116;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+WKb:{
+"^":"Xs:30;d",
+$1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 iT:{
-"^":"Ay;hP<,Jn<,KL,bO,tj,Lv,k6",
-Qh:function(a){var z,y,x
-z=this.hP.gLv()
-if(z==null){this.Lv=null
-return}y=this.Jn.gLv()
+"^":"dE;hP<,Jn<,mA,KX,kP,Vi,BM",
+PJ:function(a){var z,y,x
+z=this.hP.gVi()
+if(z==null){this.Vi=null
+return}y=this.Jn.gVi()
 x=J.U6(z)
-this.Lv=x.t(z,y)
-if(!!x.$isd3)this.tj=x.gUj(z).yI(new K.tE(this,a,y))},
+this.Vi=x.t(z,y)
+if(!!x.$isd3)this.kP=x.gqh(z).yI(new K.z5(this,a,y))},
 RR:function(a,b){return b.CU(this)},
-$asAy:function(){return[U.zX]},
+$asdE:function(){return[U.zX]},
 $iszX:true,
 $ishw:true},
-tE:{
-"^":"Tp:116;a,b,c",
-$1:[function(a){if(J.ja(a,new K.ey(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
+z5:{
+"^":"Xs:30;a,b,c",
+$1:[function(a){if(J.xq(a,new K.ey(this.c))===!0)this.a.b9(this.b)},"$1",null,2,0,null,125,"call"],
 $isEH:true},
 ey:{
-"^":"Tp:116;d",
-$1:[function(a){return!!J.x(a).$isHA&&J.de(a.G3,this.d)},"$1",null,2,0,null,289,[],"call"],
+"^":"Xs:30;d",
+$1:function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.d)},
 $isEH:true},
-fa:{
-"^":"Ay;hP<,re<,KL,bO,tj,Lv,k6",
-gbP:function(a){var z=this.KL
-return z.gbP(z)},
-Qh:function(a){var z,y,x,w,v
+xJ:{
+"^":"dE;hP<,re<,mA,KX,kP,Vi,BM",
+gSf:function(a){var z=this.mA
+return z.gSf(z)},
+PJ:function(a){var z,y,x,w
 z=this.re
 z.toString
-y=H.VM(new H.A8(z,new K.WW()),[null,null]).br(0)
-x=this.hP.gLv()
-if(x==null){this.Lv=null
-return}z=this.KL
-if(z.gbP(z)==null)this.Lv=K.ci(!!J.x(x).$iswL?x.lR.F2(x.ex,y,null).Ax:H.im(x,y,P.Te(null)))
-else{w=H.vn(x)
-v=new H.GD(H.u1(z.gbP(z)))
-this.Lv=w.F2(v,y,null).Ax
+y=H.VM(new H.lJ(z,new K.WW()),[null,null]).br(0)
+x=this.hP.gVi()
+if(x==null){this.Vi=null
+return}z=this.mA
+if(z.gSf(z)==null){z=H.im(x,y,P.Te(null))
+this.Vi=!!J.x(z).$iscb?B.zR(z,null):z}else{z=z.gSf(z)
+w=$.b7().d8.t(0,z)
+this.Vi=$.cp().Ck(x,w,y,!1,null)
 z=J.x(x)
-if(!!z.$isd3)this.tj=z.gUj(x).yI(new K.vQ(this,a,v))}},
-RR:function(a,b){return b.ZR(this)},
-$asAy:function(){return[U.Jy]},
+if(!!z.$isd3)this.kP=z.gqh(x).yI(new K.vQ(this,a,w))}},
+RR:function(a,b){return b.og(this)},
+$asdE:function(){return[U.Jy]},
 $isJy:true,
 $ishw:true},
 WW:{
-"^":"Tp:116;",
-$1:[function(a){return a.gLv()},"$1",null,2,0,null,118,[],"call"],
+"^":"Xs:30;",
+$1:[function(a){return a.gVi()},"$1",null,2,0,null,22,"call"],
 $isEH:true},
 vQ:{
-"^":"Tp:491;a,b,c",
-$1:[function(a){if(J.ja(a,new K.a9(this.c))===!0)this.a.DX(this.b)},"$1",null,2,0,null,496,[],"call"],
+"^":"Xs:136;a,b,c",
+$1:[function(a){if(J.xq(a,new K.ho(this.c))===!0)this.a.b9(this.b)},"$1",null,2,0,null,125,"call"],
 $isEH:true},
-a9:{
-"^":"Tp:116;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.de(a.oc,this.d)},"$1",null,2,0,null,289,[],"call"],
+ho:{
+"^":"Xs:30;d",
+$1:function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},
 $isEH:true},
 VA:{
-"^":"Ay;Bb>,T8>,KL,bO,tj,Lv,k6",
-Qh:function(a){var z,y,x,w
+"^":"dE;Bb>,T8>,mA,KX,kP,Vi,BM",
+PJ:function(a){var z,y,x,w
 z=this.Bb
-y=this.T8.gLv()
+y=this.T8.gVi()
 x=J.x(y)
-if(!x.$isQV&&y!=null)throw H.b(K.kG("right side of 'in' is not an iterator"))
-if(!!x.$iswn)this.tj=y.gvp().yI(new K.J1(this,a))
+if(!x.$iscX&&y!=null)throw H.b(K.xn("right side of 'in' is not an iterator"))
+if(!!x.$iswn)this.kP=y.gRT().yI(new K.J1(this,a))
 x=J.Vm(z)
 w=y!=null?y:C.xD
-this.Lv=new K.fk(x,w)},
+this.Vi=new K.fk(x,w)},
 RR:function(a,b){return b.ky(this)},
-$asAy:function(){return[U.X7]},
-$isX7:true,
+$asdE:function(){return[U.Cu]},
+$isCu:true,
 $ishw:true},
 J1:{
-"^":"Tp:116;a,b",
-$1:[function(a){return this.a.DX(this.b)},"$1",null,2,0,null,117,[],"call"],
+"^":"Xs:30;a,b",
+$1:[function(a){return this.a.b9(this.b)},"$1",null,2,0,null,81,"call"],
 $isEH:true},
 fk:{
-"^":"a;F5,bm",
+"^":"a;xG,bm",
 $isfk:true},
-wL:{
-"^":"a:116;lR,ex",
-$1:[function(a){return this.lR.F2(this.ex,[a],null).Ax},"$1","gKu",2,0,null,504,[]],
-$iswL:true,
-$isEH:true},
-B0:{
+nD:{
 "^":"a;G1>",
 bu:function(a){return"EvalException: "+this.G1},
-$isB0:true,
-static:{kG:function(a){return new K.B0(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
+static:{xn:function(a){return new K.nD(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
 "^":"",
-Pu:[function(a,b){var z,y
+Pu:function(a,b){var z,y
 if(a==null?b==null:a===b)return!0
 if(a==null||b==null)return!1
 if(a.length!==b.length)return!1
 for(z=0;z<a.length;++z){y=a[z]
 if(z>=b.length)return H.e(b,z)
-if(!J.de(y,b[z]))return!1}return!0},"$2","xV",4,0,null,118,[],199,[]],
-au:[function(a){a.toString
-return U.xk(H.n3(a,0,new U.xs()))},"$1","bT",2,0,null,286,[]],
-Zm:[function(a,b){var z=J.WB(a,b)
+if(!J.xC(y,b[z]))return!1}return!0},
+b1:function(a){a.toString
+return U.OT(H.n3(a,0,new U.xs()))},
+Zd:function(a,b){var z=J.WB(a,b)
 if(typeof z!=="number")return H.s(z)
 a=536870911&z
 a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},"$2","uN",4,0,null,238,[],30,[]],
-xk:[function(a){if(typeof a!=="number")return H.s(a)
+return a^a>>>6},
+OT:function(a){if(typeof a!=="number")return H.s(a)
 a=536870911&a+((67108863&a)<<3>>>0)
 a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},"$1","Zy",2,0,null,238,[]],
-tc:{
+return 536870911&a+((16383&a)<<15>>>0)},
+Fs:{
 "^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,505,21,[],118,[]],
-F2:function(a,b,c){return new U.Jy(a,b,c)}},
+Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,137,1,22]},
 hw:{
 "^":"a;",
 $ishw:true},
-EZ:{
+WH:{
 "^":"hw;",
 RR:function(a,b){return b.W9(this)},
-$isEZ:true},
+$isWH:true},
 no:{
 "^":"hw;P>",
-RR:function(a,b){return b.ti(this)},
+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)},
 n:function(a,b){var z
 if(b==null)return!1
 z=H.RB(b,"$isno",[H.Kp(this,0)],"$asno")
-return z&&J.de(J.Vm(b),this.P)},
+return z&&J.xC(J.Vm(b),this.P)},
 giO:function(a){return J.v1(this.P)},
 $isno:true},
-kB:{
-"^":"hw;Pu>",
+c0:{
+"^":"hw;hL<",
+RR:function(a,b){return b.Zh(this)},
+bu:function(a){return H.d(this.hL)},
+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.b1(this.hL)},
+$isc0:true},
+Qb:{
+"^":"hw;Rl>",
 RR:function(a,b){return b.o0(this)},
-bu:function(a){return"{"+H.d(this.Pu)+"}"},
+bu:function(a){return"{"+H.d(this.Rl)+"}"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$iskB&&U.Pu(z.gPu(b),this.Pu)},
-giO:function(a){return U.au(this.Pu)},
-$iskB:true},
-wk:{
+return!!z.$isQb&&U.Pu(z.gRl(b),this.Rl)},
+giO:function(a){return U.b1(this.Rl)},
+$isQb:true},
+ae:{
 "^":"hw;G3>,v4<",
 RR:function(a,b){return b.YV(this)},
 bu:function(a){return this.G3.bu(0)+": "+H.d(this.v4)},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$iswk&&J.de(z.gG3(b),this.G3)&&J.de(b.gv4(),this.v4)},
+return!!z.$isae&&J.xC(z.gG3(b),this.G3)&&J.xC(b.gv4(),this.v4)},
 giO:function(a){var z,y
 z=J.v1(this.G3.P)
 y=J.v1(this.v4)
-return U.xk(U.Zm(U.Zm(0,z),y))},
-$iswk:true},
-XC:{
+return U.OT(U.Zd(U.Zd(0,z),y))},
+$isae:true},
+Iq:{
 "^":"hw;wz",
 RR:function(a,b){return b.LT(this)},
 bu:function(a){return"("+H.d(this.wz)+")"},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isXC&&J.de(b.wz,this.wz)},
+return!!J.x(b).$isIq&&J.xC(b.wz,this.wz)},
 giO:function(a){return J.v1(this.wz)},
-$isXC:true},
-w6:{
+$isIq:true},
+elO:{
 "^":"hw;P>",
 RR:function(a,b){return b.qv(this)},
 bu:function(a){return this.P},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isw6&&J.de(z.gP(b),this.P)},
+return!!z.$iselO&&J.xC(z.gP(b),this.P)},
 giO:function(a){return J.v1(this.P)},
-$isw6:true},
-jK:{
-"^":"hw;kp>,wz<",
+$iselO:true},
+cJ:{
+"^":"hw;xS>,wz<",
 RR:function(a,b){return b.Hx(this)},
-bu:function(a){return H.d(this.kp)+" "+H.d(this.wz)},
+bu:function(a){return H.d(this.xS)+" "+H.d(this.wz)},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isjK&&J.de(z.gkp(b),this.kp)&&J.de(b.gwz(),this.wz)},
+return!!z.$iscJ&&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.xk(U.Zm(U.Zm(0,z),y))},
-$isjK:true},
-uk:{
-"^":"hw;kp>,Bb>,T8>",
-RR:function(a,b){return b.im(this)},
-bu:function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},
+return U.OT(U.Zd(U.Zd(0,z),y))},
+$iscJ:true},
+Mp:{
+"^":"hw;xS>,Bb>,T8>",
+RR:function(a,b){return b.ex(this)},
+bu:function(a){return"("+H.d(this.Bb)+" "+H.d(this.xS)+" "+H.d(this.T8)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isuk&&J.de(z.gkp(b),this.kp)&&J.de(z.gBb(b),this.Bb)&&J.de(z.gT8(b),this.T8)},
+return!!z.$isMp&&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.xk(U.Zm(U.Zm(U.Zm(0,z),y),x))},
-$isuk:true},
-X7:{
+return U.OT(U.Zd(U.Zd(U.Zd(0,z),y),x))},
+$isMp:true},
+HB:{
+"^":"hw;dc<,Sl<,ru<",
+RR:function(a,b){return b.RD(this)},
+bu:function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.ru)+")"},
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isHB&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
+giO:function(a){var z,y,x
+z=J.v1(this.dc)
+y=J.v1(this.Sl)
+x=J.v1(this.ru)
+return U.OT(U.Zd(U.Zd(U.Zd(0,z),y),x))},
+$isHB:true},
+Cu:{
 "^":"hw;Bb>,T8>",
 RR:function(a,b){return b.ky(this)},
 bu:function(a){return"("+H.d(this.Bb)+" in "+H.d(this.T8)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isX7&&J.de(z.gBb(b),this.Bb)&&J.de(z.gT8(b),this.T8)},
+return!!z.$isCu&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
 giO:function(a){var z,y
 z=this.Bb
 z=z.giO(z)
 y=J.v1(this.T8)
-return U.xk(U.Zm(U.Zm(0,z),y))},
-$isX7:true},
+return U.OT(U.Zd(U.Zd(0,z),y))},
+$isCu:true},
 zX:{
 "^":"hw;hP<,Jn<",
 RR:function(a,b){return b.CU(this)},
 bu:function(a){return H.d(this.hP)+"["+H.d(this.Jn)+"]"},
 n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iszX&&J.de(b.ghP(),this.hP)&&J.de(b.gJn(),this.Jn)},
+return!!J.x(b).$iszX&&J.xC(b.ghP(),this.hP)&&J.xC(b.gJn(),this.Jn)},
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.Jn)
-return U.xk(U.Zm(U.Zm(0,z),y))},
+return U.OT(U.Zd(U.Zd(0,z),y))},
 $iszX:true},
 x9:{
 "^":"hw;hP<,oc>",
-RR:function(a,b){return b.co(this)},
+RR:function(a,b){return b.T7(this)},
 bu:function(a){return H.d(this.hP)+"."+H.d(this.oc)},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isx9&&J.de(b.ghP(),this.hP)&&J.de(z.goc(b),this.oc)},
+return!!z.$isx9&&J.xC(b.ghP(),this.hP)&&J.xC(z.goc(b),this.oc)},
 giO:function(a){var z,y
 z=J.v1(this.hP)
 y=J.v1(this.oc)
-return U.xk(U.Zm(U.Zm(0,z),y))},
+return U.OT(U.Zd(U.Zd(0,z),y))},
 $isx9:true},
 Jy:{
-"^":"hw;hP<,bP>,re<",
-RR:function(a,b){return b.ZR(this)},
-bu:function(a){return H.d(this.hP)+"."+H.d(this.bP)+"("+H.d(this.re)+")"},
+"^":"hw;hP<,Sf>,re<",
+RR:function(a,b){return b.og(this)},
+bu:function(a){return H.d(this.hP)+"."+H.d(this.Sf)+"("+H.d(this.re)+")"},
 n:function(a,b){var z
 if(b==null)return!1
 z=J.x(b)
-return!!z.$isJy&&J.de(b.ghP(),this.hP)&&J.de(z.gbP(b),this.bP)&&U.Pu(b.gre(),this.re)},
+return!!z.$isJy&&J.xC(b.ghP(),this.hP)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
 giO:function(a){var z,y,x
 z=J.v1(this.hP)
-y=J.v1(this.bP)
-x=U.au(this.re)
-return U.xk(U.Zm(U.Zm(U.Zm(0,z),y),x))},
+y=J.v1(this.Sf)
+x=U.b1(this.re)
+return U.OT(U.Zd(U.Zd(U.Zd(0,z),y),x))},
 $isJy:true},
 xs:{
-"^":"Tp:300;",
-$2:[function(a,b){return U.Zm(a,J.v1(b))},"$2",null,4,0,null,506,[],507,[],"call"],
+"^":"Xs:50;",
+$2:function(a,b){return U.Zd(a,J.v1(b))},
 $isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
 "^":"",
 FX:{
-"^":"a;Sk,GP,qM,fL",
-glQ:function(){return this.fL.lo},
-XJ:function(a,b){var z
-if(!(a!=null&&!J.de(J.Iz(this.fL.lo),a)))z=b!=null&&!J.de(J.Vm(this.fL.lo),b)
+"^":"a;rp,AO,mV,vi",
+gQi:function(){return this.vi.lo},
+zM:function(a,b){var z
+if(a!=null){z=this.vi.lo
+z=z==null||!J.xC(J.Iz(z),a)}else z=!1
+if(!z)if(b!=null){z=this.vi.lo
+z=z==null||!J.xC(J.Vm(z),b)}else z=!1
 else z=!0
-if(z)throw H.b(Y.RV("Expected "+H.d(b)+": "+H.d(this.glQ())))
-this.fL.G()},
-w5:function(){return this.XJ(null,null)},
-o9:function(){if(this.fL.lo==null){this.Sk.toString
-return C.OL}var z=this.WT()
-return z==null?null:this.BH(z,0)},
-BH:function(a,b){var z,y,x,w
-for(;z=this.fL.lo,z!=null;)if(J.de(J.Iz(z),9))if(J.de(J.Vm(this.fL.lo),"(")){y=this.qj()
-this.Sk.toString
-a=new U.Jy(a,null,y)}else if(J.de(J.Vm(this.fL.lo),"[")){x=this.eY()
-this.Sk.toString
+if(z)throw H.b(Y.B3("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gQi())))
+this.vi.G()},
+Bp:function(){return this.zM(null,null)},
+GI:function(a){return this.zM(a,null)},
+Te:function(){if(this.vi.lo==null){this.rp.toString
+return C.x4}var z=this.Yq()
+return z==null?null:this.FH(z,0)},
+FH:function(a,b){var z,y,x,w,v,u
+for(;z=this.vi.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.vi.lo),"(")){y=this.GN()
+this.rp.toString
+a=new U.Jy(a,null,y)}else if(J.xC(J.Vm(this.vi.lo),"[")){x=this.Ew()
+this.rp.toString
 a=new U.zX(a,x)}else break
-else if(J.de(J.Iz(this.fL.lo),3)){this.w5()
-a=this.qL(a,this.WT())}else if(J.de(J.Iz(this.fL.lo),10)&&J.de(J.Vm(this.fL.lo),"in")){if(!J.x(a).$isw6)H.vh(Y.RV("in... statements must start with an identifier"))
-this.w5()
-w=this.o9()
-this.Sk.toString
-a=new U.X7(a,w)}else if(J.de(J.Iz(this.fL.lo),8)&&J.J5(this.fL.lo.gG8(),b))a=this.Tw(a)
-else break
-return a},
-qL:function(a,b){var z,y
+else if(J.xC(J.Iz(this.vi.lo),3)){this.Bp()
+a=this.j6(a,this.Yq())}else if(J.xC(J.Iz(this.vi.lo),10)&&J.xC(J.Vm(this.vi.lo),"in")){if(!J.x(a).$iselO)H.vh(Y.B3("in... statements must start with an identifier"))
+this.Bp()
+w=this.Te()
+this.rp.toString
+a=new U.Cu(a,w)}else{if(J.xC(J.Iz(this.vi.lo),8)){z=this.vi.lo.gP9()
+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.vi.lo),"?")){this.zM(8,"?")
+v=this.Te()
+this.GI(5)
+u=this.Te()
+this.rp.toString
+a=new U.HB(a,v,u)}else a=this.ZJ(a)
+else break}return a},
+j6:function(a,b){var z,y
 z=J.x(b)
-if(!!z.$isw6){z=z.gP(b)
-this.Sk.toString
-return new U.x9(a,z)}else if(!!z.$isJy&&!!J.x(b.ghP()).$isw6){z=J.Vm(b.ghP())
+if(!!z.$iselO){z=z.gP(b)
+this.rp.toString
+return new U.x9(a,z)}else if(!!z.$isJy&&!!J.x(b.ghP()).$iselO){z=J.Vm(b.ghP())
 y=b.gre()
-this.Sk.toString
-return new U.Jy(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
-Tw:function(a){var z,y,x
-z=this.fL.lo
-this.w5()
-y=this.WT()
-while(!0){x=this.fL.lo
-if(x!=null)x=(J.de(J.Iz(x),8)||J.de(J.Iz(this.fL.lo),3)||J.de(J.Iz(this.fL.lo),9))&&J.z8(this.fL.lo.gG8(),z.gG8())
+this.rp.toString
+return new U.Jy(a,z,y)}else throw H.b(Y.B3("expected identifier: "+H.d(b)))},
+ZJ:function(a){var z,y,x,w
+z=this.vi.lo
+this.Bp()
+y=this.Yq()
+while(!0){x=this.vi.lo
+if(x!=null)if(J.xC(J.Iz(x),8)||J.xC(J.Iz(this.vi.lo),3)||J.xC(J.Iz(this.vi.lo),9)){x=this.vi.lo.gP9()
+w=z.gP9()
+if(typeof x!=="number")return x.D()
+if(typeof w!=="number")return H.s(w)
+w=x>w
+x=w}else x=!1
 else x=!1
 if(!x)break
-y=this.BH(y,this.fL.lo.gG8())}x=J.Vm(z)
-this.Sk.toString
-return new U.uk(x,a,y)},
-WT:function(){var z,y,x,w
-if(J.de(J.Iz(this.fL.lo),8)){z=J.Vm(this.fL.lo)
+y=this.FH(y,this.vi.lo.gP9())}x=J.Vm(z)
+this.rp.toString
+return new U.Mp(x,a,y)},
+Yq:function(){var z,y,x,w
+if(J.xC(J.Iz(this.vi.lo),8)){z=J.Vm(this.vi.lo)
 y=J.x(z)
-if(y.n(z,"+")||y.n(z,"-")){this.w5()
-if(J.de(J.Iz(this.fL.lo),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.fL.lo)),null,null)
-this.Sk.toString
+if(y.n(z,"+")||y.n(z,"-")){this.Bp()
+if(J.xC(J.Iz(this.vi.lo),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.vi.lo)),null,null)
+this.rp.toString
 z=new U.no(y)
 z.$builtinTypeInfo=[null]
-this.w5()
-return z}else{y=this.Sk
-if(J.de(J.Iz(this.fL.lo),7)){x=H.IH(H.d(z)+H.d(J.Vm(this.fL.lo)),null)
+this.Bp()
+return z}else{y=this.rp
+if(J.xC(J.Iz(this.vi.lo),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.vi.lo)),null)
 y.toString
 z=new U.no(x)
 z.$builtinTypeInfo=[null]
-this.w5()
-return z}else{w=this.BH(this.Ai(),11)
+this.Bp()
+return z}else{w=this.FH(this.yL(),11)
 y.toString
-return new U.jK(z,w)}}}else if(y.n(z,"!")){this.w5()
-w=this.BH(this.Ai(),11)
-this.Sk.toString
-return new U.jK(z,w)}}return this.Ai()},
-Ai:function(){var z,y,x
-switch(J.Iz(this.fL.lo)){case 10:z=J.Vm(this.fL.lo)
+return new U.cJ(z,w)}}}else if(y.n(z,"!")){this.Bp()
+w=this.FH(this.yL(),11)
+this.rp.toString
+return new U.cJ(z,w)}}return this.yL()},
+yL:function(){var z,y,x
+switch(J.Iz(this.vi.lo)){case 10:z=J.Vm(this.vi.lo)
 y=J.x(z)
-if(y.n(z,"this")){this.w5()
-this.Sk.toString
-return new U.w6("this")}else if(y.n(z,"in"))return
+if(y.n(z,"this")){this.Bp()
+this.rp.toString
+return new U.elO("this")}else if(y.n(z,"in"))return
 throw H.b(P.u("unrecognized keyword: "+H.d(z)))
-case 2:return this.Cy()
-case 1:return this.qF()
-case 6:return this.Ud()
-case 7:return this.tw()
-case 9:if(J.de(J.Vm(this.fL.lo),"(")){this.w5()
-x=this.o9()
-this.XJ(9,")")
-this.Sk.toString
-return new U.XC(x)}else if(J.de(J.Vm(this.fL.lo),"{"))return this.Wc()
+case 2:return this.qK()
+case 1:return this.ef()
+case 6:return this.DS()
+case 7:return this.Xk()
+case 9:if(J.xC(J.Vm(this.vi.lo),"(")){this.Bp()
+x=this.Te()
+this.zM(9,")")
+this.rp.toString
+return new U.Iq(x)}else if(J.xC(J.Vm(this.vi.lo),"{"))return this.pH()
+else if(J.xC(J.Vm(this.vi.lo),"["))return this.S9()
 return
+case 5:throw H.b(P.u("unexpected token \":\""))
 default:return}},
-Wc:function(){var z,y,x
+S9:function(){var z,y
 z=[]
-do{this.w5()
-if(J.de(J.Iz(this.fL.lo),9)&&J.de(J.Vm(this.fL.lo),"}"))break
-y=J.Vm(this.fL.lo)
-this.Sk.toString
+do{this.Bp()
+if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"]"))break
+z.push(this.Te())
+y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
+this.zM(9,"]")
+return new U.c0(z)},
+pH:function(){var z,y,x
+z=[]
+do{this.Bp()
+if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"}"))break
+y=J.Vm(this.vi.lo)
+this.rp.toString
 x=new U.no(y)
 x.$builtinTypeInfo=[null]
-this.w5()
-this.XJ(5,":")
-z.push(new U.wk(x,this.o9()))
-y=this.fL.lo}while(y!=null&&J.de(J.Vm(y),","))
-this.XJ(9,"}")
-return new U.kB(z)},
-Cy:function(){var z,y,x
-if(J.de(J.Vm(this.fL.lo),"true")){this.w5()
-this.Sk.toString
-return H.VM(new U.no(!0),[null])}if(J.de(J.Vm(this.fL.lo),"false")){this.w5()
-this.Sk.toString
-return H.VM(new U.no(!1),[null])}if(J.de(J.Vm(this.fL.lo),"null")){this.w5()
-this.Sk.toString
-return H.VM(new U.no(null),[null])}if(!J.de(J.Iz(this.fL.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.glQ())+".value"))
-z=J.Vm(this.fL.lo)
-this.w5()
-this.Sk.toString
-y=new U.w6(z)
-x=this.qj()
+this.Bp()
+this.zM(5,":")
+z.push(new U.ae(x,this.Te()))
+y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
+this.zM(9,"}")
+return new U.Qb(z)},
+qK:function(){var z,y,x
+if(J.xC(J.Vm(this.vi.lo),"true")){this.Bp()
+this.rp.toString
+return H.VM(new U.no(!0),[null])}if(J.xC(J.Vm(this.vi.lo),"false")){this.Bp()
+this.rp.toString
+return H.VM(new U.no(!1),[null])}if(J.xC(J.Vm(this.vi.lo),"null")){this.Bp()
+this.rp.toString
+return H.VM(new U.no(null),[null])}if(!J.xC(J.Iz(this.vi.lo),2))H.vh(Y.B3("expected identifier: "+H.d(this.gQi())+".value"))
+z=J.Vm(this.vi.lo)
+this.Bp()
+this.rp.toString
+y=new U.elO(z)
+x=this.GN()
 if(x==null)return y
 else return new U.Jy(y,null,x)},
-qj:function(){var z,y
-z=this.fL.lo
-if(z!=null&&J.de(J.Iz(z),9)&&J.de(J.Vm(this.fL.lo),"(")){y=[]
-do{this.w5()
-if(J.de(J.Iz(this.fL.lo),9)&&J.de(J.Vm(this.fL.lo),")"))break
-y.push(this.o9())
-z=this.fL.lo}while(z!=null&&J.de(J.Vm(z),","))
-this.XJ(9,")")
+GN:function(){var z,y
+z=this.vi.lo
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"(")){y=[]
+do{this.Bp()
+if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),")"))break
+y.push(this.Te())
+z=this.vi.lo}while(z!=null&&J.xC(J.Vm(z),","))
+this.zM(9,")")
 return y}return},
-eY:function(){var z,y
-z=this.fL.lo
-if(z!=null&&J.de(J.Iz(z),9)&&J.de(J.Vm(this.fL.lo),"[")){this.w5()
-y=this.o9()
-this.XJ(9,"]")
+Ew:function(){var z,y
+z=this.vi.lo
+if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"[")){this.Bp()
+y=this.Te()
+this.zM(9,"]")
 return y}return},
-qF:function(){var z,y
-z=J.Vm(this.fL.lo)
-this.Sk.toString
+ef:function(){var z,y
+z=J.Vm(this.vi.lo)
+this.rp.toString
 y=H.VM(new U.no(z),[null])
-this.w5()
+this.Bp()
 return y},
-pT0:function(a){var z,y
-z=H.BU(H.d(a)+H.d(J.Vm(this.fL.lo)),null,null)
-this.Sk.toString
+iV:function(a){var z,y
+z=H.BU(H.d(a)+H.d(J.Vm(this.vi.lo)),null,null)
+this.rp.toString
 y=H.VM(new U.no(z),[null])
-this.w5()
+this.Bp()
 return y},
-Ud:function(){return this.pT0("")},
-yj:function(a){var z,y
-z=H.IH(H.d(a)+H.d(J.Vm(this.fL.lo)),null)
-this.Sk.toString
+DS:function(){return this.iV("")},
+u3:function(a){var z,y
+z=H.RR(H.d(a)+H.d(J.Vm(this.vi.lo)),null)
+this.rp.toString
 y=H.VM(new U.no(z),[null])
-this.w5()
+this.Bp()
 return y},
-tw:function(){return this.yj("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
+Xk:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
 "^":"",
-Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","UM",2,0,287,127,[]],
-Ae:{
-"^":"a;vH>-326,P>-508",
-n:[function(a,b){if(b==null)return!1
-return!!J.x(b).$isAe&&J.de(b.vH,this.vH)&&J.de(b.P,this.P)},"$1","gUJ",2,0,116,99,[],"=="],
-giO:[function(a){return J.v1(this.P)},null,null,1,0,487,"hashCode"],
-bu:[function(a){return"("+H.d(this.vH)+", "+H.d(this.P)+")"},"$0","gXo",0,0,312,"toString"],
-$isAe:true,
-"@":function(){return[C.Nw]},
-"<>":[3],
-static:{i0:[function(a,b,c){return H.VM(new K.Ae(a,b),[c])},null,null,4,0,function(){return H.IG(function(a){return{func:"ep",args:[J.bU,a]}},this.$receiver,"Ae")},15,[],30,[],"new IndexedValue"]}},
-"+IndexedValue":[0],
+Dc:[function(a){return H.VM(new K.Bt(a),[null])},"$1","G5",2,0,43,44],
+O1:{
+"^":"a;vH>,P>",
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isO1&&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)+")"},
+$isO1:true},
 Bt:{
-"^":"mW;ty",
-gA:function(a){var z=new K.vR(J.GP(this.ty),0,null)
+"^":"mW;F5",
+gA:function(a){var z=new K.vR(J.mY(this.F5),0,null)
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-gB:function(a){return J.q8(this.ty)},
-gl0:function(a){return J.FN(this.ty)},
+gB:function(a){return J.q8(this.F5)},
+gl0:function(a){return J.FN(this.F5)},
 grZ:function(a){var z,y
-z=this.ty
+z=this.F5
 y=J.U6(z)
-z=new K.Ae(J.xH(y.gB(z),1),y.grZ(z))
+z=new K.O1(J.xH(y.gB(z),1),y.grZ(z))
 z.$builtinTypeInfo=this.$builtinTypeInfo
 return z},
-Zv:function(a,b){var z=new K.Ae(b,J.i4(this.ty,b))
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-$asmW:function(a){return[[K.Ae,a]]},
-$asQV:function(a){return[[K.Ae,a]]}},
+$asmW:function(a){return[[K.O1,a]]},
+$ascX:function(a){return[[K.O1,a]]}},
 vR:{
-"^":"AC;XY,vk,CK",
-gl:function(){return this.CK},
-G:function(){var z=this.XY
-if(z.G()){this.CK=H.VM(new K.Ae(this.vk++,z.gl()),[null])
-return!0}this.CK=null
+"^":"AC;Tr,Mv,Ta",
+gl:function(){return this.Ta},
+G:function(){var z=this.Tr
+if(z.G()){this.Ta=H.VM(new K.O1(this.Mv++,z.gl()),[null])
+return!0}this.Ta=null
 return!1},
-$asAC:function(a){return[[K.Ae,a]]}}}],["polymer_expressions.src.mirrors","package:polymer_expressions/src/mirrors.dart",,Z,{
+$asAC:function(a){return[[K.O1,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
 "^":"",
-y1:[function(a,b){var z,y,x
-if(a.gYK().nb.x4(b))return a.gYK().nb.t(0,b)
-z=a.gAY()
-if(z!=null&&!J.de(J.Ba(z),C.PU)){y=Z.y1(a.gAY(),b)
-if(y!=null)return y}for(x=J.GP(a.gkZ());x.G();){y=Z.y1(x.lo,b)
-if(y!=null)return y}return},"$2","rz",4,0,null,288,[],12,[]]}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
-"^":"",
-wX:[function(a){switch(a){case 102:return 12
+Ox:function(a){switch(a){case 102:return 12
 case 110:return 10
 case 114:return 13
 case 116:return 9
 case 118:return 11
-default:return a}},"$1","uO",2,0,null,289,[]],
-Pn:{
-"^":"a;fY>,P>,G8<",
+default:return a}},
+qS:{
+"^":"a;fY>,P>,P9<",
 bu:function(a){return"("+this.fY+", '"+this.P+"')"},
-$isPn:true},
-hc:{
-"^":"a;MV,zy,jI,VQ",
-zl:function(){var z,y,x,w,v,u,t,s
+$isqS:true},
+pa:{
+"^":"a;MV,zy,jI,x0",
+rD:function(){var z,y,x,w,v,u,t,s
 z=this.jI
-this.VQ=z.G()?z.Wn:null
-for(y=this.MV;x=this.VQ,x!=null;)if(x===32||x===9||x===160)this.VQ=z.G()?z.Wn:null
-else if(x===34||x===39)this.DS()
+this.x0=z.G()?z.Wn:null
+for(y=this.MV;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()
 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()
 else if(48<=x&&x<=57)this.jj()
 else if(x===46){x=z.G()?z.Wn:null
-this.VQ=x
+this.x0=x
 if(typeof x!=="number")return H.s(x)
-if(48<=x&&x<=57)this.e1()
-else y.push(new Y.Pn(3,".",11))}else if(x===44){this.VQ=z.G()?z.Wn:null
-y.push(new Y.Pn(4,",",0))}else if(x===58){this.VQ=z.G()?z.Wn:null
-y.push(new Y.Pn(5,":",0))}else if(C.Nm.tg(C.xu,x)){v=this.VQ
+if(48<=x&&x<=57)this.oz()
+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.tg(C.bg,x)){v=this.x0
 x=z.G()?z.Wn:null
-this.VQ=x
-if(C.Nm.tg(C.xu,x)){x=this.VQ
+this.x0=x
+if(C.Nm.tg(C.bg,x)){x=this.x0
 u=H.eT([v,x])
-if(C.Nm.tg(C.u0,u)){this.VQ=z.G()?z.Wn:null
+if(C.Nm.tg(C.G8,u)){this.x0=z.G()?z.Wn:null
 t=u}else t=H.Lw(v)}else t=H.Lw(v)
-y.push(new Y.Pn(8,t,C.dj.t(0,t)))}else if(C.Nm.tg(C.iq,this.VQ)){s=H.Lw(this.VQ)
-y.push(new Y.Pn(9,s,C.dj.t(0,s)))
-this.VQ=z.G()?z.Wn:null}else this.VQ=z.G()?z.Wn:null}return y},
-DS:function(){var z,y,x,w
-z=this.VQ
+y.push(new Y.qS(8,t,C.Mk.t(0,t)))}else if(C.Nm.tg(C.ML,this.x0)){s=H.Lw(this.x0)
+y.push(new Y.qS(9,s,C.Mk.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
+z=this.x0
 y=this.jI
 x=y.G()?y.Wn:null
-this.VQ=x
-for(w=this.zy;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
+this.x0=x
+for(w=this.zy;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.B3("unterminated string"))
 if(x===92){x=y.G()?y.Wn:null
-this.VQ=x
-if(x==null)throw H.b(Y.RV("unterminated string"))
-x=H.Lw(Y.wX(x))
+this.x0=x
+if(x==null)throw H.b(Y.B3("unterminated string"))
+x=H.Lw(Y.Ox(x))
 w.vM+=x}else{x=H.Lw(x)
 w.vM+=x}x=y.G()?y.Wn:null
-this.VQ=x}this.MV.push(new Y.Pn(1,w.vM,0))
+this.x0=x}this.MV.push(new Y.qS(1,w.vM,0))
 w.vM=""
-this.VQ=y.G()?y.Wn:null},
+this.x0=y.G()?y.Wn:null},
 zI:function(){var z,y,x,w,v
 z=this.jI
 y=this.zy
-while(!0){x=this.VQ
+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
 else w=!0
@@ -14290,372 +13515,367 @@
 if(!w)break
 x=H.Lw(x)
 y.vM+=x
-this.VQ=z.G()?z.Wn:null}v=y.vM
+this.x0=z.G()?z.Wn:null}v=y.vM
 z=this.MV
-if(C.Nm.tg(C.Qy,v))z.push(new Y.Pn(10,v,0))
-else z.push(new Y.Pn(2,v,0))
+if(C.Nm.tg(C.Cd,v))z.push(new Y.qS(10,v,0))
+else z.push(new Y.qS(2,v,0))
 y.vM=""},
 jj:function(){var z,y,x,w
 z=this.jI
 y=this.zy
-while(!0){x=this.VQ
+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.Lw(x)
 y.vM+=x
-this.VQ=z.G()?z.Wn:null}if(x===46){z=z.G()?z.Wn:null
-this.VQ=z
+this.x0=z.G()?z.Wn:null}if(x===46){z=z.G()?z.Wn:null
+this.x0=z
 if(typeof z!=="number")return H.s(z)
-if(48<=z&&z<=57)this.e1()
-else this.MV.push(new Y.Pn(3,".",11))}else{this.MV.push(new Y.Pn(6,y.vM,0))
+if(48<=z&&z<=57)this.oz()
+else this.MV.push(new Y.qS(3,".",11))}else{this.MV.push(new Y.qS(6,y.vM,0))
 y.vM=""}},
-e1:function(){var z,y,x,w
+oz:function(){var z,y,x,w
 z=this.zy
 z.KF(H.Lw(46))
 y=this.jI
-while(!0){x=this.VQ
+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.Lw(x)
 z.vM+=x
-this.VQ=y.G()?y.Wn:null}this.MV.push(new Y.Pn(7,z.vM,0))
+this.x0=y.G()?y.Wn:null}this.MV.push(new Y.qS(7,z.vM,0))
 z.vM=""}},
 hA:{
 "^":"a;G1>",
 bu:function(a){return"ParseException: "+this.G1},
-static:{RV:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
+static:{B3:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
 "^":"",
-fr:{
+Jg:{
 "^":"a;",
-DV:[function(a){return J.UK(a,this)},"$1","gnG",2,0,509,94,[]]},
-d2:{
-"^":"fr;",
-W9:function(a){return this.xn(a)},
+DV:[function(a){return J.okV(a,this)},"$1","gnG",2,0,138,117]},
+cfS:{
+"^":"Jg;",
+xn:function(a){},
+W9:function(a){this.xn(a)},
 LT:function(a){a.wz.RR(0,this)
 this.xn(a)},
-co:function(a){J.UK(a.ghP(),this)
+T7:function(a){J.okV(a.ghP(),this)
 this.xn(a)},
-CU:function(a){J.UK(a.ghP(),this)
-J.UK(a.gJn(),this)
+CU:function(a){J.okV(a.ghP(),this)
+J.okV(a.gJn(),this)
 this.xn(a)},
-ZR:function(a){var z
-J.UK(a.ghP(),this)
-z=a.gre()
-if(z!=null)for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
+og:function(a){var z
+J.okV(a.ghP(),this)
+if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
-ti:function(a){return 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.Kp(z,0)]);z.G();)J.okV(z.lo,this)
+this.xn(a)},
 o0:function(a){var z
-for(z=a.gPu(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.UK(z.lo,this)
+for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.okV(z.lo,this)
 this.xn(a)},
-YV:function(a){J.UK(a.gG3(a),this)
-J.UK(a.gv4(),this)
+YV:function(a){J.okV(a.gG3(a),this)
+J.okV(a.gv4(),this)
 this.xn(a)},
-qv:function(a){return this.xn(a)},
-im:function(a){J.UK(a.gBb(a),this)
-J.UK(a.gT8(a),this)
+qv:function(a){this.xn(a)},
+ex:function(a){J.okV(a.gBb(a),this)
+J.okV(a.gT8(a),this)
 this.xn(a)},
-Hx:function(a){J.UK(a.gwz(),this)
+Hx:function(a){J.okV(a.gwz(),this)
 this.xn(a)},
-ky:function(a){J.UK(a.gBb(a),this)
-J.UK(a.gT8(a),this)
+RD:function(a){J.okV(a.gdc(),this)
+J.okV(a.gSl(),this)
+J.okV(a.gru(),this)
+this.xn(a)},
+ky:function(a){J.okV(a.gBb(a),this)
+J.okV(a.gT8(a),this)
 this.xn(a)}}}],["response_viewer_element","package:observatory/src/elements/response_viewer.dart",,Q,{
 "^":"",
-NQ:{
-"^":["V28;kW%-475,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-guw:[function(a){return a.kW},null,null,1,0,476,"app",308,311],
-suw:[function(a,b){a.kW=this.ct(a,C.wh,a.kW,b)},null,null,3,0,477,30,[],"app",308],
-"@":function(){return[C.Is]},
-static:{Zo:[function(a){var z,y,x,w
+qZ:{
+"^":"V29;GF,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+giJ:function(a){return a.GF},
+siJ:function(a,b){a.GF=this.ct(a,C.j2,a.GF,b)},
+static:{RH:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.Cc.ZL(a)
-C.Cc.oX(a)
-return a},null,null,0,0,115,"new ResponseViewerElement$created"]}},
-"+ResponseViewerElement":[510],
-V28:{
+C.Cc.XI(a)
+return a}}},
+V29:{
 "^":"uL+Pi;",
 $isd3:true}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
 "^":"",
-SM:{
-"^":["V29;QV%-511,t7%-326,hX%-326,FZ%-304,Bs%-512,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.QV},null,null,1,0,513,"script",308,311],
-sNl:[function(a,b){a.QV=this.ct(a,C.fX,a.QV,b)},null,null,3,0,514,30,[],"script",308],
-gBV:[function(a){return a.t7},null,null,1,0,487,"pos",308,311],
-sBV:[function(a,b){a.t7=this.ct(a,C.Kl,a.t7,b)},null,null,3,0,363,30,[],"pos",308],
-giX:[function(a){return a.hX},null,null,1,0,487,"endPos",308,311],
-siX:[function(a,b){a.hX=this.ct(a,C.Gr,a.hX,b)},null,null,3,0,363,30,[],"endPos",308],
-gHp:[function(a){return a.FZ},null,null,1,0,307,"coverage",308,311],
-sHp:[function(a,b){a.FZ=this.ct(a,C.Xs,a.FZ,b)},null,null,3,0,310,30,[],"coverage",308],
-gSw:[function(a){return a.Bs},null,null,1,0,515,"lines",308,309],
-sSw:[function(a,b){a.Bs=this.ct(a,C.Cv,a.Bs,b)},null,null,3,0,516,30,[],"lines",308],
+Uy:{
+"^":"V30;Ny,GR,cI,FZ,Kf,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gtu:function(a){return a.Ny},
+stu:function(a,b){a.Ny=this.ct(a,C.PX,a.Ny,b)},
+gBV:function(a){return a.GR},
+sBV:function(a,b){a.GR=this.ct(a,C.tW,a.GR,b)},
+gMl:function(a){return a.cI},
+sMl:function(a,b){a.cI=this.ct(a,C.Gr,a.cI,b)},
+gqw:function(a){return a.FZ},
+sqw:function(a,b){a.FZ=this.ct(a,C.WZ,a.FZ,b)},
+gGd:function(a){return a.Kf},
+sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
 rh:[function(a,b){this.VH(a)
-this.ct(a,C.wq,0,1)},"$1","grO",2,0,169,242,[],"scriptChanged"],
-Ly:[function(a,b){this.VH(a)},"$1","gXN",2,0,169,242,[],"posChanged"],
-OM:[function(a,b){this.ct(a,C.Cv,0,1)
-this.ct(a,C.wq,0,1)},"$1","gTA",2,0,116,242,[],"coverageChanged"],
-qEQ:[function(a,b){var z,y
-z=a.QV
+this.ct(a,C.wq,0,1)},"$1","grO",2,0,15,34],
+fX:[function(a,b){this.VH(a)},"$1","gXN",2,0,15,34],
+xx:[function(a,b){this.ct(a,C.SA,0,1)
+this.ct(a,C.wq,0,1)},"$1","gTA",2,0,30,34],
+fT:[function(a,b){var z,y
+z=a.Ny
 if(z==null||a.FZ!==!0)return"min-width:32px;"
-y=J.UQ(z.gu9(),b.gRd())
+y=z.gu9().Zp.t(0,b.gRd())
 if(y==null)return"min-width:32px;"
-if(J.de(y,0))return"min-width:32px;background-color:red"
-return"min-width:32px;background-color:green"},"$1","gL0",2,0,517,192,[],"hitStyle",309],
-VH:[function(a){var z,y,x,w,v
-if(J.iS(a.QV)!==!0){J.SK(a.QV).ml(new T.ZJ(a))
-return}this.ct(a,C.Cv,0,1)
-J.U2(a.Bs)
-z=a.QV.q6(a.t7)
-if(z!=null){y=a.hX
-x=a.QV
-if(y==null)J.wT(a.Bs,J.UQ(J.Ew(x),J.xH(z,1)))
+if(J.xC(y,0))return"min-width:32px;background-color:red"
+return"min-width:32px;background-color:green"},"$1","gL0",2,0,139,140],
+VH:function(a){var z,y,x,w,v
+if(J.zg(a.Ny)!==!0){J.SK(a.Ny).ml(new T.Wd(a))
+return}this.ct(a,C.SA,0,1)
+J.U2(a.Kf)
+z=a.Ny.q6(a.GR)
+if(z!=null){y=a.cI
+x=a.Ny
+if(y==null)J.bi(a.Kf,J.UQ(J.de(x),J.xH(z,1)))
 else{w=x.q6(y)
-for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.wT(a.Bs,J.UQ(J.Ew(a.QV),y.W(v,1)))}}},"$0","gI2",0,0,126,"_updateProperties"],
-"@":function(){return[C.OLi]},
-static:{"^":"bN<-85,JP<-85,VnP<-85",T5:[function(a){var z,y,x,w,v
-z=R.Jk([])
+for(v=z;y=J.Wx(v),y.E(v,w);v=y.g(v,1))J.bi(a.Kf,J.UQ(J.de(a.Ny),y.W(v,1)))}}},
+static:{"^":"bN,MRW,VnP",Zz:function(a){var z,y,x,w,v
+z=R.tB([])
 y=$.Nd()
-x=P.Py(null,null,null,J.O,W.I0)
-w=J.O
-v=W.cv
-v=H.VM(new V.qC(P.Py(null,null,null,w,v),null,null),[w,v])
+x=P.YM(null,null,null,P.qU,W.I0)
+w=P.qU
+v=W.h4
+v=H.VM(new V.qC(P.YM(null,null,null,w,v),null,null),[w,v])
 a.FZ=!1
-a.Bs=z
-a.SO=y
-a.B7=x
-a.X0=v
-C.HD.ZL(a)
-C.HD.oX(a)
-return a},null,null,0,0,115,"new ScriptInsetElement$created"]}},
-"+ScriptInsetElement":[518],
-V29:{
+a.Kf=z
+a.on=y
+a.BA=x
+a.LL=v
+C.oA.ZL(a)
+C.oA.XI(a)
+return a}}},
+V30:{
 "^":"uL+Pi;",
 $isd3:true},
-ZJ:{
-"^":"Tp:116;a-85",
-$1:[function(a){var z,y
-z=this.a
-y=J.RE(z)
-if(J.iS(y.gQV(z))===!0)y.VH(z)},"$1",null,2,0,116,117,[],"call"],
-$isEH:true},
-"+ ZJ":[315]}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
+Wd:{
+"^":"Xs:30;a",
+$1:[function(a){var z=this.a
+if(J.zg(z.Ny)===!0)J.NO(z)},"$1",null,2,0,null,81,"call"],
+$isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
 "^":"",
-knI:{
-"^":["x4;jJ%-326,AP,fn,tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gBV:[function(a){return a.jJ},null,null,1,0,487,"pos",308,311],
-sBV:[function(a,b){a.jJ=this.ct(a,C.Kl,a.jJ,b)},null,null,3,0,363,30,[],"pos",308],
-gD5:[function(a){var z=a.tY
-if(z==null)return Q.xI.prototype.gD5.call(this,a)
-return z.gzz()},null,null,1,0,312,"hoverText"],
-Ly:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,169,242,[],"posChanged"],
+kn:{
+"^":"ZzR;jJ,AP,fn,tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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.gzz()},
+fX:[function(a,b){this.r6(a,null)},"$1","gXN",2,0,15,34],
 r6:[function(a,b){var z=a.tY
-if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,169,117,[],"_updateProperties"],
-goc:[function(a){var z,y
+if(z!=null&&J.zg(z)===!0){this.ct(a,C.YS,0,1)
+this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,15,81],
+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)
+if(J.J5(a.jJ,0)){z=J.zg(a.tY)
 y=a.tY
 if(z===!0)return H.d(Q.xI.prototype.goc.call(this,a))+":"+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},null,null,1,0,312,"name"],
-gO3:[function(a){var z,y
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.goc.call(this,a)},
+gO3:function(a){var z,y
 if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
-if(J.J5(a.jJ,0)){z=J.iS(a.tY)
+if(J.J5(a.jJ,0)){z=J.zg(a.tY)
 y=a.tY
 if(z===!0)return Q.xI.prototype.gO3.call(this,a)+"#line="+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},null,null,1,0,312,"url"],
-"@":function(){return[C.Ur]},
-static:{Th:[function(a){var z,y,x,w
+else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},
+static:{D2:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.jJ=-1
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.c0.ZL(a)
-C.c0.oX(a)
-return a},null,null,0,0,115,"new ScriptRefElement$created"]}},
-"+ScriptRefElement":[519],
-x4:{
+a.on=z
+a.BA=y
+a.LL=w
+C.Mh.ZL(a)
+C.Mh.XI(a)
+return a}}},
+ZzR:{
 "^":"xI+Pi;",
 $isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
 "^":"",
 fI:{
-"^":["V30;Uz%-511,HJ%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gNl:[function(a){return a.Uz},null,null,1,0,513,"script",308,311],
-sNl:[function(a,b){a.Uz=this.ct(a,C.fX,a.Uz,b)},null,null,3,0,514,30,[],"script",308],
-gjG:[function(a){return a.HJ},null,null,1,0,307,"showCoverage",308,311],
-sjG:[function(a,b){a.HJ=this.ct(a,C.V0,a.HJ,b)},null,null,3,0,310,30,[],"showCoverage",308],
-i4:[function(a){var z
-Z.uL.prototype.i4.call(this,a)
+"^":"V31;Uz,HJ,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gtu:function(a){return a.Uz},
+stu:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
+gnN:function(a){return a.HJ},
+snN:function(a,b){a.HJ=this.ct(a,C.XY,a.HJ,b)},
+q0:function(a){var z
+Z.uL.prototype.q0.call(this,a)
 z=a.Uz
 if(z==null)return
-J.SK(z)},"$0","gQd",0,0,126,"enteredView"],
-ii:[function(a,b){J.Aw((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gKg",2,0,116,242,[],"showCoverageChanged"],
-pA:[function(a,b){J.am(a.Uz).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-j9:[function(a,b){J.IQ(J.QP(a.Uz)).YM(b)},"$1","gWp",2,0,169,339,[],"refreshCoverage"],
-"@":function(){return[C.I3]},
-static:{Ry:[function(a){var z,y,x,w
+J.SK(z)},
+RB:[function(a,b){J.Zg((a.shadowRoot||a.webkitShadowRoot).querySelector("#scriptInset"),a.HJ)},"$1","gVU",2,0,30,34],
+RF:[function(a,b){J.LE(a.Uz).wM(b)},"$1","gvC",2,0,15,65],
+j9:[function(a,b){J.y9(J.aT(a.Uz)).wM(b)},"$1","gWp",2,0,15,65],
+static:{UF:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.HJ=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.cJ.ZL(a)
-C.cJ.oX(a)
-return a},null,null,0,0,115,"new ScriptViewElement$created"]}},
-"+ScriptViewElement":[520],
-V30:{
+a.on=z
+a.BA=y
+a.LL=w
+C.FH.ZL(a)
+C.FH.XI(a)
+return a}}},
+V31:{
 "^":"uL+Pi;",
 $isd3:true}}],["service","package:observatory/service.dart",,D,{
 "^":"",
-ac:function(a,b){var z,y,x,w,v,u,t,s
+hi:function(a,b){var z,y,x,w,v,u,t,s
 if(b==null)return
 z=J.U6(b)
 z=z.t(b,"id")!=null&&z.t(b,"type")!=null
-if(!z)N.Jx("").hh("Malformed service object: "+H.d(b))
+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"Code":z=[]
-z.$builtinTypeInfo=[D.Vi]
+z.$builtinTypeInfo=[D.ta]
 x=[]
-x.$builtinTypeInfo=[D.Vi]
-w=D.Q4
+x.$builtinTypeInfo=[D.ta]
+w=D.DP
 v=[]
 v.$builtinTypeInfo=[w]
 v=new Q.wn(null,null,v,null,null)
 v.$builtinTypeInfo=[w]
-w=J.bU
-u=D.N8
-t=new V.qC(P.Py(null,null,null,w,u),null,null)
+w=P.KN
+u=D.uA
+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)
 break
-case"Error":s=new D.pD(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"Error":s=new D.ft(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"Isolate":z=new V.qC(P.Py(null,null,null,null,null),null,null)
+case"Isolate":z=new V.qC(P.YM(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
-x=P.L5(null,null,null,J.O,D.af)
+x=P.L5(null,null,null,P.qU,D.af)
 w=[]
-w.$builtinTypeInfo=[J.O]
+w.$builtinTypeInfo=[P.qU]
 v=[]
-v.$builtinTypeInfo=[D.e5]
+v.$builtinTypeInfo=[D.ER]
 u=D.U4
 t=[]
 t.$builtinTypeInfo=[u]
 t=new Q.wn(null,null,t,null,null)
 t.$builtinTypeInfo=[u]
-u=P.L5(null,null,null,J.O,J.Pp)
-u=R.Jk(u)
-s=new D.bv(z,null,!1,!1,!0,x,new D.tL(w,v,null,null,20,0),null,t,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+u=P.L5(null,null,null,P.qU,P.CP)
+u=R.tB(u)
+s=new D.bv(z,null,!1,!1,!0,!1,x,new D.tL(w,v,null,null,20,0),null,t,null,null,null,null,null,u,0,0,0,0,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
 case"Library":z=D.U4
 x=[]
 x.$builtinTypeInfo=[z]
 x=new Q.wn(null,null,x,null,null)
 x.$builtinTypeInfo=[z]
-z=D.rj
+z=D.vx
 w=[]
 w.$builtinTypeInfo=[z]
 w=new Q.wn(null,null,w,null,null)
 w.$builtinTypeInfo=[z]
-z=D.SI
+z=D.vO
 v=[]
 v.$builtinTypeInfo=[z]
 v=new Q.wn(null,null,v,null,null)
 v.$builtinTypeInfo=[z]
-z=D.SI
+z=D.vO
 u=[]
 u.$builtinTypeInfo=[z]
 u=new Q.wn(null,null,u,null,null)
 u.$builtinTypeInfo=[z]
-z=D.SI
+z=D.vO
 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)
 break
-case"ServiceError":s=new D.fJ(null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"ServiceError":s=new D.N7(null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-case"ServiceException":s=new D.hR(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+case"ServiceException":s=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]
-z=J.bU
-w=J.bU
-v=new V.qC(P.Py(null,null,null,z,w),null,null)
+z=P.KN
+w=P.KN
+v=new V.qC(P.YM(null,null,null,z,w),null,null)
 v.$builtinTypeInfo=[z,w]
-s=new D.rj(x,v,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
+s=new D.vx(x,v,null,null,null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
 break
-default:z=new V.qC(P.Py(null,null,null,null,null),null,null)
+default:z=new V.qC(P.YM(null,null,null,null,null),null,null)
 z.$builtinTypeInfo=[null,null]
-s=new D.SI(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
+s=new D.vO(z,a,null,null,!1,null,null,null,null,null)}s.eC(b)
 return s},
-D5:[function(a){var z
+bF:function(a){var z
 if(a!=null){z=J.U6(a)
 z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
-return z},"$1","SSc",2,0,null,202,[]],
-ES:[function(a,b){var z=J.x(a)
-if(!!z.$isSI)return
+return z},
+tg:function(a,b){var z=J.x(a)
+if(!!z.$isvO)return
 if(!!z.$isqC)D.Gf(a,b)
-else if(!!z.$iswn)D.f3(a,b)},"$2","Ja",4,0,null,290,[],156,[]],
-Gf:[function(a,b){a.aN(0,new D.UZ(a,b))},"$2","nV",4,0,null,162,[],156,[]],
-f3:[function(a,b){var z,y,x,w,v,u
-for(z=a.ao,y=0;y<z.length;++y){x=z[y]
+else if(!!z.$iswn)D.f3(a,b)},
+Gf:function(a,b){a.aN(0,new D.UZ(a,b))},
+f3:function(a,b){var z,y,x,w,v,u
+for(z=a.Jo,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
 else u=!1
-if(u)a.u(0,y,b.Zr(x))
+if(u)a.u(0,y,b.Qn(x))
 else if(!!w.$iswn)D.f3(x,b)
-else if(v)D.Gf(x,b)}},"$2","PV",4,0,null,76,[],156,[]],
+else if(v)D.Gf(x,b)}},
 af:{
-"^":"Pi;bN@,GR@",
-gXP:[function(){return this.P3},null,null,1,0,521,"owner",308],
-gzf:[function(a){var z=this.P3
-return z.gzf(z)},null,null,1,0,522,"vm",308],
-gF1:[function(a){var z=this.P3
-return z.gF1(z)},null,null,1,0,318,"isolate",308],
-gjO:[function(a){return this.KG},null,null,1,0,312,"id",308],
-gzS:[function(){return this.mQ},null,null,1,0,312,"serviceType",308],
-gPj:[function(a){var z,y
-z=this.gF1(this)
-y=this.KG
-return H.d(z.KG)+"/"+H.d(y)},null,null,1,0,312,"link",308],
-gHP:[function(){return"#/"+H.d(this.gPj(this))},null,null,1,0,312,"hashLink",308],
-sHP:[function(a){},null,null,3,0,116,99,[],"hashLink",308],
-gox:function(a){return this.kT},
+"^":"Pi;NM@,t7@",
+gwv:function(a){var z=this.Jz
+return z.gwv(z)},
+god:function(a){var z=this.Jz
+return z.god(z)},
+gjO:function(a){return this.r0},
+gzS:function(){return this.mQ},
+gPj:function(a){var z,y
+z=this.god(this)
+y=this.r0
+return H.d(z.r0)+"/"+H.d(y)},
+gHP:function(){return"#/"+H.d(this.gPj(this))},
+sHP:function(a){},
+glQ:function(a){return this.kT},
 gUm:function(){return!1},
-gM8:function(){return!1},
-goc:[function(a){return this.gbN()},null,null,1,0,312,"name",308,309],
-soc:[function(a,b){this.sbN(this.ct(this,C.YS,this.gbN(),b))},null,null,3,0,32,30,[],"name",308],
-gzz:[function(){return this.gGR()},null,null,1,0,312,"vmName",308,309],
-szz:[function(a){this.sGR(this.ct(this,C.KS,this.gGR(),a))},null,null,3,0,32,30,[],"vmName",308],
-xW:function(a){if(this.kT)return P.Ab(this,null)
+gfS:function(){return!1},
+goc:function(a){return this.gNM()},
+soc:function(a,b){this.sNM(this.ct(this,C.YS,this.gNM(),b))},
+gzz:function(){return this.gt7()},
+szz:function(a){this.st7(this.ct(this,C.Tc,this.gt7(),a))},
+xW:function(a){if(this.kT)return P.PG(this,null)
 return this.VD(0)},
 VD:function(a){var z
-if(J.de(this.KG,""))return P.Ab(this,null)
-if(this.kT&&this.gM8())return P.Ab(this,null)
+if(J.xC(this.r0,""))return P.PG(this,null)
+if(this.kT&&this.gfS())return P.PG(this,null)
 z=this.VR
-if(z==null){z=this.gzf(this).jU(this.gPj(this)).ml(new D.Pa(this)).YM(new D.jI(this))
+if(z==null){z=this.gwv(this).HL(this.gPj(this)).ml(new D.Pa(this)).wM(new D.jI(this))
 this.VR=z}return z},
 eC:function(a){var z,y,x,w
 z=J.U6(a)
@@ -14663,46 +13883,40 @@
 x=z.t(a,"type")
 w=J.rY(x)
 if(w.nC(x,"@"))x=w.yn(x,1)
-w=this.KG
-if(w!=null&&!J.de(w,z.t(a,"id")));this.KG=z.t(a,"id")
+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)},
 $isaf:true},
 Pa:{
-"^":"Tp:454;a",
+"^":"Xs:142;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.de(z,y.mQ))return D.ac(y.P3,a)
+if(!J.xC(z,y.mQ))return D.hi(y.Jz,a)
 y.eC(a)
-return y},"$1",null,2,0,null,162,[],"call"],
+return y},"$1",null,2,0,null,141,"call"],
 $isEH:true},
 jI:{
-"^":"Tp:115;b",
+"^":"Xs:47;b",
 $0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
 $isEH:true},
-u0g:{
+fz:{
 "^":"af;"},
-zM:{
-"^":"O1w;Li<,G2<",
-gzf:[function(a){return this},null,null,1,0,522,"vm",308],
-gF1:[function(a){return},null,null,1,0,318,"isolate",308],
-gi2:[function(){var z=this.z7
-return z.gUQ(z)},null,null,1,0,523,"isolates",308],
-gPj:[function(a){return H.d(this.KG)},null,null,1,0,312,"link",308],
-gYe:[function(a){return this.Ox},null,null,1,0,312,"version",308,309],
-sYe:[function(a,b){this.Ox=F.Wi(this,C.zn,this.Ox,b)},null,null,3,0,32,30,[],"version",308],
-gF6:[function(){return this.GY},null,null,1,0,312,"architecture",308,309],
-sF6:[function(a){this.GY=F.Wi(this,C.US,this.GY,a)},null,null,3,0,32,30,[],"architecture",308],
-gUn:[function(){return this.Rp},null,null,1,0,524,"uptime",308,309],
-sUn:[function(a){this.Rp=F.Wi(this,C.mh,this.Rp,a)},null,null,3,0,525,30,[],"uptime",308],
-gC3:[function(){return this.Ts},null,null,1,0,307,"assertsEnabled",308,309],
-sC3:[function(a){this.Ts=F.Wi(this,C.ly,this.Ts,a)},null,null,3,0,310,30,[],"assertsEnabled",308],
-gPV:[function(){return this.Va},null,null,1,0,307,"typeChecksEnabled",308,309],
-sPV:[function(a){this.Va=F.Wi(this,C.J2,this.Va,a)},null,null,3,0,310,30,[],"typeChecksEnabled",308],
-bZ:function(a){var z,y,x,w
+wv:{
+"^":"O1w;",
+gwv:function(a){return this},
+god:function(a){return},
+gi2:function(){var z=this.z7
+return z.gUQ(z)},
+gPj:function(a){return H.d(this.r0)},
+gYe:function(){return this.Ox},
+gJk:function(){return this.RW},
+gA3:function(){return this.Ts},
+gEy:function(){return this.Va},
+hV:function(a){var z,y,x,w
 z=$.rc().R4(0,a)
 if(z==null)return
 y=z.QK
@@ -14713,7 +13927,7 @@
 if(typeof y!=="number")return H.s(y)
 return C.xB.yn(x,w+y)},
 jz:function(a){var z,y,x
-z=$.PY().R4(0,a)
+z=$.OX().R4(0,a)
 if(z==null)return""
 y=z.QK
 x=y.index
@@ -14721,13 +13935,13 @@
 y=J.q8(y[0])
 if(typeof y!=="number")return H.s(y)
 return J.Nj(a,0,x+y)},
-Zr:function(a){throw H.b(P.SY(null))},
-Tn:function(a){var z
-if(a==="")return P.Ab(null,null)
+Qn:function(a){throw H.b(P.SY(null))},
+dJ:function(a){var z
+if(a==="")return P.PG(null,null)
 z=this.z7.t(0,a)
-if(z!=null)return P.Ab(z,null)
+if(z!=null)return P.PG(z,null)
 return this.VD(0).ml(new D.MZ(this,a))},
-cv:function(a){var z,y,x,w,v
+ox:function(a){var z,y,x,w,v
 z={}
 z.a=a
 y=J.uH(a,"#")
@@ -14735,23 +13949,23 @@
 a=y[0]
 z.a=a
 if(J.co(a,"isolates/")){x=this.jz(z.a)
-w=this.bZ(z.a)
-return this.Tn(x).ml(new D.oe(this,w))}v=this.A4.t(0,z.a)
-if(v!=null)return J.am(v)
-return this.jU(z.a).ml(new D.kk(z,this))},
-Nw:[function(a,b){return b},"$2","gS6",4,0,300,49,[],30,[]],
-b2:function(a){var z,y,x
+w=this.hV(z.a)
+return this.dJ(x).ml(new D.kk(this,w))}v=this.Qy.t(0,z.a)
+if(v!=null)return J.LE(v)
+return this.HL(z.a).ml(new D.lb(z,this))},
+nJ:[function(a,b){return b},"$2","ge1",4,0,50],
+ng:function(a){var z,y,x
 z=null
-try{y=new P.Cf(this.gS6())
-z=P.BS(a,y.gN5())}catch(x){H.Ru(x)
-return}return R.Jk(z)},
+try{y=new P.Cf(this.ge1())
+z=P.jc(a,y.gqa())}catch(x){H.Ru(x)
+return}return R.tB(z)},
 N7:function(a){var z
-if(!D.D5(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.ac(this,R.Jk(z)),null,null)}z=J.U6(a)
-if(J.de(z.t(a,"type"),"ServiceError"))return P.Vu(D.ac(this,a),null,null)
-else if(J.de(z.t(a,"type"),"ServiceException"))return P.Vu(D.ac(this,a),null,null)
-return P.Ab(a,null)},
-jU:function(a){return this.z6(0,a).ml(new D.Ey(this)).yd(new D.tm(this),new D.Gk()).yd(new D.mR(this),new D.bp())},
+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.hi(this,R.tB(z)),null,null)}z=J.U6(a)
+if(J.xC(z.t(a,"type"),"ServiceError"))return P.Vu(D.hi(this,a),null,null)
+else if(J.xC(z.t(a,"type"),"ServiceException"))return P.Vu(D.hi(this,a),null,null)
+return P.PG(a,null)},
+HL:function(a){return this.z6(0,a).ml(new D.zA(this)).co(new D.tm(this),new D.mR()).co(new D.bp(this),new D.hc())},
 bF:function(a,b,c){var z,y
 if(c)return
 this.kT=!0
@@ -14761,114 +13975,114 @@
 y=z.t(b,"architecture")
 this.GY=F.Wi(this,C.US,this.GY,y)
 y=z.t(b,"uptime")
-this.Rp=F.Wi(this,C.mh,this.Rp,y)
+this.RW=F.Wi(this,C.mh,this.RW,y)
 y=z.t(b,"assertsEnabled")
-this.Ts=F.Wi(this,C.ly,this.Ts,y)
+this.Ts=F.Wi(this,C.ET,this.Ts,y)
 y=z.t(b,"typeChecksEnabled")
 this.Va=F.Wi(this,C.J2,this.Va,y)
-this.xA(z.t(b,"isolates"))},
-xA:function(a){var z,y,x,w,v,u
+this.E4(z.t(b,"isolates"))},
+E4:function(a){var z,y,x,w,v,u
 z=this.z7
-y=P.L5(null,null,null,J.O,D.bv)
-for(x=J.GP(a);x.G();){w=x.gl()
+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")
 u=z.t(0,v)
 if(u!=null)y.u(0,v,u)
-else{u=D.ac(this,w)
+else{u=D.hi(this,w)
 y.u(0,v,u)
-N.Jx("").To("New isolate '"+H.d(u.KG)+"'")}}y.aN(0,new D.Yu())
+N.QM("").To("New isolate '"+H.d(u.r0)+"'")}}y.aN(0,new D.Yu())
 this.z7=y},
-Lw:function(){this.bN=this.ct(this,C.YS,this.bN,"vm")
-this.GR=this.ct(this,C.KS,this.GR,"vm")
-this.A4.u(0,"vm",this)
+Lw:function(){this.NM=this.ct(this,C.YS,this.NM,"vm")
+this.t7=this.ct(this,C.Tc,this.t7,"vm")
+this.Qy.u(0,"vm",this)
 var z=P.EF(["id","vm","type","@VM"],null,null)
-this.eC(R.Jk(z))},
-$iszM:true},
+this.eC(R.tB(z))},
+$iswv:true},
 O1w:{
-"^":"u0g+Pi;",
+"^":"fz+Pi;",
 $isd3:true},
 MZ:{
-"^":"Tp:116;a,b",
-$1:[function(a){if(!J.x(a).$iszM)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,57,[],"call"],
+"^":"Xs:30;a,b",
+$1:[function(a){if(!J.x(a).$iswv)return
+return this.a.z7.t(0,this.b)},"$1",null,2,0,null,93,"call"],
 $isEH:true},
-oe:{
-"^":"Tp:116;b,c",
+kk:{
+"^":"Xs:30;b,c",
 $1:[function(a){var z
 if(a==null)return this.b
 z=this.c
-if(z==null)return J.am(a)
-else return a.cv(z)},"$1",null,2,0,null,16,[],"call"],
+if(z==null)return J.LE(a)
+else return a.ox(z)},"$1",null,2,0,null,4,"call"],
 $isEH:true},
-kk:{
-"^":"Tp:454;a,d",
+lb:{
+"^":"Xs:142;a,d",
 $1:[function(a){var z,y
 z=this.d
-y=D.ac(z,a)
-if(y.gUm())z.A4.to(this.a.a,new D.QZ(y))
-return y},"$1",null,2,0,null,162,[],"call"],
+y=D.hi(z,a)
+if(y.gUm())z.Qy.to(this.a.a,new D.QZ(y))
+return y},"$1",null,2,0,null,141,"call"],
 $isEH:true},
 QZ:{
-"^":"Tp:115;e",
-$0:[function(){return this.e},"$0",null,0,0,null,"call"],
+"^":"Xs:47;e",
+$0:function(){return this.e},
 $isEH:true},
-Ey:{
-"^":"Tp:116;a",
+zA:{
+"^":"Xs:30;a",
 $1:[function(a){var z,y,x,w
 z=null
-try{z=this.a.b2(a)}catch(x){w=H.Ru(x)
+try{z=this.a.ng(a)}catch(x){w=H.Ru(x)
 y=w
-P.JS("Hit V8 bug.")
+P.mp("Hit V8 bug.")
 w=P.EF(["type","ServiceException","id","","kind","DecodeException","response","This is likely a result of a known V8 bug. Although the the bug has been fixed the fix may not be in your Chrome version. For more information see dartbug.com/18385. Observatory is still functioning and you should try your action again.","message","Could not decode JSON: "+H.d(y)],null,null)
-w=R.Jk(w)
-return P.Vu(D.ac(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,423,[],"call"],
+w=R.tB(w)
+return P.Vu(D.hi(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,96,"call"],
 $isEH:true},
 tm:{
-"^":"Tp:116;b",
+"^":"Xs:30;b",
 $1:[function(a){var z=this.b.G2
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,171,[],"call"],
-$isEH:true},
-Gk:{
-"^":"Tp:116;",
-$1:[function(a){return!!J.x(a).$isfJ},"$1",null,2,0,null,21,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,19,"call"],
 $isEH:true},
 mR:{
-"^":"Tp:116;c",
+"^":"Xs:30;",
+$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,1,"call"],
+$isEH:true},
+bp:{
+"^":"Xs:30;c",
 $1:[function(a){var z=this.c.Li
 if(z.Gv>=4)H.vh(z.q7())
 z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,324,[],"call"],
+return P.Vu(a,null,null)},"$1",null,2,0,null,58,"call"],
 $isEH:true},
-bp:{
-"^":"Tp:116;",
-$1:[function(a){return!!J.x(a).$ishR},"$1",null,2,0,null,21,[],"call"],
+hc:{
+"^":"Xs:30;",
+$1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
 $isEH:true},
 Yu:{
-"^":"Tp:300;",
-$2:[function(a,b){J.am(b)},"$2",null,4,0,null,526,[],16,[],"call"],
+"^":"Xs:50;",
+$2:function(a,b){J.LE(b)},
 $isEH:true},
-e5:{
-"^":"a;SP,hw>,wZ",
-Bv:function(a){var z,y,x,w,v
-z=this.hw
-H.ed(z,0,a)
+ER:{
+"^":"a;SP,KE>,wZ",
+eK:function(a){var z,y,x,w,v
+z=this.KE
+H.xr(z,0,a)
 for(y=z.length,x=0;x<y;++x){w=this.wZ
 v=z[x]
 if(typeof v!=="number")return H.s(v)
 this.wZ=w+v}},
-nZ:function(a,b){var z,y,x,w,v,u,t
-for(z=this.hw,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.t(a,v)
+y8:function(a,b){var z,y,x,w,v,u,t
+for(z=this.KE,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.xH(u,b[v])
 z[v]=u
 t=this.wZ
 if(typeof u!=="number")return H.s(u)
 this.wZ=t+u}},
-wY:function(a,b){var z,y,x,w,v,u
+Vy:function(a,b){var z,y,x,w,v,u
 z=J.U6(b)
-y=this.hw
+y=this.KE
 x=y.length
 w=0
 while(!0){v=z.gB(b)
@@ -14876,15 +14090,15 @@
 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.hw,y=z.length,x=0;x<y;++x)z[x]=0},
-$ise5:true},
+for(z=this.KE,y=z.length,x=0;x<y;++x)z[x]=0},
+$isER:true},
 tL:{
-"^":"a;af<,lI<,TR,yP,hD,RP",
-gZ0:function(){return this.TR},
+"^":"a;af<,lI<,h7,yP,hD,RP",
+gij:function(){return this.h7},
 xZ:function(a,b){var z,y,x,w,v,u
-this.TR=a
+this.h7=a
 z=J.U6(b)
 y=z.t(b,"counters")
 x=this.af
@@ -14893,118 +14107,104 @@
 for(z=this.hD,x=this.lI,w=0;v=this.RP,w<z;++w){if(typeof v!=="number")return H.s(v)
 v=Array(v)
 v.fixed$length=init
-v.$builtinTypeInfo=[J.bU]
-u=new D.e5(0,v,0)
+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)
 z.fixed$length=init
-z=new D.e5(0,H.VM(z,[J.bU]),0)
+z=new D.ER(0,H.VM(z,[P.KN]),0)
 this.yP=z
-z.Bv(y)
+z.eK(y)
 return}z=this.RP
 if(typeof z!=="number")return H.s(z)
 z=Array(z)
 z.fixed$length=init
-u=new D.e5(a,H.VM(z,[J.bU]),0)
-u.nZ(y,this.yP.hw)
-this.yP.wY(0,y)
+u=new D.ER(a,H.VM(z,[P.KN]),0)
+u.y8(y,this.yP.KE)
+this.yP.Vy(0,y)
 z=this.lI
 z.push(u)
-if(z.length>this.hD)C.Nm.KI(z,0)}},
+if(z.length>this.hD)C.Nm.W4(z,0)}},
 bv:{
-"^":["uz4;V3,Jr,EY,eU,zG,A4,KJ,v9,DC,zb,bN:KT@,GR:f5@,Er,cL,LE<-527,Cf,W1,p2,Hw,S9,yv,BC@-440,FF,bj,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.J19]},null,null,null,null,null,null,function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null],
-gzf:[function(a){return this.P3},null,null,1,0,522,"vm",308],
-gF1:[function(a){return this},null,null,1,0,318,"isolate",308],
-ghw:[function(a){return this.V3},null,null,1,0,453,"counters",308,309],
-shw:[function(a,b){this.V3=F.Wi(this,C.MR,this.V3,b)},null,null,3,0,454,30,[],"counters",308],
-gPj:function(a){return this.KG},
-gHP:function(){return"#/"+H.d(this.KG)},
-gBP:[function(a){return this.Jr},null,null,1,0,337,"pauseEvent",308,309],
-sBP:[function(a,b){this.Jr=F.Wi(this,C.yG,this.Jr,b)},null,null,3,0,338,30,[],"pauseEvent",308],
-gLd:[function(){return this.EY},null,null,1,0,307,"running",308,309],
-sLd:[function(a){this.EY=F.Wi(this,C.X8,this.EY,a)},null,null,3,0,310,30,[],"running",308],
-gaj:[function(){return this.eU},null,null,1,0,307,"idle",308,309],
-saj:[function(a){this.eU=F.Wi(this,C.q2,this.eU,a)},null,null,3,0,310,30,[],"idle",308],
-gMN:[function(){return this.zG},null,null,1,0,307,"loading",308,309],
-sMN:[function(a){this.zG=F.Wi(this,C.jA,this.zG,a)},null,null,3,0,310,30,[],"loading",308],
-Mq:[function(a){return H.d(this.KG)+"/"+H.d(a)},"$1","gv2",2,0,528,529,[],"relativeLink",308],
-xQ:[function(a){return"#/"+(H.d(this.KG)+"/"+H.d(a))},"$1","gz9",2,0,528,529,[],"relativeHashLink",308],
+"^":"uz4;V3,Jr,EY,eU,zG,XV,Qy,GH,v9,DC,zb,NM:KT@,t7:PB@,Er,cL,Dr,lP,W1,p2,Hw,vJ,yv,BC<,FF,bj,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+gwv:function(a){return this.Jz},
+god:function(a){return this},
+gKE:function(a){return this.V3},
+sKE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
+gPj:function(a){return this.r0},
+gHP:function(){return"#/"+H.d(this.r0)},
+gBP:function(a){return this.Jr},
+gA6:function(){return this.EY},
+gaj:function(){return this.eU},
+gn0:function(){return this.zG},
+gwg:function(){return this.XV},
+xQ:[function(a){return"#/"+(H.d(this.r0)+"/"+H.d(a))},"$1","gw6",2,0,143,144],
 N3:function(a){var z,y,x,w
 z=H.VM([],[D.kx])
 y=J.U6(a)
-for(x=J.GP(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
+for(x=J.mY(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
 this.c2()
-this.pl(a,z)
+this.hr(a,z)
 w=y.t(a,"exclusive_trie")
-if(w!=null)this.BC=this.KQ(w,z)},
-c2:function(){var z=this.A4
-z.gUQ(z).aN(0,new D.iz())},
-pl:function(a,b){var z,y,x,w
+if(w!=null)this.BC=this.aU(w,z)},
+c2:function(){var z=this.Qy
+z.gUQ(z).aN(0,new D.Xa())},
+hr: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.GP(y);z.G();){w=z.gl()
+for(z=J.mY(y);z.G();){w=z.gl()
 J.UQ(w,"code").eL(w,b,x)}},
-Ms:function(a){return this.cv("coverage").ml(this.gm6())},
-Sd:[function(a){J.kH(J.UQ(a,"coverage"),new D.oa(this))},"$1","gm6",2,0,530,531,[]],
-Zr:function(a){var z,y,x
+lh:[function(a){return this.ox("coverage").ml(this.gJJ())},"$0","gWp",0,0,145],
+na:[function(a){J.kH(J.UQ(a,"coverage"),new D.Yb(this))},"$1","gJJ",2,0,146,147],
+Qn:function(a){var z,y,x
 if(a==null)return
 z=J.UQ(a,"id")
-y=this.A4
+y=this.Qy
 x=y.t(0,z)
 if(x!=null)return x
-x=D.ac(this,a)
+x=D.hi(this,a)
 if(x.gUm())y.u(0,z,x)
 return x},
-cv:function(a){var z=this.A4.t(0,a)
-if(z!=null)return J.am(z)
-return this.P3.jU(H.d(this.KG)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gVc:[function(){return this.v9},null,null,1,0,462,"rootLib",308,309],
-sVc:[function(a){this.v9=F.Wi(this,C.xe,this.v9,a)},null,null,3,0,463,30,[],"rootLib",308],
-gvU:[function(){return this.DC},null,null,1,0,532,"libraries",308,309],
-svU:[function(a){this.DC=F.Wi(this,C.Ij,this.DC,a)},null,null,3,0,533,30,[],"libraries",308],
-gf4:[function(){return this.zb},null,null,1,0,453,"topFrame",308,309],
-sf4:[function(a){this.zb=F.Wi(this,C.EB,this.zb,a)},null,null,3,0,454,30,[],"topFrame",308],
-goc:[function(a){return this.KT},null,null,1,0,312,"name",308,309],
-soc:[function(a,b){this.KT=F.Wi(this,C.YS,this.KT,b)},null,null,3,0,32,30,[],"name",308],
-gzz:[function(){return this.f5},null,null,1,0,312,"vmName",308,309],
-szz:[function(a){this.f5=F.Wi(this,C.KS,this.f5,a)},null,null,3,0,32,30,[],"vmName",308],
-gQ9:[function(){return this.Er},null,null,1,0,312,"mainPort",308,309],
-sQ9:[function(a){this.Er=F.Wi(this,C.dH,this.Er,a)},null,null,3,0,32,30,[],"mainPort",308],
-gw2:[function(){return this.cL},null,null,1,0,534,"entry",308,309],
-sw2:[function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},null,null,3,0,535,30,[],"entry",308],
-gCi:[function(){return this.Cf},null,null,1,0,487,"newHeapUsed",308,309],
-sCi:[function(a){this.Cf=F.Wi(this,C.IO,this.Cf,a)},null,null,3,0,363,30,[],"newHeapUsed",308],
-gcu:[function(){return this.W1},null,null,1,0,487,"oldHeapUsed",308,309],
-scu:[function(a){this.W1=F.Wi(this,C.SW,this.W1,a)},null,null,3,0,363,30,[],"oldHeapUsed",308],
-gab:[function(){return this.p2},null,null,1,0,487,"newHeapCapacity",308,309],
-sab:[function(a){this.p2=F.Wi(this,C.So,this.p2,a)},null,null,3,0,363,30,[],"newHeapCapacity",308],
-gQBR:[function(){return this.Hw},null,null,1,0,487,"oldHeapCapacity",308,309],
-sQBR:[function(a){this.Hw=F.Wi(this,C.Le,this.Hw,a)},null,null,3,0,363,30,[],"oldHeapCapacity",308],
-guT:[function(a){return this.S9},null,null,1,0,312,"fileAndLine",308,309],
-at:function(a,b){return this.guT(this).$1(b)},
-suT:[function(a,b){this.S9=F.Wi(this,C.CX,this.S9,b)},null,null,3,0,32,30,[],"fileAndLine",308],
-gkc:[function(a){return this.yv},null,null,1,0,536,"error",308,309],
-skc:[function(a,b){this.yv=F.Wi(this,C.YU,this.yv,b)},null,null,3,0,537,30,[],"error",308],
+ox:function(a){var z=this.Qy.t(0,a)
+if(z!=null)return J.LE(z)
+return this.Jz.HL(H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
+gVc:function(){return this.v9},
+sVc:function(a){this.v9=F.Wi(this,C.eN,this.v9,a)},
+gvU:function(){return this.DC},
+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)},
+gzz:function(){return this.PB},
+szz:function(a){this.PB=F.Wi(this,C.Tc,this.PB,a)},
+geH:function(){return this.Er},
+gw2:function(){return this.cL},
+sw2:function(a){this.cL=F.Wi(this,C.tP,this.cL,a)},
+gCi:function(){return this.lP},
+guq:function(){return this.W1},
+gxs:function(){return this.p2},
+gQB:function(){return this.Hw},
+gkc:function(a){return this.yv},
+skc:function(a,b){this.yv=F.Wi(this,C.yh,this.yv,b)},
 bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
 z=J.U6(b)
 y=z.t(b,"mainPort")
-this.Er=F.Wi(this,C.dH,this.Er,y)
+this.Er=F.Wi(this,C.wT,this.Er,y)
 y=z.t(b,"name")
 this.KT=F.Wi(this,C.YS,this.KT,y)
 y=z.t(b,"name")
-this.f5=F.Wi(this,C.KS,this.f5,y)
+this.PB=F.Wi(this,C.Tc,this.PB,y)
 if(c)return
 this.kT=!0
-this.zG=F.Wi(this,C.jA,this.zG,!1)
-D.ES(b,this)
-if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.Jx("").hh("Malformed 'Isolate' response: "+H.d(b))
+this.zG=F.Wi(this,C.DY,this.zG,!1)
+D.tg(b,this)
+if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heap")==null){N.QM("").YX("Malformed 'Isolate' response: "+H.d(b))
 return}y=z.t(b,"rootLib")
-this.v9=F.Wi(this,C.xe,this.v9,y)
+this.v9=F.Wi(this,C.eN,this.v9,y)
 if(z.t(b,"entry")!=null){y=z.t(b,"entry")
 this.cL=F.Wi(this,C.tP,this.cL,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
-this.zb=F.Wi(this,C.EB,this.zb,y)}else this.zb=F.Wi(this,C.EB,this.zb,null)
+this.zb=F.Wi(this,C.bc,this.zb,y)}else this.zb=F.Wi(this,C.bc,this.zb,null)
 x=z.t(b,"tagCounters")
 if(x!=null){y=J.U6(x)
 w=y.t(x,"names")
@@ -15018,8 +14218,8 @@
 s=y.t(v,t)
 if(typeof s!=="number")return H.s(s)
 u+=s;++t}s=P.Fl(null,null)
-s=R.Jk(s)
-this.V3=F.Wi(this,C.MR,this.V3,s)
+s=R.tB(s)
+this.V3=F.Wi(this,C.bJ,this.V3,s)
 if(u===0){y=J.U6(w)
 t=0
 while(!0){s=y.gB(w)
@@ -15030,9 +14230,9 @@
 while(!0){r=s.gB(w)
 if(typeof r!=="number")return H.s(r)
 if(!(t<r))break
-J.kW(this.V3,s.t(w,t),C.CD.yM(J.FW(y.t(v,t),u)*100,2)+"%");++t}}}q=P.Fl(null,null)
+J.kW(this.V3,s.t(w,t),C.CD.Sy(J.L9(y.t(v,t),u)*100,2)+"%");++t}}}q=P.Fl(null,null)
 J.kH(z.t(b,"timers"),new D.Qq(q))
-y=this.LE
+y=this.Dr
 s=J.w1(y)
 s.u(y,"total",q.t(0,"time_total_runtime"))
 s.u(y,"compile",q.t(0,"time_compilation"))
@@ -15040,32 +14240,37 @@
 s.u(y,"init",J.WB(J.WB(J.WB(q.t(0,"time_script_loading"),q.t(0,"time_creating_snapshot")),q.t(0,"time_isolate_initialization")),q.t(0,"time_bootstrap")))
 s.u(y,"dart",q.t(0,"time_dart_execution"))
 y=J.UQ(z.t(b,"heap"),"usedNew")
-this.Cf=F.Wi(this,C.IO,this.Cf,y)
+this.lP=F.Wi(this,C.EK,this.lP,y)
 y=J.UQ(z.t(b,"heap"),"usedOld")
-this.W1=F.Wi(this,C.SW,this.W1,y)
+this.W1=F.Wi(this,C.ap,this.W1,y)
 y=J.UQ(z.t(b,"heap"),"capacityNew")
 this.p2=F.Wi(this,C.So,this.p2,y)
 y=J.UQ(z.t(b,"heap"),"capacityOld")
-this.Hw=F.Wi(this,C.Le,this.Hw,y)
-y=z.t(b,"pauseEvent")
+this.Hw=F.Wi(this,C.eH,this.Hw,y)
+p=z.t(b,"features")
+if(p!=null)for(y=J.mY(p);y.G();)if(J.xC(y.gl(),"io")){s=this.XV
+if(this.gnz(this)&&!J.xC(s,!0)){s=new T.qI(this,C.h7,s,!0)
+s.$builtinTypeInfo=[null]
+this.SZ(this,s)}this.XV=!0}y=z.t(b,"pauseEvent")
 y=F.Wi(this,C.yG,this.Jr,y)
 this.Jr=y
 y=y==null&&z.t(b,"topFrame")!=null
-this.EY=F.Wi(this,C.X8,this.EY,y)
+this.EY=F.Wi(this,C.L2,this.EY,y)
 y=this.Jr==null&&z.t(b,"topFrame")==null
 this.eU=F.Wi(this,C.q2,this.eU,y)
 y=z.t(b,"error")
-this.yv=F.Wi(this,C.YU,this.yv,y)
-J.U2(this.DC)
-for(z=J.GP(z.t(b,"libraries"));z.G();){p=z.gl()
-J.wT(this.DC,p)}J.LH(this.DC,new D.Yn())},
-m7:function(){return this.P3.jU(H.d(this.KG)+"/profile/tag").ml(new D.AP(this))},
-KQ:function(a,b){this.FF=0
+this.yv=F.Wi(this,C.yh,this.yv,y)
+y=this.DC
+y.V1(y)
+for(z=J.mY(z.t(b,"libraries"));z.G();)y.h(0,z.gl())
+y.XP(y,new D.hU())},
+m7:function(){return this.Jz.HL(H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
+aU:function(a,b){this.FF=0
 this.bj=a
 if(a==null)return
 if(J.u6(J.q8(a),3))return
-return this.AW(b)},
-AW:function(a){var z,y,x,w,v,u,t,s,r,q
+return this.tw(b)},
+tw:function(a){var z,y,x,w,v,u,t,s,r,q
 z=this.bj
 y=this.FF
 if(typeof y!=="number")return y.g()
@@ -15079,8 +14284,8 @@
 this.FF=z+1
 v=J.UQ(y,z)
 z=[]
-z.$builtinTypeInfo=[D.t9]
-u=new D.t9(w,v,z,0)
+z.$builtinTypeInfo=[D.D5]
+u=new D.D5(w,v,z,0)
 y=this.bj
 t=this.FF
 if(typeof t!=="number")return t.g()
@@ -15088,281 +14293,275 @@
 s=J.UQ(y,t)
 if(typeof s!=="number")return H.s(s)
 r=0
-for(;r<s;++r){q=this.AW(a)
+for(;r<s;++r){q=this.tw(a)
 z.push(q)
 y=u.Jv
 t=q.Av
 if(typeof t!=="number")return H.s(t)
 u.Jv=y+t}return u},
 $isbv:true,
-static:{"^":"ZW"}},
+static:{"^":"Sp"}},
 uz4:{
-"^":"u0g+Pi;",
+"^":"fz+Pi;",
 $isd3:true},
-iz:{
-"^":"Tp:116;",
-$1:[function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.QK,a.xM,0)
+Xa:{
+"^":"Xs:30;",
+$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.Kj,a.xM,0)
 a.Du=0
 a.fF=0
 a.mM=F.Wi(a,C.eF,a.mM,"")
 a.qH=F.Wi(a,C.uU,a.qH,"")
-J.U2(a.VS)
-J.U2(a.ci)
-J.U2(a.Oo)}},"$1",null,2,0,null,30,[],"call"],
+C.Nm.sB(a.VS,0)
+C.Nm.sB(a.ci,0)
+a.Oo.V1(0)}},
 $isEH:true},
-oa:{
-"^":"Tp:116;a",
+Yb:{
+"^":"Xs:30;a",
 $1:[function(a){var z=J.U6(a)
-z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,538,[],"call"],
+z.t(a,"script").vW(z.t(a,"hits"))},"$1",null,2,0,null,148,"call"],
 $isEH:true},
 KQ:{
-"^":"Tp:454;a,b",
+"^":"Xs:142;a,b",
 $1:[function(a){var z,y
 z=this.a
-y=D.ac(z,a)
-if(y.gUm())z.A4.to(this.b,new D.Ai(y))
-return y},"$1",null,2,0,null,162,[],"call"],
+y=D.hi(z,a)
+if(y.gUm())z.Qy.to(this.b,new D.Ea(y))
+return y},"$1",null,2,0,null,141,"call"],
 $isEH:true},
-Ai:{
-"^":"Tp:115;c",
-$0:[function(){return this.c},"$0",null,0,0,null,"call"],
+Ea:{
+"^":"Xs:47;c",
+$0:function(){return this.c},
 $isEH:true},
 Qq:{
-"^":"Tp:116;a",
+"^":"Xs:30;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,539,[],"call"],
+this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,149,"call"],
 $isEH:true},
-Yn:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.oE(J.O6(a),J.O6(b))},"$2",null,4,0,null,118,[],199,[],"call"],
+hU:{
+"^":"Xs:50;",
+$2:function(a,b){return J.oE(J.tE(a),J.tE(b))},
 $isEH:true},
 AP:{
-"^":"Tp:454;a",
+"^":"Xs:142;a",
 $1:[function(a){var z,y
 z=Date.now()
 new P.iP(z,!1).EK()
-y=this.a.KJ
+y=this.a.GH
 y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,202,[],"call"],
+return y},"$1",null,2,0,null,110,"call"],
 $isEH:true},
-SI:{
-"^":"af;RF,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gUm:function(){return(J.de(this.mQ,"Class")||J.de(this.mQ,"Function")||J.de(this.mQ,"Field"))&&!J.co(this.KG,$.VZ)},
-gM8:function(){return!1},
-bu:function(a){return P.vW(this.RF)},
+vO:{
+"^":"af;Ce,Jz,r0,mQ,kT,NM,t7,VR,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)},
+gfS:function(){return!1},
+bu:function(a){return P.vW(this.Ce)},
 bF:function(a,b,c){var z,y,x
 this.kT=!c
-z=this.RF
+z=this.Ce
 z.V1(0)
 z.FV(0,b)
 y=z.Zp
 x=y.t(0,"user_name")
-this.bN=this.ct(0,C.YS,this.bN,x)
+this.NM=this.ct(0,C.YS,this.NM,x)
 y=y.t(0,"name")
-this.GR=this.ct(this,C.KS,this.GR,y)
-D.ES(z,this.P3)},
-FV:function(a,b){return this.RF.FV(0,b)},
-V1:function(a){return this.RF.V1(0)},
-di:function(a){return this.RF.Zp.di(a)},
-x4:function(a){return this.RF.Zp.x4(a)},
-aN:function(a,b){return this.RF.Zp.aN(0,b)},
-Rz:function(a,b){return this.RF.Rz(0,b)},
-t:function(a,b){return this.RF.Zp.t(0,b)},
-u:function(a,b,c){this.RF.u(0,b,c)
+this.t7=this.ct(0,C.Tc,this.t7,y)
+D.tg(z,this.Jz)},
+FV:function(a,b){return this.Ce.FV(0,b)},
+V1:function(a){return this.Ce.V1(0)},
+aN:function(a,b){return this.Ce.Zp.aN(0,b)},
+t:function(a,b){return this.Ce.Zp.t(0,b)},
+u:function(a,b,c){this.Ce.u(0,b,c)
 return c},
-gl0:function(a){var z=this.RF.Zp
+gl0:function(a){var z=this.Ce.Zp
 return z.gB(z)===0},
-gor:function(a){var z=this.RF.Zp
+gor:function(a){var z=this.Ce.Zp
 return z.gB(z)!==0},
-gvc:function(){return this.RF.Zp.gvc()},
-gUQ:function(a){var z=this.RF.Zp
+gvc:function(){return this.Ce.Zp.gvc()},
+gUQ:function(a){var z=this.Ce.Zp
 return z.gUQ(z)},
-gB:function(a){var z=this.RF.Zp
+gB:function(a){var z=this.Ce.Zp
 return z.gB(z)},
-BN:[function(a){var z=this.RF
-return z.BN(z)},"$0","gDx",0,0,307],
-nq:function(a,b){var z=this.RF
-return z.nq(z,b)},
-ct:function(a,b,c,d){return F.Wi(this.RF,b,c,d)},
-k0:[function(a){return},"$0","gqw",0,0,126],
-ni:[function(a){this.RF.AP=null
-return},"$0","gl1",0,0,126],
-gUj:function(a){var z=this.RF
-return z.gUj(z)},
+BN:[function(a){var z=this.Ce
+return z.BN(z)},"$0","gDx",0,0,76],
+SZ:function(a,b){var z=this.Ce
+return z.SZ(z,b)},
+ct:function(a,b,c,d){return F.Wi(this.Ce,b,c,d)},
+k0:[function(a){return},"$0","gcm",0,0,13],
+NB:[function(a){this.Ce.AP=null
+return},"$0","gym",0,0,13],
+gqh:function(a){var z=this.Ce
+return z.gqh(z)},
 gnz:function(a){var z,y
-z=this.RF.AP
+z=this.Ce.AP
 if(z!=null){y=z.iE
 z=y==null?z!=null:y!==z}else z=!1
 return z},
-$isSI:true,
+$isvO:true,
 $isqC:true,
 $asqC:function(){return[null,null]},
 $isZ0:true,
 $asZ0:function(){return[null,null]},
 $isd3:true,
-static:{"^":"VZ"}},
-pD:{
-"^":"wVq;J6,LD,jo,Ne,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",308,309],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",308],
-gFA:[function(a){return this.jo},null,null,1,0,337,"exception",308,309],
-sFA:[function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},null,null,3,0,338,30,[],"exception",308],
-gK7:[function(){return this.Ne},null,null,1,0,337,"stacktrace",308,309],
-sK7:[function(a){this.Ne=F.Wi(this,C.R3,this.Ne,a)},null,null,3,0,338,30,[],"stacktrace",308],
+static:{"^":"RQ"}},
+ft:{
+"^":"D3;J6,LD,jo,ZG,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+gfY:function(a){return this.J6},
+sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+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
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.fy,this.J6,y)
+this.J6=F.Wi(this,C.Lc,this.J6,y)
 y=z.t(b,"message")
-this.LD=F.Wi(this,C.ch,this.LD,y)
-y=this.P3
-x=D.ac(y,z.t(b,"exception"))
+this.LD=F.Wi(this,C.pX,this.LD,y)
+y=this.Jz
+x=D.hi(y,z.t(b,"exception"))
 this.jo=F.Wi(this,C.ne,this.jo,x)
-z=D.ac(y,z.t(b,"stacktrace"))
-this.Ne=F.Wi(this,C.R3,this.Ne,z)
+z=D.hi(y,z.t(b,"stacktrace"))
+this.ZG=F.Wi(this,C.R3,this.ZG,z)
 z="DartError "+H.d(this.J6)
-z=this.ct(this,C.YS,this.bN,z)
-this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)}},
-wVq:{
+z=this.ct(this,C.YS,this.NM,z)
+this.NM=z
+this.t7=this.ct(this,C.Tc,this.t7,z)}},
+D3:{
 "^":"af+Pi;",
 $isd3:true},
-fJ:{
-"^":"dZL;J6,LD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",308,309],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",308],
+N7:{
+"^":"wVq;J6,LD,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+gfY:function(a){return this.J6},
+sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+gG1:function(a){return this.LD},
 bF:function(a,b,c){var z,y
 this.kT=!0
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.fy,this.J6,y)
+this.J6=F.Wi(this,C.Lc,this.J6,y)
 z=z.t(b,"message")
-this.LD=F.Wi(this,C.ch,this.LD,z)
+this.LD=F.Wi(this,C.pX,this.LD,z)
 z="ServiceError "+H.d(this.J6)
-z=this.ct(this,C.YS,this.bN,z)
-this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},
-$isfJ:true},
-dZL:{
+z=this.ct(this,C.YS,this.NM,z)
+this.NM=z
+this.t7=this.ct(this,C.Tc,this.t7,z)},
+$isN7:true},
+wVq:{
 "^":"af+Pi;",
 $isd3:true},
-hR:{
-"^":"w8F;J6,LD,IV,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
-gG1:[function(a){return this.LD},null,null,1,0,312,"message",308,309],
-sG1:[function(a,b){this.LD=F.Wi(this,C.ch,this.LD,b)},null,null,3,0,32,30,[],"message",308],
-gvJ:[function(a){return this.IV},null,null,1,0,115,"response",308,309],
-svJ:[function(a,b){this.IV=F.Wi(this,C.mE,this.IV,b)},null,null,3,0,116,30,[],"response",308],
+EP:{
+"^":"dZL;J6,LD,IV,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+gfY:function(a){return this.J6},
+sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+gG1:function(a){return this.LD},
+gbA:function(a){return this.IV},
+sbA:function(a,b){this.IV=F.Wi(this,C.F3,this.IV,b)},
 bF:function(a,b,c){var z,y
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.fy,this.J6,y)
+this.J6=F.Wi(this,C.Lc,this.J6,y)
 y=z.t(b,"message")
-this.LD=F.Wi(this,C.ch,this.LD,y)
+this.LD=F.Wi(this,C.pX,this.LD,y)
 z=z.t(b,"response")
-this.IV=F.Wi(this,C.mE,this.IV,z)
+this.IV=F.Wi(this,C.F3,this.IV,z)
 z="ServiceException "+H.d(this.J6)
-z=this.ct(this,C.YS,this.bN,z)
-this.bN=z
-this.GR=this.ct(this,C.KS,this.GR,z)},
-$ishR:true},
-w8F:{
+z=this.ct(this,C.YS,this.NM,z)
+this.NM=z
+this.t7=this.ct(this,C.Tc,this.t7,z)},
+$isEP:true},
+dZL:{
 "^":"af+Pi;",
 $isd3:true},
 U4:{
-"^":["V4b;dj,JJ<-85,XR<-85,DD>-85,Z3<-85,mu<-85,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null],
-gO3:[function(a){return this.dj},null,null,1,0,312,"url",308,309],
-sO3:[function(a,b){this.dj=F.Wi(this,C.Fh,this.dj,b)},null,null,3,0,32,30,[],"url",308],
+"^":"w8F;dj,Bm<,hp<,DD>,Z3<,mu<,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+gO3:function(a){return this.dj},
 gUm:function(){return!0},
-gM8:function(){return!1},
-bF:function(a,b,c){var z,y,x,w
+gfS:function(){return!1},
+bF: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)
 this.dj=x
 if(J.co(x,"file://")||J.co(this.dj,"http://")){y=this.dj
 w=J.U6(y)
-x=w.yn(y,J.WB(w.cn(y,"/"),1))}y=z.t(b,"user_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)
+v=w.cn(y,"/")
+if(typeof v!=="number")return v.g()
+x=w.yn(y,v+1)}y=z.t(b,"user_name")
+y=this.ct(this,C.YS,this.NM,y)
+this.NM=y
+if(J.FN(y)===!0)this.NM=this.ct(this,C.YS,this.NM,x)
 y=z.t(b,"name")
-this.GR=this.ct(this,C.KS,this.GR,y)
+this.t7=this.ct(this,C.Tc,this.t7,y)
 if(c)return
 this.kT=!0
-y=this.P3
-D.ES(b,y.gF1(y))
-y=this.JJ
-w=J.w1(y)
-w.V1(y)
-w.FV(y,z.t(b,"imports"))
-y=this.XR
-w=J.w1(y)
-w.V1(y)
-w.FV(y,z.t(b,"scripts"))
+y=this.Jz
+D.tg(b,y.god(y))
+y=this.Bm
+y.V1(y)
+y.FV(0,z.t(b,"imports"))
+y=this.hp
+y.V1(y)
+y.FV(0,z.t(b,"scripts"))
 y=this.DD
-w=J.w1(y)
-w.V1(y)
-w.FV(y,z.t(b,"classes"))
+y.V1(y)
+y.FV(0,z.t(b,"classes"))
 y=this.Z3
-w=J.w1(y)
-w.V1(y)
-w.FV(y,z.t(b,"variables"))
+y.V1(y)
+y.FV(0,z.t(b,"variables"))
 y=this.mu
-w=J.w1(y)
-w.V1(y)
-w.FV(y,z.t(b,"functions"))},
+y.V1(y)
+y.FV(0,z.t(b,"functions"))},
 $isU4:true},
-V4b:{
+w8F:{
 "^":"af+Pi;",
 $isd3:true},
 c2:{
-"^":["a;Rd<-326,a4>-305",function(){return[C.Nw]},function(){return[C.Nw]}],
+"^":"a;Rd<,a4>",
 $isc2:true},
-rj:{
-"^":["Zqa;Sw>-85,u9<-85,J6,wJ,lx,mB,wA,y6,FB,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,312,"kind",308,309],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,32,30,[],"kind",308],
-gVB:[function(){return this.wJ},null,null,1,0,487,"firstTokenPos",308,309],
-sVB:[function(a){var z=this.wJ
-if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Gd,z,a)
+vx:{
+"^":"V4b;Gd>,u9<,J6,U9,lx,mB,A1,y6,FB,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+gfY:function(a){return this.J6},
+sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+ghY:function(){return this.U9},
+shY:function(a){var z=this.U9
+if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.Gd,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.wJ=a},null,null,3,0,363,30,[],"firstTokenPos",308],
-gug:[function(){return this.lx},null,null,1,0,487,"lastTokenPos",308,309],
-sug:[function(a){var z=this.lx
-if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.kA,z,a)
+this.SZ(this,z)}this.U9=a},
+gSK:function(){return this.lx},
+sSK:function(a){var z=this.lx
+if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.kA,z,a)
 z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.lx=a},null,null,3,0,363,30,[],"lastTokenPos",308],
+this.SZ(this,z)}this.lx=a},
 gUm:function(){return!0},
-gM8:function(){return!0},
-rK:function(a){return J.UQ(this.Sw,J.xH(a,1))},
+gfS:function(){return!0},
+rK:function(a){var z,y
+z=J.xH(a,1)
+y=this.Gd.Jo
+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
+bF:function(a,b,c){var z,y,x,w
 z=J.U6(b)
 y=z.t(b,"kind")
-this.J6=F.Wi(this,C.fy,this.J6,y)
+this.J6=F.Wi(this,C.Lc,this.J6,y)
 y=z.t(b,"name")
-this.wA=y
+this.A1=y
 x=J.U6(y)
-y=x.yn(y,J.WB(x.cn(y,"/"),1))
-this.mB=y
-this.bN=this.ct(this,C.YS,this.bN,y)
-y=this.wA
-this.GR=this.ct(this,C.KS,this.GR,y)
+w=x.cn(y,"/")
+if(typeof w!=="number")return w.g()
+w=x.yn(y,w+1)
+this.mB=w
+this.NM=this.ct(this,C.YS,this.NM,w)
+w=this.A1
+this.t7=this.ct(this,C.Tc,this.t7,w)
 this.W8(z.t(b,"source"))
-this.up(z.t(b,"tokenPosTable"))},
-up:function(a){var z,y,x,w,v,u,t,s,r
+this.PT(z.t(b,"tokenPosTable"))},
+PT:function(a){var z,y,x,w,v,u,t,s,r
 if(a==null)return
 this.y6=P.Fl(null,null)
 this.FB=P.Fl(null,null)
-this.wJ=F.Wi(this,C.Gd,this.wJ,null)
+this.U9=F.Wi(this,C.Gd,this.U9,null)
 this.lx=F.Wi(this,C.kA,this.lx,null)
-for(z=J.GP(a);z.G();){y=z.gl()
+for(z=J.mY(a);z.G();){y=z.gl()
 x=J.U6(y)
 w=x.t(y,0)
 v=1
@@ -15371,105 +14570,93 @@
 if(!(v<u))break
 t=x.t(y,v)
 s=x.t(y,v+1)
-u=this.wJ
-if(u==null){if(this.gnz(this)&&!J.de(u,t)){u=new T.qI(this,C.Gd,u,t)
+u=this.U9
+if(u==null){if(this.gnz(this)&&!J.xC(u,t)){u=new T.qI(this,C.Gd,u,t)
 u.$builtinTypeInfo=[null]
-this.nq(this,u)}this.wJ=t
+this.SZ(this,u)}this.U9=t
 u=this.lx
-if(this.gnz(this)&&!J.de(u,t)){u=new T.qI(this,C.kA,u,t)
+if(this.gnz(this)&&!J.xC(u,t)){u=new T.qI(this,C.kA,u,t)
 u.$builtinTypeInfo=[null]
-this.nq(this,u)}this.lx=t}else{u=J.Bl(u,t)?this.wJ:t
-r=this.wJ
-if(this.gnz(this)&&!J.de(r,u)){r=new T.qI(this,C.Gd,r,u)
+this.SZ(this,u)}this.lx=t}else{u=J.Bl(u,t)?this.U9:t
+r=this.U9
+if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.Gd,r,u)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.wJ=u
+this.SZ(this,r)}this.U9=u
 u=J.J5(this.lx,t)?this.lx:t
 r=this.lx
-if(this.gnz(this)&&!J.de(r,u)){r=new T.qI(this,C.kA,r,u)
+if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.kA,r,u)
 r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.lx=u}this.y6.u(0,t,w)
+this.SZ(this,r)}this.lx=u}this.y6.u(0,t,w)
 this.FB.u(0,t,s)
 v+=2}}},
-vW:function(a){var z,y,x,w,v
+vW:function(a){var z,y,x,w
 z=J.U6(a)
 y=this.u9
-x=J.w1(y)
-w=0
-while(!0){v=z.gB(a)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-x.u(y,z.t(a,w),z.t(a,w+1))
-w+=2}},
-W8:function(a){var z,y,x,w,v
+x=0
+while(!0){w=z.gB(a)
+if(typeof w!=="number")return H.s(w)
+if(!(x<w))break
+y.u(0,z.t(a,x),z.t(a,x+1))
+x+=2}},
+W8:function(a){var z,y,x,w
 this.kT=!1
 if(a==null)return
 z=J.uH(a,"\n")
 if(z.length===0)return
 this.kT=!0
-y=this.Sw
-x=J.w1(y)
-x.V1(y)
-N.Jx("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
-for(w=0;w<z.length;w=v){v=w+1
-x.h(y,new D.c2(v,z[w]))}},
-$isrj:true},
-Zqa:{
+y=this.Gd
+y.V1(y)
+N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.A1))
+for(x=0;x<z.length;x=w){w=x+1
+y.h(0,new D.c2(w,z[x]))}},
+$isvx:true},
+V4b:{
 "^":"af+Pi;",
 $isd3:true},
-N8:{
+uA:{
 "^":"a;Yu<,Du<,fF<",
-$isN8:true},
-Z9:{
-"^":["Pi;Yu<,LR<-326,VF<-326,KO<-326,fY>-305,ar,MT,AP,fn",null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null],
-gNl:[function(a){return this.ar},null,null,1,0,513,"script",308,309],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,514,30,[],"script",308],
-gUE:[function(){return this.MT},null,null,1,0,312,"formattedLine",308,309],
-sUE:[function(a){this.MT=F.Wi(this,C.Zt,this.MT,a)},null,null,3,0,32,30,[],"formattedLine",308],
-c9s:[function(){var z,y
-z=this.LR
+$isuA:true},
+HJ:{
+"^":"Pi;Yu<,Ix,VF<,Yn,fY>,ar,MT,AP,fn",
+gtu:function(a){return this.ar},
+stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
+gP3:function(){return this.MT},
+Nw:[function(){var z,y
+z=this.Ix
 y=J.x(z)
 if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","guV",0,0,312,"formattedDeoptId",308],
-M2Y:[function(){var z,y
-z=this.VF
-y=J.x(z)
-if(y.n(z,-1))return""
-return y.bu(z)},"$0","gZO",0,0,312,"formattedTokenPos",308],
+return y.bu(z)},"$0","gkA",0,0,150],
 bR:function(a){var z,y
-this.ar=F.Wi(this,C.fX,this.ar,null)
+this.ar=F.Wi(this,C.PX,this.ar,null)
 z=this.VF
-if(J.de(z,-1))return
+if(J.xC(z,-1))return
 y=a.q6(z)
 if(y==null)return
-this.ar=F.Wi(this,C.fX,this.ar,a)
-z=J.nJ(a.rK(y))
-this.MT=F.Wi(this,C.Zt,this.MT,z)},
-$isZ9:true},
-Q4:{
-"^":["Pi;Yu<-326,Fm<-305,L4<-305,dh,uH@-540,AP,fn",function(){return[C.J19]},function(){return[C.J19]},function(){return[C.J19]},null,function(){return[C.Nw]},null,null],
-gwi:[function(){return this.dh},null,null,1,0,541,"jumpTarget",308,309],
-swi:[function(a){var z=this.dh
-if(this.gnz(this)&&!J.de(z,a)){z=new T.qI(this,C.Qn,z,a)
-z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.dh=a},null,null,3,0,542,30,[],"jumpTarget",308],
-gUB:[function(){return J.de(this.Yu,0)},null,null,1,0,307,"isComment",308],
-ghR:[function(){return J.z8(J.q8(this.uH),0)},null,null,1,0,307,"hasDescriptors",308],
+this.ar=F.Wi(this,C.PX,this.ar,a)
+z=J.dY(a.rK(y))
+this.MT=F.Wi(this,C.oI,this.MT,z)},
+$isHJ:true},
+DP:{
+"^":"Pi;Yu<,Fm,L4<,dh,uH<,AP,fn",
+gEB:function(){return this.dh},
+gUB:function(){return J.xC(this.Yu,0)},
+gGf:function(){return this.uH.Jo.length>0},
 xt:[function(){var z,y
 z=this.Yu
 y=J.x(z)
 if(y.n(z,0))return""
-return"0x"+y.WZ(z,16)},"$0","gZd",0,0,312,"formattedAddress",308],
-Io:[function(a){var z
+return"0x"+y.WZ(z,16)},"$0","gZd",0,0,150],
+io:[function(a){var z
 if(a==null)return""
-z=J.UQ(a.gOo(),this.Yu)
+z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
-if(J.de(z.gfF(),z.gDu()))return""
-return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gpY",2,0,543,154,[],"formattedInclusive",308],
+if(J.xC(z.gfF(),z.gDu()))return""
+return D.Tn(z.gfF(),a.glt())+" ("+H.d(z.gfF())+")"},"$1","gcQ",2,0,151,49],
 HU:[function(a){var z
 if(a==null)return""
-z=J.UQ(a.gOo(),this.Yu)
+z=a.gOo().Zp.t(0,this.Yu)
 if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,543,154,[],"formattedExclusive",308],
+return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,151,49],
 eQ:function(){var z,y,x,w
 y=J.uH(this.L4," ")
 x=y.length
@@ -15480,144 +14667,130 @@
 try{x=H.BU(z,16,null)
 return x}catch(w){H.Ru(w)
 return 0}},
-ZA:function(a){var z,y,x,w,v,u
+Sd:function(a){var z,y,x,w,v
 z=this.L4
 if(!J.co(z,"j"))return
 y=this.eQ()
 x=J.x(y)
-if(x.n(y,0)){P.JS("Could not determine jump address for "+H.d(z))
-return}z=J.U6(a)
-w=0
-while(!0){v=z.gB(a)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-u=z.t(a,w)
-if(J.de(u.gYu(),y)){z=this.dh
-if(this.gnz(this)&&!J.de(z,u)){z=new T.qI(this,C.Qn,z,u)
+if(x.n(y,0)){P.mp("Could not determine jump address for "+H.d(z))
+return}for(z=a.Jo,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=u
-return}++w}P.JS("Could not find instruction at "+x.WZ(y,16))},
-$isQ4:true,
-static:{Tn:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","I9",4,0,null,118,[],119,[]]}},
+this.SZ(this,z)}this.dh=v
+return}}P.mp("Could not find instruction at "+x.WZ(y,16))},
+$isDP:true,
+static:{Tn:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
 WAE:{
 "^":"a;uX",
 bu:function(a){return this.uX},
-static:{"^":"Oci,pg,WAg,yP0,Wl",CQ:[function(a){var z=J.x(a)
-if(z.n(a,"Native"))return C.nj
+static:{"^":"Oci,pg,WAg,yP0,Z7U",CQ:function(a){var z=J.x(a)
+if(z.n(a,"Native"))return C.Oc
 else if(z.n(a,"Dart"))return C.l8
 else if(z.n(a,"Collected"))return C.WA
 else if(z.n(a,"Reused"))return C.yP
-else if(z.n(a,"Tag"))return C.oA
-N.Jx("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.hS())},"$1","Ma",2,0,null,94,[]]}},
-Vi:{
+else if(z.n(a,"Tag"))return C.Z7
+N.QM("").j2("Unknown code kind "+H.d(a))
+throw H.b(P.a9())}}},
+ta:{
 "^":"a;tT>,Av<",
-$isVi:true},
-t9:{
-"^":"a;tT>,Av<,wd>,Jv",
-$ist9:true},
+$ista:true},
+D5:{
+"^":"a;tT>,Av<,ks>,Jv",
+$isD5:true},
 kx:{
-"^":["D3i;J6,xM,Du@-326,fF@-326,vg@-326,Mb@-326,VS<-85,ci<-85,va<-85,Oo<-85,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",null,null,function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},function(){return[C.Nw]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null],
-gfY:[function(a){return this.J6},null,null,1,0,544,"kind",308,309],
-sfY:[function(a,b){this.J6=F.Wi(this,C.fy,this.J6,b)},null,null,3,0,545,30,[],"kind",308],
-glt:[function(){return this.xM},null,null,1,0,487,"totalSamplesInProfile",308,309],
-slt:[function(a){this.xM=F.Wi(this,C.QK,this.xM,a)},null,null,3,0,363,30,[],"totalSamplesInProfile",308],
-gS7:[function(){return this.mM},null,null,1,0,312,"formattedInclusiveTicks",308,309],
-sS7:[function(a){this.mM=F.Wi(this,C.eF,this.mM,a)},null,null,3,0,32,30,[],"formattedInclusiveTicks",308],
-gN8:[function(){return this.qH},null,null,1,0,312,"formattedExclusiveTicks",308,309],
-sN8:[function(a){this.qH=F.Wi(this,C.uU,this.qH,a)},null,null,3,0,32,30,[],"formattedExclusiveTicks",308],
-gL1E:[function(){return this.Ni},null,null,1,0,337,"objectPool",308,309],
-sL1E:[function(a){this.Ni=F.Wi(this,C.xG,this.Ni,a)},null,null,3,0,338,30,[],"objectPool",308],
-gMj:[function(a){return this.MO},null,null,1,0,337,"function",308,309],
-sMj:[function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},null,null,3,0,338,30,[],"function",308],
-gNl:[function(a){return this.ar},null,null,1,0,513,"script",308,309],
-sNl:[function(a,b){this.ar=F.Wi(this,C.fX,this.ar,b)},null,null,3,0,514,30,[],"script",308],
-gur:[function(){return this.MH},null,null,1,0,307,"isOptimized",308,309],
-sur:[function(a){this.MH=F.Wi(this,C.FQ,this.MH,a)},null,null,3,0,310,30,[],"isOptimized",308],
+"^":"Zqa;J6,xM,Du<,fF<,Oj,Mb,VS,ci,va<,Oo<,mM,qH,Ni,MO,ar,MH,oc*,zz@,TD,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
+gfY:function(a){return this.J6},
+sfY:function(a,b){this.J6=F.Wi(this,C.Lc,this.J6,b)},
+glt:function(){return this.xM},
+gS7:function(){return this.mM},
+gan:function(){return this.qH},
+gL1:function(){return this.Ni},
+sL1:function(a){this.Ni=F.Wi(this,C.zO,this.Ni,a)},
+gig:function(a){return this.MO},
+sig:function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},
+gtu:function(a){return this.ar},
+stu:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
+gYG:function(){return this.MH},
 gUm:function(){return!0},
-gM8:function(){return!0},
+gfS:function(){return!0},
 tx:[function(a){var z,y
-this.ar=F.Wi(this,C.fX,this.ar,a)
-for(z=J.GP(this.va);z.G();)for(y=J.GP(z.gl().guH());y.G();)y.gl().bR(a)},"$1","gKn",2,0,546,547,[]],
-QW:function(){if(this.ar!=null)return
-if(!J.de(this.J6,C.l8))return
+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","guL",2,0,152,153],
+OF:function(){if(this.ar!=null)return
+if(!J.xC(this.J6,C.l8))return
 var z=this.MO
 if(z==null)return
 if(J.UQ(z,"script")==null){J.SK(this.MO).ml(new D.Em(this))
-return}J.SK(J.UQ(this.MO,"script")).ml(this.gKn())},
-VD:function(a){if(J.de(this.J6,C.l8))return D.af.prototype.VD.call(this,this)
-return P.Ab(this,null)},
-fp:function(a,b,c){var z,y,x,w,v,u
+return}J.SK(J.UQ(this.MO,"script")).ml(this.guL())},
+VD:function(a){if(J.xC(this.J6,C.l8))return D.af.prototype.VD.call(this,this)
+return P.PG(this,null)},
+bd:function(a,b,c){var z,y,x,w,v
 z=J.U6(b)
-y=J.w1(a)
-x=0
-while(!0){w=z.gB(b)
-if(typeof w!=="number")return H.s(w)
-if(!(x<w))break
-v=H.BU(z.t(b,x),null,null)
-u=H.BU(z.t(b,x+1),null,null)
-if(v>>>0!==v||v>=c.length)return H.e(c,v)
-y.h(a,new D.Vi(c[v],u))
-x+=2}y.GT(a,new D.fx())},
+y=0
+while(!0){x=z.gB(b)
+if(typeof x!=="number")return H.s(x)
+if(!(y<x))break
+w=H.BU(z.t(b,y),null,null)
+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.ta(c[w],v))
+y+=2}H.ZE(a,0,a.length-1,new D.jm())},
 eL:function(a,b,c){var z,y
-this.xM=F.Wi(this,C.QK,this.xM,c)
+this.xM=F.Wi(this,C.Kj,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.fp(this.VS,z.t(a,"callers"),b)
-this.fp(this.ci,z.t(a,"callees"),b)
+this.bd(this.VS,z.t(a,"callers"),b)
+this.bd(this.ci,z.t(a,"callees"),b)
 y=z.t(a,"ticks")
-if(y!=null)this.pd(y)
-z=D.Vb(this.fF,this.xM)+" ("+H.d(this.fF)+")"
+if(y!=null)this.qL(y)
+z=D.Rd(this.fF,this.xM)+" ("+H.d(this.fF)+")"
 this.mM=F.Wi(this,C.eF,this.mM,z)
-z=D.Vb(this.Du,this.xM)+" ("+H.d(this.Du)+")"
+z=D.Rd(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
 z=J.U6(b)
 this.oc=z.t(b,"user_name")
 this.zz=z.t(b,"name")
 y=z.t(b,"isOptimized")!=null&&z.t(b,"isOptimized")
-this.MH=F.Wi(this,C.FQ,this.MH,y)
+this.MH=F.Wi(this,C.pY,this.MH,y)
 y=D.CQ(z.t(b,"kind"))
-this.J6=F.Wi(this,C.fy,this.J6,y)
-this.vg=H.BU(z.t(b,"start"),16,null)
+this.J6=F.Wi(this,C.Lc,this.J6,y)
+this.Oj=H.BU(z.t(b,"start"),16,null)
 this.Mb=H.BU(z.t(b,"end"),16,null)
-y=this.P3
-y=y.gF1(y)
-x=y.Zr(z.t(b,"function"))
+y=this.Jz
+x=y.god(y).Qn(z.t(b,"function"))
 this.MO=F.Wi(this,C.nf,this.MO,x)
-y=y.Zr(z.t(b,"object_pool"))
-this.Ni=F.Wi(this,C.xG,this.Ni,y)
+y=y.god(y).Qn(z.t(b,"object_pool"))
+this.Ni=F.Wi(this,C.zO,this.Ni,y)
 w=z.t(b,"disassembly")
-if(w!=null)this.xs(w)
+if(w!=null)this.zl(w)
 v=z.t(b,"descriptors")
-if(v!=null)this.DZ(J.UQ(v,"members"))
-z=this.va
-y=J.U6(z)
-this.kT=!J.de(y.gB(z),0)||!J.de(this.J6,C.l8)
-z=!J.de(y.gB(z),0)&&J.de(this.J6,C.l8)
+if(v!=null)this.WY(J.UQ(v,"members"))
+z=this.va.Jo
+this.kT=z.length!==0||!J.xC(this.J6,C.l8)
+z=z.length!==0&&J.xC(this.J6,C.l8)
 this.TD=F.Wi(this,C.zS,this.TD,z)},
-gvS:[function(){return this.TD},null,null,1,0,307,"hasDisassembly",308,309],
-svS:[function(a){this.TD=F.Wi(this,C.zS,this.TD,a)},null,null,3,0,310,30,[],"hasDisassembly",308],
-xs:function(a){var z,y,x,w,v,u,t,s,r
+gUa:function(){return this.TD},
+zl:function(a){var z,y,x,w,v,u,t,s
 z=this.va
-y=J.w1(z)
-y.V1(z)
-x=J.U6(a)
-w=0
-while(!0){v=x.gB(a)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-u=x.t(a,w+1)
-t=x.t(a,w+2)
-s=!J.de(x.t(a,w),"")?H.BU(x.t(a,w),null,null):0
-v=D.Z9
-r=[]
-r.$builtinTypeInfo=[v]
-r=new Q.wn(null,null,r,null,null)
-r.$builtinTypeInfo=[v]
-y.h(z,new D.Q4(s,u,t,null,r,null,null))
-w+=3}for(y=y.gA(z);y.G();)y.gl().ZA(z)},
+z.V1(z)
+y=J.U6(a)
+x=0
+while(!0){w=y.gB(a)
+if(typeof w!=="number")return H.s(w)
+if(!(x<w))break
+v=y.t(a,x+1)
+u=y.t(a,x+2)
+t=!J.xC(y.t(a,x),"")?H.BU(y.t(a,x),null,null):0
+w=D.HJ
+s=[]
+s.$builtinTypeInfo=[w]
+s=new Q.wn(null,null,s,null,null)
+s.$builtinTypeInfo=[w]
+z.h(0,new D.DP(t,v,u,null,s,null,null))
+x+=3}for(y=z.gA(z);y.G();)y.lo.Sd(z)},
 Ry:function(a){var z,y,x,w,v,u,t
 z=J.U6(a)
 y=H.BU(z.t(a,"pc"),16,null)
@@ -15625,124 +14798,119 @@
 w=z.t(a,"tokenPos")
 v=z.t(a,"tryIndex")
 u=J.rr(z.t(a,"kind"))
-for(z=J.GP(this.va);z.G();){t=z.gl()
-if(J.de(t.gYu(),y)){J.wT(t.guH(),new D.Z9(y,x,w,v,u,null,null,null,null))
-return}}N.Jx("").j2("Could not find instruction with pc descriptor address: "+H.d(y))},
-DZ:function(a){var z
-for(z=J.GP(a);z.G();)this.Ry(z.gl())},
-pd:function(a){var z,y,x,w,v,u
+for(z=this.va,z=z.gA(z);z.G();){t=z.lo
+if(J.xC(t.gYu(),y)){t.guH().h(0,new D.HJ(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.Ry(z.gl())},
+qL:function(a){var z,y,x,w,v
 z=J.U6(a)
 y=this.Oo
-x=J.w1(y)
-w=0
-while(!0){v=z.gB(a)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-u=H.BU(z.t(a,w),16,null)
-x.u(y,u,new D.N8(u,H.BU(z.t(a,w+1),null,null),H.BU(z.t(a,w+2),null,null)))
-w+=3}},
-tg:function(a,b){J.J5(b,this.vg)
+x=0
+while(!0){w=z.gB(a)
+if(typeof w!=="number")return H.s(w)
+if(!(x<w))break
+v=H.BU(z.t(a,x),16,null)
+y.u(0,v,new D.uA(v,H.BU(z.t(a,x+1),null,null),H.BU(z.t(a,x+2),null,null)))
+x+=3}},
+tg:function(a,b){b.F(0,this.Oj)
 return!1},
-gcE:[function(){return J.de(this.J6,C.l8)},null,null,1,0,307,"isDartCode",308],
+gkU:function(){return J.xC(this.J6,C.l8)},
 $iskx:true,
-static:{Vb:[function(a,b){return C.CD.yM(100*J.FW(a,b),2)+"%"},"$2","Mr",4,0,null,118,[],119,[]]}},
-D3i:{
+static:{Rd:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
+Zqa:{
 "^":"af+Pi;",
 $isd3:true},
 Em:{
-"^":"Tp:116;a",
+"^":"Xs:30;a",
 $1:[function(a){var z,y
 z=this.a
 y=J.UQ(z.MO,"script")
 if(y==null)return
-J.SK(y).ml(z.gKn())},"$1",null,2,0,null,548,[],"call"],
+J.SK(y).ml(z.guL())},"$1",null,2,0,null,154,"call"],
 $isEH:true},
-fx:{
-"^":"Tp:300;",
-$2:[function(a,b){return J.xH(b.gAv(),a.gAv())},"$2",null,4,0,null,118,[],199,[],"call"],
+jm:{
+"^":"Xs:50;",
+$2:function(a,b){return J.xH(b.gAv(),a.gAv())},
 $isEH:true},
 UZ:{
-"^":"Tp:300;a,b",
-$2:[function(a,b){var z,y
+"^":"Xs:50;a,b",
+$2:function(a,b){var z,y
 z=J.x(b)
 y=!!z.$isqC
-if(y&&D.D5(b))this.a.u(0,a,this.b.Zr(b))
+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)},"$2",null,4,0,null,376,[],122,[],"call"],
+else if(y)D.Gf(b,this.b)},
 $isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
 "^":"",
-zMr:{
-"^":["V31;jA%-549,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gkc:[function(a){return a.jA},null,null,1,0,550,"error",308,311],
-skc:[function(a,b){a.jA=this.ct(a,C.YU,a.jA,b)},null,null,3,0,551,30,[],"error",308],
-"@":function(){return[C.uvO]},
-static:{hp:[function(a){var z,y,x,w
+zM:{
+"^":"V32;xT,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gkc:function(a){return a.xT},
+skc:function(a,b){a.xT=this.ct(a,C.yh,a.xT,b)},
+static:{cE:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.SX.ZL(a)
-C.SX.oX(a)
-return a},null,null,0,0,115,"new ServiceErrorViewElement$created"]}},
-"+ServiceErrorViewElement":[552],
-V31:{
+C.SX.XI(a)
+return a}}},
+V32:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
 "^":"",
-nk:{
-"^":["V32;Xc%-553,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gFA:[function(a){return a.Xc},null,null,1,0,554,"exception",308,311],
-sFA:[function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},null,null,3,0,555,30,[],"exception",308],
-"@":function(){return[C.vr3]},
-static:{dS:[function(a){var z,y,x,w
+Rk:{
+"^":"V33;Xc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.Vd.ZL(a)
-C.Vd.oX(a)
-return a},null,null,0,0,115,"new ServiceExceptionViewElement$created"]}},
-"+ServiceExceptionViewElement":[556],
-V32:{
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.ZJ.ZL(a)
+C.ZJ.XI(a)
+return a}}},
+V33:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
 "^":"",
-XK:{
-"^":"zM;Jf,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+Fk:{
+"^":"wv;Jf,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
 z6:function(a,b){var z
-N.Jx("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
+N.QM("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
 z=this.Jf
 if(typeof z!=="string")return z.g()
 return W.It(J.WB(z,b),null,null).OA(new U.dT())},
 SC:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
 dT:{
-"^":"Tp:116;",
+"^":"Xs:30;",
 $1:[function(a){var z
-N.Jx("").hh("HttpRequest.getString failed.")
+N.QM("").YX("HttpRequest.getString failed.")
 z=J.RE(a)
 z.gN(a)
-return C.xr.KP(P.EF(["type","ServiceException","id","","response",J.EC(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,171,[],"call"],
+return C.zc.KP(P.EF(["type","ServiceException","id","","response",J.lN(z.gN(a)),"kind","NetworkException","message","Could not connect to service. Check that you started the VM with the following flags:\n --enable-vm-service --pause-isolates-on-exit"],null,null))},"$1",null,2,0,null,19,"call"],
 $isEH:true},
-ho:{
-"^":"zM;ja,yb,Ox,GY,Rp,Ts,Va,Li,G2,A4,z7,AP,fn,P3,KG,mQ,kT,bN,GR,VR,AP,fn",
+bl:{
+"^":"wv;ba,yb,Ox,GY,RW,Ts,Va,Li,G2,Qy,z7,AP,fn,Jz,r0,mQ,kT,NM,t7,VR,AP,fn",
 q3:[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")
 w=J.UQ(z.gRn(a),"data")
-if(!J.de(x,"observatoryData"))return
-z=this.ja
+if(!J.xC(x,"observatoryData"))return
+z=this.ba
 v=z.t(0,y)
 z.Rz(0,y)
-J.Xf(v,w)},"$1","gVx",2,0,169,22,[]],
+J.KD(v,w)},"$1","gVx",2,0,15,155],
 z6:function(a,b){var z,y,x
 z=""+this.yb
 y=P.Fl(null,null)
@@ -15750,685 +14918,824 @@
 y.u(0,"method","observatoryQuery")
 y.u(0,"query","/"+H.d(b));++this.yb
 x=H.VM(new P.Zf(P.Dt(null)),[null])
-this.ja.u(0,z,x)
-J.Ih(W.Pv(window.parent),C.xr.KP(y),"*")
+this.ba.u(0,z,x)
+J.vI(W.Pv(window.parent),C.zc.KP(y),"*")
 return x.MM},
-PI:function(){var z=C.Ns.aM(window)
-H.VM(new W.Ov(0,z.uv,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
-N.Jx("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
+PI:function(){var z=H.VM(new W.RO(window,C.ph.Ph,!1),[null])
+H.VM(new W.fd(0,z.bi,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
+N.QM("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
 "^":"",
-ob:{
-"^":["V33;mC%-341,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gWA:[function(a){return a.mC},null,null,1,0,320,"object",308,311],
-sWA:[function(a,b){a.mC=this.ct(a,C.VJ,a.mC,b)},null,null,3,0,321,30,[],"object",308],
-hu:[function(a){var z
-switch(a.mC.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
-J.CJ(z,a.mC)
+Ti:{
+"^":"V34;Ll,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gWA:function(a){return a.Ll},
+sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
+Xq:function(a){var z
+switch(a.Ll.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
+J.CJ(z,a.Ll)
 return z
 case"BreakpointList":z=W.r3("breakpoint-list",null)
-J.oJ(z,a.mC)
+J.oJ(z,a.Ll)
 return z
 case"Class":z=W.r3("class-view",null)
-J.ve(z,a.mC)
+J.o0(z,a.Ll)
 return z
 case"Code":z=W.r3("code-view",null)
-J.fH(z,a.mC)
+J.fH(z,a.Ll)
 return z
 case"Error":z=W.r3("error-view",null)
-J.Qr(z,a.mC)
+J.Qr(z,a.Ll)
 return z
 case"Field":z=W.r3("field-view",null)
-J.JZ(z,a.mC)
+J.JZ(z,a.Ll)
 return z
 case"Function":z=W.r3("function-view",null)
-J.dk(z,a.mC)
+J.Pq(z,a.Ll)
 return z
 case"HeapMap":z=W.r3("heap-map",null)
-J.Nf(z,a.mC)
+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)
-J.ti(z,a.mC)
+J.Qy(z,a.Ll)
+return z
+case"IO":z=W.r3("io-view",null)
+J.vU(z,a.Ll)
+return z
+case"HttpServerList":z=W.r3("io-http-server-list-view",null)
+J.A4(z,a.Ll)
+return z
+case"HttpServer":z=W.r3("io-http-server-view",null)
+J.fb(z,a.Ll)
 return z
 case"Isolate":z=W.r3("isolate-view",null)
-J.kq(z,a.mC)
+J.uM(z,a.Ll)
 return z
 case"Library":z=W.r3("library-view",null)
-J.F6(z,a.mC)
+J.cl(z,a.Ll)
 return z
 case"Profile":z=W.r3("isolate-profile",null)
-J.CJ(z,a.mC)
+J.CJ(z,a.Ll)
 return z
 case"ServiceError":z=W.r3("service-error-view",null)
-J.Qr(z,a.mC)
+J.Qr(z,a.Ll)
 return z
 case"ServiceException":z=W.r3("service-exception-view",null)
-J.cm(z,a.mC)
+J.BC(z,a.Ll)
 return z
 case"Script":z=W.r3("script-view",null)
-J.Tt(z,a.mC)
+J.ry(z,a.Ll)
 return z
 case"StackTrace":z=W.r3("stack-trace",null)
-J.yO(z,a.mC)
+J.yO(z,a.Ll)
 return z
 case"VM":z=W.r3("vm-view",null)
-J.rK(z,a.mC)
+J.Jn(z,a.Ll)
 return z
 default:z=W.r3("json-view",null)
-J.wD(z,a.mC)
-return z}},"$0","gbs",0,0,557,"_constructElementForObject"],
-xJ:[function(a,b){var z,y,x
+J.wD(z,a.Ll)
+return z}},
+fa:[function(a,b){var z,y,x
 this.pj(a)
-z=a.mC
-if(z==null){N.Jx("").To("Viewing null object.")
+z=a.Ll
+if(z==null){N.QM("").To("Viewing null object.")
 return}y=z.gzS()
-x=this.hu(a)
-if(x==null){N.Jx("").To("Unable to find a view element for '"+H.d(y)+"'")
+x=this.Xq(a)
+if(x==null){N.QM("").To("Unable to find a view element for '"+H.d(y)+"'")
 return}a.appendChild(x)
-N.Jx("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,116,242,[],"objectChanged"],
-"@":function(){return[C.Tl]},
-static:{lv:[function(a){var z,y,x,w
+N.QM("").To("Viewing object of '"+H.d(y)+"'")},"$1","gYQ",2,0,30,34],
+static:{lv:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.ZO.ZL(a)
-C.ZO.oX(a)
-return a},null,null,0,0,115,"new ServiceObjectViewElement$created"]}},
-"+ServiceObjectViewElement":[558],
-V33:{
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.th.ZL(a)
+C.th.XI(a)
+return a}}},
+V34:{
 "^":"uL+Pi;",
 $isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
 "^":"",
 xI:{
-"^":["Vfx;tY%-341,Pe%-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gnv:[function(a){return a.tY},null,null,1,0,320,"ref",308,311],
-snv:[function(a,b){a.tY=this.ct(a,C.kY,a.tY,b)},null,null,3,0,321,30,[],"ref",308],
-gjT:[function(a){return a.Pe},null,null,1,0,307,"internal",308,311],
-sjT:[function(a,b){a.Pe=this.ct(a,C.zD,a.Pe,b)},null,null,3,0,310,30,[],"internal",308],
-P9:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
+"^":"pv;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gnv:function(a){return a.tY},
+snv:function(a,b){a.tY=this.ct(a,C.xP,a.tY,b)},
+gjT:function(a){return a.Pe},
+sjT:function(a,b){a.Pe=this.ct(a,C.uu,a.Pe,b)},
+Qj:[function(a,b){this.ct(a,C.Fh,"",this.gO3(a))
 this.ct(a,C.YS,[],this.goc(a))
-this.ct(a,C.KG,0,1)
-this.ct(a,C.bA,"",this.gD5(a))},"$1","gLe",2,0,169,242,[],"refChanged"],
-gO3:[function(a){var z=a.tY
+this.ct(a,C.pu,0,1)
+this.ct(a,C.k6,"",this.gJp(a))},"$1","gLe",2,0,15,34],
+gO3:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gHP()},null,null,1,0,312,"url"],
-gOL:[function(a){var z=a.tY
+return z.gHP()},
+gJp:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return J.F8(z)},null,null,1,0,312,"serviceId"],
-gD5:[function(a){var z=a.tY
+return z.gzz()},
+goc:function(a){var z=a.tY
 if(z==null)return"NULL REF"
-return z.gzz()},null,null,1,0,312,"hoverText"],
-goc:[function(a){var z=a.tY
-if(z==null)return"NULL REF"
-return J.O6(z)},null,null,1,0,312,"name"],
-gRw:[function(a){return J.FN(this.goc(a))},null,null,1,0,307,"nameIsEmpty"],
-"@":function(){return[C.JD]},
-static:{lK:[function(a){var z,y,x,w
+return J.tE(z)},
+gWw:function(a){return J.FN(this.goc(a))},
+static:{lK:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
+a.on=z
+a.BA=y
+a.LL=w
 C.wU.ZL(a)
-C.wU.oX(a)
-return a},null,null,0,0,115,"new ServiceRefElement$created"]}},
-"+ServiceRefElement":[559],
-Vfx:{
+C.wU.XI(a)
+return a}}},
+pv:{
 "^":"uL+Pi;",
 $isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
 "^":"",
-Uj:{
-"^":["LPc;kF%-304,IK%-305,No%-305,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gTq:[function(a){return a.kF},null,null,1,0,307,"checked",308,311],
-sTq:[function(a,b){a.kF=this.ct(a,C.wb,a.kF,b)},null,null,3,0,310,30,[],"checked",308],
-gEu:[function(a){return a.IK},null,null,1,0,312,"checkedText",308,311],
-sEu:[function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},null,null,3,0,32,30,[],"checkedText",308],
-gRY:[function(a){return a.No},null,null,1,0,312,"uncheckedText",308,311],
-sRY:[function(a,b){a.No=this.ct(a,C.WY,a.No,b)},null,null,3,0,32,30,[],"uncheckedText",308],
-RC:[function(a,b,c,d){var z=J.Hf((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
-a.kF=this.ct(a,C.wb,a.kF,z)},"$3","gBk",6,0,350,21,[],560,[],82,[],"change"],
-"@":function(){return[C.mS]},
-static:{Al:[function(a){var z,y,x,w
+CY:{
+"^":"Xfs;wG,IK,bP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gd4:function(a){return a.wG},
+sd4:function(a,b){a.wG=this.ct(a,C.bk,a.wG,b)},
+gEu:function(a){return a.IK},
+sEu:function(a,b){a.IK=this.ct(a,C.lH,a.IK,b)},
+gRY:function(a){return a.bP},
+sRY:function(a,b){a.bP=this.ct(a,C.zU,a.bP,b)},
+XF:[function(a,b,c,d){var z=J.K0((a.shadowRoot||a.webkitShadowRoot).querySelector("#slide-switch"))
+a.wG=this.ct(a,C.bk,a.wG,z)},"$3","gQU",6,0,69,1,156,71],
+static:{Al:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.fA.ZL(a)
-C.fA.oX(a)
-return a},null,null,0,0,115,"new SlidingCheckboxElement$created"]}},
-"+SlidingCheckboxElement":[561],
-LPc:{
-"^":"xc+Pi;",
-$isd3:true}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.Yo.ZL(a)
+C.Yo.XI(a)
+return a}}},
+Xfs:{
+"^":"ir+Pi;",
+$isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
 "^":"",
-xT:{
-"^":["V34;rd%-451,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gz1:[function(a){return a.rd},null,null,1,0,453,"frame",308,311],
-sz1:[function(a,b){a.rd=this.ct(a,C.rE,a.rd,b)},null,null,3,0,454,30,[],"frame",308],
-"@":function(){return[C.Xv]},
-static:{an:[function(a){var z,y,x,w
+Wq:{
+"^":"a;c1,BH,Mg,QR,ER,Ja,MR,eA",
+WO:function(a,b){return this.eA.$1(b)},
+bu:function(a){var z=P.p9("")
+z.KF("(options:")
+z.KF(this.c1?"fields ":"")
+z.KF(this.BH?"properties ":"")
+z.KF(this.Ja?"methods ":"")
+z.KF(this.Mg?"inherited ":"_")
+z.KF(this.ER?"no finals ":"")
+z.KF("annotations: "+H.d(this.MR))
+z.KF(this.eA!=null?"with matcher":"")
+z.KF(")")
+return z.vM}},
+ES:{
+"^":"a;oc>,fY>,V5>,t5>,Fo,Dv<",
+gHO:function(){return this.fY===C.nU},
+gUd:function(){return this.fY===C.BM},
+gUA:function(){return this.fY===C.it},
+giO:function(a){var z=this.oc
+return z.giO(z)},
+n:function(a,b){if(b==null)return!1
+return!!J.x(b).$isES&&this.oc.n(0,b.oc)&&this.fY===b.fY&&this.V5===b.V5&&this.t5.n(0,b.t5)&&this.Fo===b.Fo&&X.W4(this.Dv,b.Dv,!1)},
+bu:function(a){var z=P.p9("")
+z.KF("(declaration ")
+z.KF(this.oc)
+z.KF(this.fY===C.BM?" (property) ":" (method) ")
+z.KF(this.V5?"final ":"")
+z.KF(this.Fo?"static ":"")
+z.KF(this.Dv)
+z.KF(")")
+return z.vM},
+$isES:true},
+iYn:{
+"^":"a;fY>"}}],["smoke.src.common","package:smoke/src/common.dart",,X,{
+"^":"",
+Na:function(a,b,c){var z,y
+z=a.length
+if(z<b){y=Array(b)
+y.fixed$length=init
+H.qG(y,0,z,a,0)
+return y}if(z>c){z=Array(c)
+z.fixed$length=init
+H.qG(z,0,c,a,0)
+return z}return a},
+ZO:function(a,b){var z,y,x,w,v,u
+z=new H.a7(a,a.length,0,null)
+z.$builtinTypeInfo=[H.Kp(a,0)]
+for(;z.G();){y=z.lo
+b.length
+x=new H.a7(b,1,0,null)
+x.$builtinTypeInfo=[H.Kp(b,0)]
+w=J.x(y)
+for(;x.G();){v=x.lo
+if(w.n(y,v))return!0
+if(!!J.x(v).$isuq){u=w.gbx(y)
+u=$.mX().aG(u,v)}else u=!1
+if(u)return!0}}return!1},
+Lx:function(a){var z,y
+z=H.G3()
+y=H.KT(z).BD(a)
+if(y)return 0
+y=H.KT(z,[z]).BD(a)
+if(y)return 1
+y=H.KT(z,[z,z]).BD(a)
+if(y)return 2
+z=H.KT(z,[z,z,z]).BD(a)
+if(z)return 3
+return 4},
+aW:function(a){var z,y
+z=H.G3()
+y=H.KT(z,[z,z,z]).BD(a)
+if(y)return 3
+y=H.KT(z,[z,z]).BD(a)
+if(y)return 2
+y=H.KT(z,[z]).BD(a)
+if(y)return 1
+z=H.KT(z).BD(a)
+if(z)return 0
+return-1},
+W4:function(a,b,c){var z,y,x,w,v
+z=a.length
+y=b.length
+if(z!==y)return!1
+if(c){x=P.Ls(null,null,null,null)
+x.FV(0,b)
+for(w=0;w<a.length;++w)if(!x.tg(0,a[w]))return!1}else for(w=0;w<z;++w){v=a[w]
+if(w>=y)return H.e(b,w)
+if(v!==b[w])return!1}return!0}}],["smoke.src.implementation","package:smoke/src/implementation.dart",,D,{
+"^":"",
+kP:function(){throw H.b(P.FM("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,{
+"^":"",
+Oj:{
+"^":"a;tO,F8,lk,BJ,fu,af<,yQ"},
+LT:{
+"^":"a;Gu,Gl,N5",
+jD:function(a,b){var z=this.Gu.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.Gl.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
+z=null
+if(!!J.x(a).$isuq){this.N5.t(0,a)
+z=null}else{x=this.Gu.t(0,b)
+z=x==null?null:x.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
+y=null
+if(d){w=X.Lx(z)
+if(w>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,w,P.y(w,J.q8(c)))}else{v=X.aW(z)
+u=v>=0?v:J.q8(c)
+c=X.Na(c,w,u)}}try{u=H.im(z,c,P.Te(null))
+return u}catch(t){if(!!J.x(H.Ru(t)).$isMC){if(y!=null)P.mp(y)
+throw t}else throw t}}},
+bY:{
+"^":"a;Mp,Cu,u4",
+aG:function(a,b){var z,y,x
+if(a.n(0,b)||b.n(0,C.FQ))return!0
+for(z=this.Mp;!J.xC(a,C.FQ);a=y){y=z.t(0,a)
+x=J.x(y)
+if(x.n(y,b))return!0
+if(y==null){if(!this.u4)return!1
+throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+x.bu(y)+")"))}}return!1},
+UK:function(a,b){var z=this.Qk(a,b)
+return z!=null&&z.fY===C.it&&!z.Fo},
+n6:function(a,b){var z,y
+z=this.Cu.t(0,a)
+if(z==null){if(!this.u4)return!1
+throw H.b(O.lA("declarations for "+H.d(a)))}y=z.t(0,b)
+return y!=null&&y.fY===C.it&&y.Fo},
+CV:function(a,b){var z=this.Qk(a,b)
+if(z==null){if(!this.u4)return
+throw H.b(O.lA("declaration for "+H.d(a)+"."+H.d(b)))}return z},
+Me:function(a,b,c){var z,y,x,w,v,u
+z=[]
+if(c.Mg){y=this.Mp.t(0,b)
+if(y==null){if(this.u4)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!y.n(0,c.QR))z=this.Me(0,y,c)}x=this.Cu.t(0,b)
+if(x==null){if(!this.u4)return z
+throw H.b(O.lA("declarations for "+H.d(b)))}for(w=J.mY(x.gUQ(x));w.G();){v=w.gl()
+if(!c.c1&&v.gHO())continue
+if(!c.BH&&v.gUd())continue
+if(c.ER&&J.ql(v)===!0)continue
+if(!c.Ja&&v.gUA())continue
+if(c.eA!=null&&c.WO(0,J.tE(v))!==!0)continue
+u=c.MR
+if(u!=null&&!X.ZO(v.gDv(),u))continue
+z.push(v)}return z},
+Qk:function(a,b){var z,y,x,w,v
+for(z=this.Mp,y=this.Cu;!J.xC(a,C.FQ);a=v){x=y.t(0,a)
+if(x!=null){w=x.t(0,b)
+if(w!=null)return w}v=z.t(0,a)
+if(v==null){if(!this.u4)return
+throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
+ut:{
+"^":"a;eB,d8",
+Ut:function(a){this.eB.aN(0,new O.Fi(this))},
+static:{ty:function(a){var z=new O.ut(a.af,P.Fl(null,null))
+z.Ut(a)
+return z}}},
+Fi:{
+"^":"Xs:50;a",
+$2:function(a,b){this.a.d8.u(0,b,a)},
+$isEH:true},
+tk:{
+"^":"a;uh",
+bu:function(a){return"Missing "+this.uh+". Code generation for the smoke package seems incomplete."},
+static:{lA:function(a){return new O.tk(a)}}}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
+"^":"",
+nm:{
+"^":"V35;xP,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gM6:function(a){return a.xP},
+sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
+static:{an:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.dX.ZL(a)
-C.dX.oX(a)
-return a},null,null,0,0,115,"new StackFrameElement$created"]}},
-"+StackFrameElement":[562],
-V34:{
+C.dX.XI(a)
+return a}}},
+V35:{
 "^":"uL+Pi;",
 $isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
 "^":"",
-uwf:{
-"^":["V35;B3%-336,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gtN:[function(a){return a.B3},null,null,1,0,337,"trace",308,311],
-stN:[function(a,b){a.B3=this.ct(a,C.kw,a.B3,b)},null,null,3,0,338,30,[],"trace",308],
-pA:[function(a,b){J.am(a.B3).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.js]},
-static:{bV:[function(a){var z,y,x,w
+uw:{
+"^":"V36;ju,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+gtN:function(a){return a.ju},
+stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
+RF:[function(a,b){J.LE(a.ju).wM(b)},"$1","gvC",2,0,15,65],
+static:{bV:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
-C.bg.ZL(a)
-C.bg.oX(a)
-return a},null,null,0,0,115,"new StackTraceElement$created"]}},
-"+StackTraceElement":[563],
-V35:{
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
+C.wB.ZL(a)
+C.wB.XI(a)
+return a}}},
+V36:{
 "^":"uL+Pi;",
 $isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
 "^":"",
-IP:[function(a){var z=J.x(a)
-if(!!z.$isQl)return C.i3.f0(a)
-switch(z.gt5(a)){case"checkbox":return $.FF().aM(a)
-case"radio":case"select-multiple":case"select-one":return z.gi9(a)
-default:return z.gLm(a)}},"$1","tF",2,0,null,142,[]],
-iX:[function(a,b){var z,y,x,w,v,u,t,s
+AD:function(a,b,c,d){var z,y
+if(c){z=null!=d&&!1!==d
+y=J.RE(a)
+if(z)y.gQg(a).MW.setAttribute(b,"")
+else y.gQg(a).Rz(0,b)}else{z=J.Vs(a)
+y=d==null?"":H.d(d)
+z.MW.setAttribute(b,y)}},
+iX:function(a,b){var z,y,x,w,v,u
 z=M.pN(a,b)
-y=J.x(a)
-if(!!y.$iscv)if(a.localName!=="template")x=y.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(a))===!0
-else x=!0
-else x=!1
-w=x?a:null
-for(v=y.gp8(a),u=null,t=0;v!=null;v=v.nextSibling,++t){s=M.iX(v,b)
-if(s==null)continue
-if(u==null)u=P.Py(null,null,null,null,null)
-u.u(0,t,s)}if(z==null&&u==null&&w==null)return
-return new M.K6(z,u,w,t)},"$2","Nc",4,0,null,273,[],291,[]],
-HP:[function(a,b,c,d,e){var z,y,x
-if(b==null)return
-if(b.gN2()!=null){z=b.gN2()
-M.Ky(a).wh(z)
-if(d!=null)M.Ky(a).sxT(d)}z=J.RE(b)
-if(z.gCd(b)!=null)M.Iu(z.gCd(b),a,c,e)
-if(z.gwd(b)==null)return
-y=b.gTe()-a.childNodes.length
-for(x=a.firstChild;x!=null;x=x.nextSibling,++y){if(y<0)continue
-M.HP(x,J.UQ(z.gwd(b),y),c,d,e)}},"$5","K4",10,0,null,273,[],162,[],292,[],291,[],293,[]],
-bM:[function(a){var z
-for(;z=J.RE(a),z.gKV(a)!=null;)a=z.gKV(a)
-if(!!z.$isYN||!!z.$isI0||!!z.$ishy)return a
-return},"$1","ay",2,0,null,273,[]],
-pN:[function(a,b){var z,y
+if(z==null)z=new M.XI([],null,null)
+for(y=J.RE(a),x=y.gPZ(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.iX(x,b)
+if(u==null)continue
+if(w==null){w=Array(y.gUN(a).NL.childNodes.length)
+w.fixed$length=init}if(v>=w.length)return H.e(w,v)
+w[v]=u}z.ks=w
+return z},
+X7:function(a,b,c,d,e,f,g,h){var z,y,x,w
+z=b.appendChild(J.Lh(c,a,!1))
+for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.X7(y,z,c,x?d.QE(w):null,e,f,g,null)
+if(d.ghK()){M.Ky(z).bt(a)
+if(f!=null)M.Ky(z).szH(f)}M.mV(z,d,e,g)
+return z},
+bM:function(a){var z,y,x,w
+for(;!0;){z=J.Tm(a)
+if(z!=null)a=z
+else{y=$.rf()
+y.toString
+x=H.of(a,"expando$values")
+w=x==null?null:H.of(x,y.Qz())
+if(w==null)break
+a=w}}y=J.x(a)
+if(!!y.$isQF||!!y.$isI0||!!y.$ishy)return a
+return},
+aU:function(a){var z
+for(;z=J.RE(a),z.gBy(a)!=null;)a=z.gBy(a)
+return $.rf().t(0,a)!=null?a:null},
+H4:function(a,b,c){if(c==null)return
+return new M.aR(a,b,c)},
+pN:function(a,b){var z,y
 z=J.x(a)
-if(!!z.$iscv)return M.F5(a,b)
-if(!!z.$iskJ){y=M.F4(a.textContent,"text",a,b)
-if(y!=null)return["text",y]}return},"$2","vw",4,0,null,273,[],291,[]],
-F5:[function(a,b){var z,y,x
+if(!!z.$ish4)return M.F5(a,b)
+if(!!z.$isUn){y=S.iw(a.textContent,M.H4("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.iw(z,M.H4(b,a,c))},
+F5:function(a,b){var z,y,x,w,v,u
 z={}
 z.a=null
-z.b=!1
-z.c=!1
-new W.i7(a).aN(0,new M.NW(z,a,b,M.wR(a)))
-if(z.b&&!z.c){y=z.a
-if(y==null){x=[]
-z.a=x
-y=x}y.push("bind")
-y.push(M.F4("{{}}","bind",a,b))}return z.a},"$2","OT",4,0,null,142,[],291,[]],
-Iu:[function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i
-for(z=J.U6(a),y=d!=null,x=!!J.x(b).$isTU,w=0;w<z.gB(a);w+=2){v=z.t(a,w)
-u=z.t(a,w+1)
-t=u.gEJ()
-if(1>=t.length)return H.e(t,1)
-s=t[1]
-if(u.gqz()){t=u.gEJ()
-if(2>=t.length)return H.e(t,2)
-r=t[2]
-if(r!=null){q=r.$2(c,b)
-if(q!=null){p=q
-s="value"}else p=c}else p=c
-if(!u.gaW()){p=L.Sk(p,s,u.gPf())
-s="value"}}else{t=[]
-o=new Y.J3(t,[],null,u.gPf(),!1,!1,null,null)
-for(n=1;n<u.gEJ().length;n+=3){m=u.gEJ()
-if(n>=m.length)return H.e(m,n)
-l=m[n]
-m=u.gEJ()
-k=n+1
-if(k>=m.length)return H.e(m,k)
-r=m[k]
-q=r!=null?r.$2(c,b):null
-if(q!=null){j=q
-l="value"}else j=c
-if(o.YX)H.vh(P.w("Cannot add more paths once started."))
-t.push(L.Sk(j,l,null))}o.wE(0)
-p=o
-s="value"}i=J.Jj(x?b:M.Ky(b),v,p,s)
-if(y)d.push(i)}},"$4","NJ",6,2,null,85,298,[],273,[],292,[],293,[]],
-F4:[function(a,b,c,d){var z,y,x,w,v,u,t,s
-z=a.length
-if(z===0)return
-for(y=d==null,x=J.U6(a),w=null,v=0;v<z;){u=x.XU(a,"{{",v)
-t=u<0?-1:C.xB.XU(a,"}}",u+2)
-if(t<0){if(w==null)return
-w.push(C.xB.yn(a,v))
-break}if(w==null)w=[]
-w.push(C.xB.Nj(a,v,u))
-s=C.xB.bS(C.xB.Nj(a,u+2,t))
-w.push(s)
-w.push(y?null:A.lJ(s,b,c,T.e9.prototype.gca.call(d)))
-v=t+2}if(v===z)w.push("")
-z=new M.HS(w,null)
-z.Yn(w)
-return z},"$4","jF",8,0,null,94,[],12,[],273,[],291,[]],
-SH:[function(a,b){var z,y
-z=a.firstChild
-if(z==null)return
-y=new M.yp(z,a.lastChild,b)
-for(;z!=null;){M.Ky(z).sCk(y)
-z=z.nextSibling}},"$2","St",4,0,null,220,[],292,[]],
-Ky:[function(a){var z,y,x,w
-z=$.rw()
+y=M.wR(a)
+new W.E9(a).aN(0,new M.NW(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.qd=z
+x=M.rJ(a,"bind",b)
+v.DK=x
+u=M.rJ(a,"repeat",b)
+v.wA=u
+if(z!=null&&x==null&&u==null)v.DK=S.iw("{{}}",M.H4("bind",a,b))
+return v}z=z.a
+return z==null?null:new M.XI(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 b.gaW()?y:b.qm(y)}x=J.U6(b)
+w=x.gB(b)
+if(typeof w!=="number")return H.s(w)
+v=Array(w)
+v.fixed$length=init
+w=v.length
+u=0
+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)
+if(u>=w)return H.e(v,u)
+v[u]=t;++u}return b.qm(v)},
+LH:function(a,b,c,d){var z,y,x,w,v,u,t,s
+if(b.geq())return M.KH(a,b,c,d)
+if(b.gqz()){z=b.HH(0)
+if(z!=null)y=z.$3(d,c,!1)
+else{x=b.Pn(0)
+x=!!J.x(x).$isTv?x:L.hk(x)
+w=$.ps
+$.ps=w+1
+y=new L.WR(x,d,null,w,null,null,null)}return b.gaW()?y:new Y.cc(y,b.gcK(),null,null,null)}x=$.ps
+$.ps=x+1
+y=new L.NV(null,[],x,null,null,null)
+y.Hy=[]
+x=J.U6(b)
+v=0
+while(!0){w=x.gB(b)
+if(typeof w!=="number")return H.s(w)
+if(!(v<w))break
+c$0:{u=b.AX(v)
+z=b.HH(v)
+if(z!=null){t=z.$3(d,c,u)
+if(u===!0)y.ti(t)
+else{if(y.xX!=null||y.Bg==null)H.vh(P.w("Cannot add observers once started."))
+J.mu(t,y.gQ8())
+w=y.Bg
+w.push(C.dV)
+w.push(t)}break c$0}s=b.Pn(v)
+if(u===!0)y.ti(s.Tl(d))
+else y.yN(d,s)}++v}return new Y.cc(y,b.gcK(),null,null,null)},
+mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p,o,n
+z=J.RE(b)
+y=z.gCd(b)
+for(x=J.U6(y),w=!!J.x(a).$isvy,v=d!=null,u=0;u<x.gB(y);u+=2){t=x.t(y,u)
+s=x.t(y,u+1)
+r=M.LH(t,s,a,c)
+q=w?a:M.Ky(a)
+p=J.FS(q,t,r,s.geq())
+if(p!=null&&v)d.push(p)}if(!z.$isqf)return
+o=M.Ky(a)
+o.sQ2(c)
+n=o.oq(b)
+if(n!=null&&v)d.push(n)},
+Ky:function(a){var z,y,x,w
+z=$.cm()
 z.toString
-y=H.VK(a,"expando$values")
-x=y==null?null:H.VK(y,z.Qz())
+y=H.of(a,"expando$values")
+x=y==null?null:H.of(y,z.Qz())
 if(x!=null)return x
 w=J.x(a)
 if(!!w.$isMi)x=new M.ee(a,null,null)
-else if(!!w.$islp)x=new M.ug(a,null,null)
+else if(!!w.$isbs)x=new M.ug(a,null,null)
 else if(!!w.$isAE)x=new M.wl(a,null,null)
-else if(!!w.$iscv){if(a.localName!=="template")w=w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0
+else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
 else w=!0
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$iskJ?new M.XT(a,null,null):new M.TU(a,null,null)
+else w=!0
+x=w?new M.DT(null,null,null,!1,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$isUn?new M.XT(a,null,null):new M.vy(a,null,null)
 z.u(0,a,x)
-return x},"$1","La",2,0,null,273,[]],
-wR:[function(a){var z=J.x(a)
-if(!!z.$iscv)if(a.localName!=="template")z=z.gQg(a).MW.hasAttribute("template")===!0&&C.uE.x4(z.gqn(a))===!0
+return x},
+wR: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.uE.x4(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},"$1","xS",2,0,null,211,[]],
+return z},
 V2:{
-"^":"TU;N1,mD,Ck",
-Z1:function(a,b,c,d){var z,y,x,w,v
-J.MV(this.glN(),b)
-if(!!J.x(this.gN1()).$isQl&&J.de(b,"value")){z=H.Go(this.gN1(),"$isQl")
+"^":"vy;rF,u2,Vw",
+nR:function(a,b,c,d){var z,y,x,w,v,u
+z={}
+z.a=b
+J.SB(this.gPP(),z.a)
+y=this.grF()
+x=J.x(y)
+w=!!x.$isUC&&J.xC(z.a,"value")
+v=z.a
+if(w){new W.E9(y).Rz(0,v)
+if(d)return this.nD(c)
+x=this.ge2()
+x.$1(J.mu(c,x))}else{u=J.Is(v,"?")
+if(u){x.gQg(y).Rz(0,z.a)
+x=z.a
+w=J.U6(x)
+z.a=w.Nj(x,0,J.xH(w.gB(x),1))}if(d)return M.AD(this.grF(),z.a,u,c)
+x=new M.BL(z,this,u)
+x.$1(J.mu(c,x))}this.gCd(this).u(0,z.a,c)
+return c},
+nD:[function(a){var z,y,x,w,v,u,t
+z=this.grF()
+y=J.RE(z)
+x=y.gBy(z)
+w=J.x(x)
+if(!!w.$isbs){v=J.UQ(J.QE(M.Ky(x)),"value")
+if(!!J.x(v).$isb2){u=x.value
+t=v}else{u=null
+t=null}}else{u=null
+t=null}y.sP(z,a==null?"":H.d(a))
+if(t!=null&&!J.xC(w.gP(x),u)){y=w.gP(x)
+J.Fc(t.gvt(),y)}},"$1","ge2",2,0,15,35]},
+BL:{
+"^":"Xs:30;a,b,c",
+$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,157,"call"],
+$isEH:true},
+b2:{
+"^":"Ap;rF<,E3,vt<,jS",
+HF:[function(a){return M.pw(this.rF,a,this.jS)},"$1","gfM",2,0,15,35],
+Uh:[function(a){var z,y,x,w,v
+switch(this.jS){case"value":z=J.Vm(this.rF)
+J.Fc(this.vt,z)
+break
+case"checked":z=this.rF
+y=J.RE(z)
+x=y.gd4(z)
+J.Fc(this.vt,x)
+if(!!y.$isMi&&J.xC(y.gt5(z),"radio"))for(z=J.mY(M.pt(z));z.G();){w=z.gl()
+v=J.UQ(J.QE(!!J.x(w).$isvy?w:M.Ky(w)),"checked")
+if(v!=null)J.Fc(v,!1)}break
+case"selectedIndex":z=J.fa(this.rF)
+J.Fc(this.vt,z)
+break}O.N0()},"$1","gCL",2,0,15,1],
+TR:function(a,b){return J.mu(this.vt,b)},
+gP:function(a){return J.Vm(this.vt)},
+sP:function(a,b){J.Fc(this.vt,b)
+return b},
+S6:function(a){var z=this.E3
+if(z!=null){z.ed()
+this.E3=null}z=this.vt
+if(z!=null){J.x0(z)
+this.vt=null}},
+$isb2:true,
+static:{"^":"S8",pw:function(a,b,c){switch(c){case"checked":J.Ae(a,null!=b&&!1!==b)
+return
+case"selectedIndex":J.dk(a,M.bC(b))
+return
+case"value":J.Fc(a,b==null?"":H.d(b))
+return}},IP:function(a){var z=J.x(a)
+if(!!z.$isUC)return H.VM(new W.Cq(a,C.i3.Ph,!1),[null])
+switch(z.gt5(a)){case"checkbox":return $.FF().LX(a)
+case"radio":case"select-multiple":case"select-one":return z.gi9(a)
+default:return z.gLm(a)}},pt:function(a){var z,y,x
+z=J.RE(a)
+if(z.gMB(a)!=null){z=z.gMB(a)
 z.toString
-new W.i7(z).Rz(0,b)
-z=this.gN1()
-y=d!=null?d:""
-x=new M.zP(null,z,c,null,null,"value",y)
-x.Og(z,"value",c,d)
-x.Ca=M.IP(z).yI(x.gqf())}else{z=this.gN1()
-y=J.rY(b)
-w=y.Tc(b,"?")
-if(w){J.Vs(z).Rz(0,b)
-v=y.Nj(b,0,J.xH(y.gB(b),1))}else v=b
-y=d!=null?d:""
-x=new M.D8(w,z,c,null,null,v,y)
-x.Og(z,v,c,d)}this.gCd(this).u(0,b,x)
-return x}},
-D8:{
-"^":"TR;Y0,qP,ZY,xS,PB,eS,ay",
-gH:function(){return X.TR.prototype.gH.call(this)},
-EC:function(a){var z,y
-if(this.Y0){z=null!=a&&!1!==a
-y=this.eS
-if(z)J.Vs(X.TR.prototype.gH.call(this)).MW.setAttribute(y,"")
-else J.Vs(X.TR.prototype.gH.call(this)).Rz(0,y)}else{z=J.Vs(X.TR.prototype.gH.call(this))
-y=a==null?"":H.d(a)
-z.MW.setAttribute(this.eS,y)}}},
-zP:{
-"^":"NP;Ca,qP,ZY,xS,PB,eS,ay",
-gH:function(){return M.NP.prototype.gH.call(this)},
-EC:function(a){var z,y,x,w,v
-z=J.u3(M.NP.prototype.gH.call(this))
-y=J.x(z)
-if(!!y.$islp){x=J.UQ(J.QE(M.Ky(z)),"value")
-if(!!J.x(x).$isSA){w=z.value
-v=x}else{w=null
-v=null}}else{w=null
-v=null}M.NP.prototype.EC.call(this,a)
-if(v!=null&&v.gqP()!=null&&!J.de(y.gP(z),w))v.FC(null)}},
-b2i:{
-"^":"TR;",
-cO:function(a){if(this.qP==null)return
-this.Ca.ed()
-X.TR.prototype.cO.call(this,this)}},
-DO:{
-"^":"Tp:115;",
-$0:[function(){var z,y,x,w,v
+z=new W.wi(z)
+return z.ev(z,new M.WP(a))}else{y=M.bM(a)
+if(y==null)return C.xD
+x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
+return x.ev(x,new M.iA(a))}},bC:function(a){if(typeof a==="string")return H.BU(a,null,new M.fR())
+return typeof a==="number"&&Math.floor(a)===a?a:0}}},
+YJG:{
+"^":"Xs:47;",
+$0:function(){var z,y,x,w,v
 z=document.createElement("div",null).appendChild(W.ED(null))
 y=J.RE(z)
 y.st5(z,"checkbox")
 x=[]
 w=y.gVl(z)
-H.VM(new W.Ov(0,w.uv,w.Ph,W.aF(new M.fTP(x)),w.Sg),[H.Kp(w,0)]).Zz()
+H.VM(new W.fd(0,w.bi,w.Ph,W.aF(new M.pp(x)),w.Sg),[H.Kp(w,0)]).Zz()
 y=y.gi9(z)
-H.VM(new W.Ov(0,y.uv,y.Ph,W.aF(new M.ppY(x)),y.Sg),[H.Kp(y,0)]).Zz()
+H.VM(new W.fd(0,y.bi,y.Ph,W.aF(new M.ik(x)),y.Sg),[H.Kp(y,0)]).Zz()
 y=window
 v=document.createEvent("MouseEvent")
-J.e2(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
+J.Dh(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
 z.dispatchEvent(v)
-return x.length===1?C.mt:C.Nm.gtH(x)},"$0",null,0,0,null,"call"],
+return x.length===1?C.mt:C.Nm.gtH(x)},
 $isEH:true},
-fTP:{
-"^":"Tp:116;a",
-$1:[function(a){this.a.push(C.pi)},"$1",null,2,0,null,21,[],"call"],
+pp:{
+"^":"Xs:30;a",
+$1:[function(a){this.a.push(C.nI)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
-ppY:{
-"^":"Tp:116;b",
-$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,21,[],"call"],
+ik:{
+"^":"Xs:30;b",
+$1:[function(a){this.b.push(C.mt)},"$1",null,2,0,null,1,"call"],
 $isEH:true},
-NP:{
-"^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
-gH:function(){return X.TR.prototype.gH.call(this)},
-EC:function(a){var z=this.gH()
-J.ta(z,a==null?"":H.d(a))},
-FC:[function(a){var z=J.Vm(this.gH())
-J.ta(this.xS,z)
-O.Y3()},"$1","gqf",2,0,169,21,[]]},
-jt:{
-"^":"b2i;Ca,qP,ZY,xS,PB,eS,ay",
-gH:function(){return X.TR.prototype.gH.call(this)},
-EC:function(a){var z=X.TR.prototype.gH.call(this)
-J.rP(z,null!=a&&!1!==a)},
-FC:[function(a){var z,y,x
-z=J.Hf(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)
-if(!!J.x(X.TR.prototype.gH.call(this)).$isMi&&J.de(J.zH(X.TR.prototype.gH.call(this)),"radio"))for(z=J.GP(M.kv(X.TR.prototype.gH.call(this)));z.G();){y=z.gl()
-x=J.UQ(J.QE(!!J.x(y).$isTU?y:M.Ky(y)),"checked")
-if(x!=null)J.ta(x,!1)}O.Y3()},"$1","gqf",2,0,169,21,[]],
-static:{kv:[function(a){var z,y,x
-z=J.RE(a)
-if(z.gMB(a)!=null){z=z.gMB(a)
-z.toString
-z=new W.e7(z)
-return z.ev(z,new M.r0(a))}else{y=M.bM(a)
-if(y==null)return C.xD
-x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ev(x,new M.jz(a))}},"$1","VE",2,0,null,142,[]]}},
-r0:{
-"^":"Tp:116;a",
-$1:[function(a){var z,y
+WP:{
+"^":"Xs:30;a",
+$1:function(a){var z,y
 z=this.a
 y=J.x(a)
 if(!y.n(a,z))if(!!y.$isMi)if(a.type==="radio"){y=a.name
-z=J.O6(z)
+z=J.tE(z)
 z=y==null?z==null:y===z}else z=!1
 else z=!1
 else z=!1
-return z},"$1",null,2,0,null,295,[],"call"],
+return z},
 $isEH:true},
-jz:{
-"^":"Tp:116;b",
-$1:[function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},"$1",null,2,0,null,295,[],"call"],
+iA:{
+"^":"Xs:30;b",
+$1:function(a){var z=J.x(a)
+return!z.n(a,this.b)&&z.gMB(a)==null},
 $isEH:true},
-SA:{
-"^":"b2i;Dh,Ca,qP,ZY,xS,PB,eS,ay",
-gH:function(){return X.TR.prototype.gH.call(this)},
-EC:function(a){var z
-this.C7()
-if(this.Gh(a)===!0)return
-z=new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.K2(new M.hB(this)),2))
-C.S2.yN(z,X.TR.prototype.gH.call(this),!0,!0)
-this.Dh=z},
-Gh:function(a){var z,y,x
-z=this.eS
-y=J.x(z)
-if(y.n(z,"selectedIndex")){x=M.qb(a)
-J.Mu(X.TR.prototype.gH.call(this),x)
-z=J.m4(X.TR.prototype.gH.call(this))
-return z==null?x==null:z===x}else if(y.n(z,"value")){z=X.TR.prototype.gH.call(this)
-J.ta(z,a==null?"":H.d(a))
-return J.de(J.Vm(X.TR.prototype.gH.call(this)),a)}},
-C7:function(){var z=this.Dh
-if(z!=null){z.disconnect()
-this.Dh=null}},
-FC:[function(a){var z,y
-this.C7()
-z=this.eS
-y=J.x(z)
-if(y.n(z,"selectedIndex")){z=J.m4(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}else if(y.n(z,"value")){z=J.Vm(X.TR.prototype.gH.call(this))
-J.ta(this.xS,z)}},"$1","gqf",2,0,169,21,[]],
-$isSA:true,
-static:{qb:[function(a){if(typeof a==="string")return H.BU(a,null,new M.nv())
-return typeof a==="number"&&Math.floor(a)===a?a:0},"$1","v7",2,0,null,30,[]]}},
-hB:{
-"^":"Tp:300;a",
-$2:[function(a,b){var z=this.a
-if(z.Gh(J.Vm(z.xS))===!0)z.C7()},"$2",null,4,0,null,28,[],564,[],"call"],
-$isEH:true},
-nv:{
-"^":"Tp:116;",
-$1:[function(a){return 0},"$1",null,2,0,null,117,[],"call"],
+fR:{
+"^":"Xs:30;",
+$1:function(a){return 0},
 $isEH:true},
 ee:{
-"^":"V2;N1,mD,Ck",
-gN1:function(){return this.N1},
-Z1:function(a,b,c,d){var z,y,x
+"^":"V2;rF,u2,Vw",
+grF:function(){return this.rF},
+nR:function(a,b,c,d){var z,y,x,w
 z=J.x(b)
-if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-y=this.gN1()
-J.MV(!!J.x(y).$isTU?y:this,b)
-J.Vs(this.N1).Rz(0,b)
-y=this.gCd(this)
-if(z.n(b,"value")){z=this.N1
-x=d!=null?d:""
-x=new M.NP(null,z,c,null,null,"value",x)
-x.Og(z,"value",c,d)
-x.Ca=M.IP(z).yI(x.gqf())
-z=x}else{z=this.N1
-x=d!=null?d:""
-x=new M.jt(null,z,c,null,null,"checked",x)
-x.Og(z,"checked",c,d)
-x.Ca=M.IP(z).yI(x.gqf())
-z=x}y.u(0,b,z)
-return z}},
-K6:{
-"^":"a;Cd>,wd>,N2<,Te<"},
-TU:{
-"^":"a;N1<,mD,Ck?",
-Z1:function(a,b,c,d){var z
-window
-z="Unhandled binding to Node: "+H.a5(this)+" "+H.d(b)+" "+H.d(c)+" "+H.d(d)
-if(typeof console!="undefined")console.error(z)},
-Ih:function(a,b){var z
-if(this.mD==null)return
-z=this.gCd(this).Rz(0,b)
-if(z!=null)J.wC(z)},
-GB:function(a){var z,y
-if(this.mD==null)return
-for(z=this.gCd(this),z=z.gUQ(z),z=P.F(z,!0,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-if(y!=null)J.wC(y)}this.mD=null},
-gCd:function(a){var z=this.mD
-if(z==null){z=P.L5(null,null,null,J.O,X.TR)
-this.mD=z}return z},
-glN:function(){var z=this.gN1()
-return!!J.x(z).$isTU?z:this},
-$isTU:true},
-yp:{
-"^":"a;rg,Ug,k8<"},
-ug:{
-"^":"V2;N1,mD,Ck",
-gN1:function(){return this.N1},
-Z1:function(a,b,c,d){var z,y,x
-if(J.de(b,"selectedindex"))b="selectedIndex"
-z=J.x(b)
-if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-z=this.gN1()
-J.MV(!!J.x(z).$isTU?z:this,b)
-J.Vs(this.N1).Rz(0,b)
+if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.nR.call(this,this,b,c,d)
+J.Vs(this.rF).Rz(0,b)
+if(d){M.pw(this.rF,c,b)
+return}J.SB(!!J.x(this.grF()).$isvy?this.grF():this,b)
 z=this.gCd(this)
-y=this.N1
-x=d!=null?d:""
-x=new M.SA(null,null,y,c,null,null,b,x)
-x.Og(y,b,c,d)
-x.Ca=M.IP(y).yI(x.gqf())
+y=this.rF
+x=new M.b2(y,null,c,b)
+x.E3=M.IP(y).yI(x.gCL())
+w=x.gfM()
+M.pw(y,J.mu(x.vt,w),b)
+z.u(0,b,x)
+return x}},
+XI:{
+"^":"a;Cd>,ks>,jb>",
+ghK:function(){return!1},
+QE: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:{
+"^":"XI;qd,DK,wA,Cd,ks,jb",
+ghK:function(){return!0},
+$isqf:true},
+vy:{
+"^":"a;rF<,u2,Vw?",
+nR:function(a,b,c,d){var z
+window
+z="Unhandled binding to Node: "+H.a5(this)+" "+H.d(b)+" "+H.d(c)+" "+d
+if(typeof console!="undefined")console.error(z)
+return},
+Yj:function(a,b){var z
+if(this.u2==null)return
+z=this.gCd(this).Rz(0,b)
+if(z!=null)J.x0(z)},
+GB:function(a){var z,y
+if(this.u2==null)return
+for(z=this.gCd(this),z=z.gUQ(z),z=P.F(z,!0,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
+if(y!=null)J.x0(y)}this.u2=null},
+gCd:function(a){var z=this.u2
+if(z==null){z=P.L5(null,null,null,P.qU,A.Ap)
+this.u2=z}return z},
+gPP:function(){return!!J.x(this.grF()).$isvy?this.grF():this},
+$isvy:true},
+yp:{
+"^":"a;ku,EA,Po"},
+ug:{
+"^":"V2;rF,u2,Vw",
+grF:function(){return this.rF},
+nR:function(a,b,c,d){var z,y,x,w
+if(J.xC(b,"selectedindex"))b="selectedIndex"
+z=J.x(b)
+if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
+J.Vs(this.rF).Rz(0,b)
+if(d){M.pw(this.rF,c,b)
+return}J.SB(!!J.x(this.grF()).$isvy?this.grF():this,b)
+z=this.gCd(this)
+y=this.rF
+x=new M.b2(y,null,c,b)
+x.E3=M.IP(y).yI(x.gCL())
+w=x.gfM()
+M.pw(y,J.mu(x.vt,w),b)
 z.u(0,b,x)
 return x}},
 DT:{
-"^":"V2;lr,xT?,kr<,Mf,QO?,jH?,mj?,IT,dv@,N1,mD,Ck",
-gN1:function(){return this.N1},
-glN:function(){return!!J.x(this.N1).$isDT?this.N1:this},
-Z1:function(a,b,c,d){var z
-d=d!=null?d:""
-z=this.kr
-if(z==null){z=new M.TG(this,[],null,!1,!1,!1,!1,!1,null,null,null,null,null,null,null,null,!1,null,null)
-this.kr=z}switch(b){case"bind":z.js=!0
-z.d6=c
-z.XV=d
-this.jq()
-z=new M.p8(this,c,b,d)
-this.gCd(this).u(0,b,z)
-return z
-case"repeat":z.A7=!0
-z.JM=c
-z.yO=d
-this.jq()
-z=new M.p8(this,c,b,d)
-this.gCd(this).u(0,b,z)
-return z
-case"if":z.Q3=!0
-z.rV=c
-z.eD=d
-this.jq()
-z=new M.p8(this,c,b,d)
-this.gCd(this).u(0,b,z)
-return z
-default:return M.V2.prototype.Z1.call(this,this,b,c,d)}},
-Ih:function(a,b){var z
-switch(b){case"bind":z=this.kr
-if(z==null)return
-z.js=!1
-z.d6=null
-z.XV=null
-this.jq()
-this.gCd(this).Rz(0,b)
-return
-case"repeat":z=this.kr
-if(z==null)return
-z.A7=!1
-z.JM=null
-z.yO=null
-this.jq()
-this.gCd(this).Rz(0,b)
-return
-case"if":z=this.kr
-if(z==null)return
-z.Q3=!1
-z.rV=null
-z.eD=null
-this.jq()
-this.gCd(this).Rz(0,b)
-return
-default:M.TU.prototype.Ih.call(this,this,b)
-return}},
-jq:function(){var z=this.kr
-if(!z.t9){z.t9=!0
-P.rb(z.gjM())}},
-a5:function(a,b,c){var z,y,x,w,v,u,t
+"^":"V2;Q2?,nF,os<,xU,q4?,Bx?,M5?,AD,VZ,rF,u2,Vw",
+grF:function(){return this.rF},
+gPP:function(){return!!J.x(this.rF).$isDT?this.rF:this},
+oq:function(a){var z,y
+z=this.os
+if(z!=null)z.x5()
+if(a.qd==null&&a.DK==null&&a.wA==null){z=this.os
+if(z!=null){z.S6(0)
+this.os=null
+this.gCd(this).Rz(0,"iterator")}return}if(this.os==null){z=this.gCd(this)
+y=new M.TG(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
+this.os=y
+z.u(0,"iterator",y)}this.os.dE(a,this.Q2)
+return this.os},
+a5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
 z=this.gnv(this)
-z=!!J.x(z).$isTU?z:M.Ky(z)
-y=J.G6(z)
-x=z.gdv()
-if(x==null){x=M.iX(y,b)
-z.sdv(x)}w=this.IT
-if(w==null){v=J.VN(this.N1)
-w=$.JM()
-u=w.t(0,v)
-if(u==null){u=v.implementation.createHTMLDocument("")
-w.u(0,v,u)}this.IT=u
-w=u}t=M.Fz(y,w)
-M.HP(t,x,a,b,c)
-M.SH(t,a)
-return t},
+y=J.NQ(!!J.x(z).$isvy?z:M.Ky(z))
+x=this.VZ
+if(x!=null){z=x.jb
+z=z==null?y!=null:z!==y}else z=!0
+if(z){x=M.iX(y,b)
+x.jb=y
+this.VZ=x}z=this.AD
+if(z==null){w=J.Do(this.rF)
+z=$.Lu()
+v=z.t(0,w)
+if(v==null){v=w.implementation.createHTMLDocument("")
+z.u(0,w,v)}this.AD=v
+z=v}u=J.O2(z)
+$.rf().u(0,u,this.rF)
+t=new M.yp(a,null,null)
+for(s=J.LY(y),z=x!=null,r=0;s!=null;s=s.nextSibling,++r){q=z?x.QE(r):null
+M.Ky(M.X7(s,u,this.AD,q,a,b,c,null)).sVw(t)}t.EA=u.firstChild
+t.Po=u.lastChild
+return u},
 ZK:function(a,b){return this.a5(a,b,null)},
-gk8:function(){return this.lr},
-gzH:function(){return this.xT},
-gnv:function(a){var z,y,x,w
-this.Sy()
-z=J.Vs(this.N1).MW.getAttribute("ref")
-if(z!=null){y=M.bM(this.N1)
-x=y!=null?J.K3(y,z):null}else x=null
-if(x==null){x=this.QO
-if(x==null)return this.N1}w=J.IS(!!J.x(x).$isTU?x:M.Ky(x))
-return w!=null?w:x},
-grz:function(a){var z
-this.Sy()
-z=this.jH
-return z!=null?z:H.Go(this.N1,"$isyY").content},
-wh:function(a){var z,y,x,w,v,u
-if(this.mj===!0)return!1
+gzH:function(){return this.nF},
+szH:function(a){var z
+this.nF=a
+this.VZ=null
+z=this.os
+if(z!=null){z.Wv=!1
+z.eY=null
+z.TC=null}},
+gnv:function(a){var z,y,x,w,v
+this.GC()
+z=J.Vs(this.rF).MW.getAttribute("ref")
+if(z!=null){y=M.bM(this.rF)
+x=y!=null?J.Vr(y,z):null
+if(x==null){w=M.aU(this.rF)
+if(w!=null)x=J.c1(w,"#"+z)}}else x=null
+if(x==null){x=this.q4
+if(x==null)return this.rF}v=J.Gc(!!J.x(x).$isvy?x:M.Ky(x))
+return v!=null?v:x},
+gjb:function(a){var z
+this.GC()
+z=this.Bx
+return z!=null?z:H.Go(this.rF,"$isOH").content},
+bt:function(a){var z,y,x,w,v,u,t
+if(this.M5===!0)return!1
 M.oR()
-this.mj=!0
-z=!!J.x(this.N1).$isyY
+this.M5=!0
+z=!!J.x(this.rF).$isOH
 y=!z
-if(y){x=this.N1
+if(y){x=this.rF
 w=J.RE(x)
-x=w.gQg(x).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(x))===!0}else x=!1
-if(x){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
-v=M.eX(this.N1)
-v=!!J.x(v).$isTU?v:M.Ky(v)
-v.smj(!0)
-z=!!J.x(v.gN1()).$isyY
-u=!0}else{v=this
-u=!1}if(!z)v.sjH(J.bs(M.TA(v.gN1())))
-if(a!=null)v.sQO(a)
-else if(y)M.KE(v,this.N1,u)
-else M.GM(J.G6(v))
+if(w.gQg(x).MW.hasAttribute("template")===!0&&C.uE.x4(w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
+v=M.eX(this.rF)
+v=!!J.x(v).$isvy?v:M.Ky(v)
+v.sM5(!0)
+z=!!J.x(v.grF()).$isOH
+u=!0}else{x=this.rF
+w=J.RE(x)
+if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.rF
+w=J.RE(x)
+t=w.gM0(x).createElement("template",null)
+w.gBy(x).insertBefore(t,x)
+t.toString
+new W.E9(t).FV(0,w.gQg(x))
+w.gQg(x).V1(0)
+w.zB(x)
+v=!!J.x(t).$isvy?t:M.Ky(t)
+v.sM5(!0)
+z=!!J.x(v.grF()).$isOH}else{v=this
+z=!1}u=!1}}else{v=this
+u=!1}if(!z)v.sBx(J.O2(M.Vo(v.grF())))
+if(a!=null)v.sq4(a)
+else if(y)M.KE(v,this.rF,u)
+else M.GM(J.NQ(v))
 return!0},
-Sy:function(){return this.wh(null)},
+GC:function(){return this.bt(null)},
 $isDT:true,
-static:{"^":"mn,EW,Sf,To",Fz:[function(a,b){var z,y,x
-z=J.Lh(b,a,!1)
-y=J.x(z)
-if(!!y.$iscv)if(z.localName!=="template")y=y.gQg(z).MW.hasAttribute("template")===!0&&C.uE.x4(y.gqn(z))===!0
-else y=!0
-else y=!1
-if(y)return z
-for(x=J.Q8(a);x!=null;x=x.nextSibling)z.appendChild(M.Fz(x,b))
-return z},"$2","Tkw",4,0,null,273,[],294,[]],TA:[function(a){var z,y,x,w
-z=J.VN(a)
+static:{"^":"mn,EW,Sf,To",Vo:function(a){var z,y,x,w
+z=J.Do(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},"$1","lA",2,0,null,270,[]],eX:[function(a){var z,y,x,w,v,u
+if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},eX:function(a){var z,y,x,w,v,u
 z=J.RE(a)
 y=z.gM0(a).createElement("template",null)
-z.gKV(a).insertBefore(y,a)
+z.gBy(a).insertBefore(y,a)
 for(x=C.Nm.br(z.gQg(a).gvc()),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=x.lo
 switch(w){case"template":v=z.gQg(a).MW
 v.getAttribute(w)
@@ -16439,992 +15746,1229 @@
 u=v.getAttribute(w)
 v.removeAttribute(w)
 y.setAttribute(w,u)
-break}}return y},"$1","Bw",2,0,null,295,[]],KE:[function(a,b,c){var z,y,x,w
-z=J.G6(a)
-if(c){J.Kv(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gp8(b),w!=null;)x.jx(z,w)},"$3","BZ",6,0,null,270,[],295,[],296,[]],GM:[function(a){var z,y
-z=new M.OB()
+break}}return y},KE:function(a,b,c){var z,y,x,w
+z=J.NQ(a)
+if(c){J.y2(z,b)
+return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.mx(z,w)},GM:function(a){var z,y
+z=new M.CE()
 y=J.MK(a,$.cz())
 if(M.wR(a))z.$1(a)
-y.aN(y,z)},"$1","DR",2,0,null,297,[]],oR:[function(){if($.To===!0)return
+y.aN(y,z)},oR:function(){if($.To===!0)return
 $.To=!0
 var z=document.createElement("style",null)
-J.c9(z,H.d($.cz())+" { display: none; }")
-document.head.appendChild(z)},"$0","Lv",0,0,null]}},
-OB:{
-"^":"Tp:169;",
-$1:[function(a){if(!M.Ky(a).wh(null))M.GM(J.G6(!!J.x(a).$isTU?a:M.Ky(a)))},"$1",null,2,0,null,270,[],"call"],
+J.t3(z,H.d($.cz())+" { display: none; }")
+document.head.appendChild(z)}}},
+CE:{
+"^":"Xs:15;",
+$1:function(a){if(!M.Ky(a).bt(null))M.GM(J.NQ(!!J.x(a).$isvy?a:M.Ky(a)))},
 $isEH:true},
-lP:{
-"^":"Tp:116;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,376,[],"call"],
+W6o:{
+"^":"Xs:30;",
+$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,134,"call"],
 $isEH:true},
-p8:{
-"^":"a;ud,lr,eS,ay",
-gH:function(){var z=this.ud
-z.toString
-return z.N1},
-gk8:function(){return this.lr},
-gP:function(a){return J.Vm(this.gND())},
-sP:function(a,b){J.ta(this.gND(),b)},
-gND:function(){var z=J.x(this.lr)
-if((!!z.$isWR||!!z.$isJ3)&&J.de(this.ay,"value"))return this.lr
-return L.Sk(this.lr,this.ay,null)},
-cO:function(a){var z=this.ud
-if(z==null)return
-z.Ih(0,this.eS)
-this.lr=null
-this.ud=null},
-$isTR:true},
+aR:{
+"^":"Xs:30;a,b,c",
+$1:function(a){return this.c.pm(a,this.a,this.b)},
+$isEH:true},
 NW:{
-"^":"Tp:300;a,b,c,d",
-$2:[function(a,b){var z,y,x,w
-for(;z=J.U6(a),J.de(z.t(a,0),"_");)a=z.yn(a,1)
-if(this.d)if(z.n(a,"if")){this.a.b=!0
-if(b==="")b="{{}}"}else if(z.n(a,"bind")||z.n(a,"repeat")){this.a.c=!0
-if(b==="")b="{{}}"}y=M.F4(b,a,this.b,this.c)
+"^":"Xs:50;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.iw(b,M.H4(a,this.b,this.c))
 if(y!=null){z=this.a
 x=z.a
 if(x==null){w=[]
 z.a=w
 z=w}else z=x
 z.push(a)
-z.push(y)}},"$2",null,4,0,null,12,[],30,[],"call"],
+z.push(y)}},
 $isEH:true},
-HS:{
-"^":"a;EJ<,PU",
-gqz:function(){return this.EJ.length===4},
-gaW:function(){var z,y
-z=this.EJ
-y=z.length
-if(y===4){if(0>=y)return H.e(z,0)
-if(J.de(z[0],"")){if(3>=z.length)return H.e(z,3)
-z=J.de(z[3],"")}else z=!1}else z=!1
-return z},
-gPf:function(){return this.PU},
-JI:[function(a){var z,y
-if(a==null)a=""
-z=this.EJ
-if(0>=z.length)return H.e(z,0)
-y=H.d(z[0])+H.d(a)
-if(3>=z.length)return H.e(z,3)
-return y+H.d(z[3])},"$1","gBg",2,0,565,30,[]],
-DJ:[function(a){var z,y,x,w,v,u,t
-z=this.EJ
-if(0>=z.length)return H.e(z,0)
-y=P.p9(z[0])
-for(x=J.U6(a),w=1;w<z.length;w+=3){v=x.t(a,C.jn.cU(w-1,3))
-if(v!=null)y.vM+=typeof v==="string"?v:H.d(v)
-u=w+2
-if(u>=z.length)return H.e(z,u)
-t=z[u]
-y.vM+=typeof t==="string"?t:H.d(t)}return y.vM},"$1","gqD",2,0,566,567,[]],
-Yn:function(a){this.PU=this.EJ.length===4?this.gBg():this.gqD()}},
 TG:{
-"^":"a;e9,YC,xG,pq,t9,A7,js,Q3,JM,d6,rV,yO,XV,eD,FS,IY,U9,DO,Fy",
-Mv:function(a){return this.DO.$1(a)},
-XS:[function(){var z,y,x,w,v,u
-this.t9=!1
-z=this.FS
-if(z!=null){z.ed()
-this.FS=null}z=this.A7
-if(!z&&!this.js){this.Az(null)
-return}y=z?this.JM:this.d6
-x=z?this.yO:this.XV
-if(!this.Q3)w=L.Sk(y,x,z?null:new M.VU())
-else{v=[]
-w=new Y.J3(v,[],null,new M.Kj(z),!1,!1,null,null)
-v.push(L.Sk(y,x,null))
-z=this.rV
-u=this.eD
-v.push(L.Sk(z,u,null))
-w.wE(0)}this.FS=w.gUj(w).yI(new M.R7(this))
-this.Az(w.gP(w))},"$0","gjM",0,0,115],
-Az:function(a){var z,y,x,w
-z=this.xG
-this.Gb()
-y=J.x(a)
-if(!!y.$isList){this.xG=a
-x=a}else if(!!y.$isQV){x=y.br(a)
-this.xG=x}else{this.xG=null
-x=null}if(x!=null&&!!y.$iswn)this.IY=a.gvp().yI(this.gZX())
-y=z!=null?z:[]
-x=this.xG
-x=x!=null?x:[]
-w=G.jj(x,0,J.q8(x),y,0,J.q8(y))
-if(w.length!==0)this.El(w)},
-wx:function(a){var z,y,x,w
+"^":"Ap;YS,SU,vy,lS,Jh,WI,bn,D2,ts,qe,ur,VC,Wv,eY,TC",
+RV:function(a){return this.eY.$1(a)},
+TR:function(a,b){return H.vh(P.w("binding already opened"))},
+gP:function(a){return this.bn},
+x5:function(){var z,y
+z=this.WI
+y=J.x(z)
+if(!!y.$isAp){y.S6(z)
+this.WI=null}z=this.bn
+y=J.x(z)
+if(!!y.$isAp){y.S6(z)
+this.bn=null}},
+dE:function(a,b){var z,y,x
+this.x5()
+z=this.YS.rF
+y=a.qd
+x=y!=null
+this.D2=x
+this.ts=a.wA!=null
+if(x){this.qe=y.eq
+y=M.LH("if",y,z,b)
+this.WI=y
+if(this.qe===!0){if(!(null!=y&&!1!==y)){this.vr(null)
+return}}else H.Go(y,"$isAp").TR(0,this.goo())}if(this.ts===!0){y=a.wA
+this.ur=y.eq
+y=M.LH("repeat",y,z,b)
+this.bn=y}else{y=a.DK
+this.ur=y.eq
+y=M.LH("bind",y,z,b)
+this.bn=y}if(this.ur!==!0)J.mu(y,this.goo())
+this.vr(null)},
+vr:[function(a){var z,y
+if(this.D2===!0){z=this.WI
+if(this.qe!==!0){H.Go(z,"$isAp")
+z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Io([])
+return}}y=this.bn
+if(this.ur!==!0){H.Go(y,"$isAp")
+y=y.gP(y)}this.Io(this.ts!==!0?[y]:y)},"$1","goo",2,0,15,81],
+Io:function(a){var z,y
 z=J.x(a)
-if(z.n(a,-1))return this.e9.N1
-y=this.YC
+if(!z.$isWO)a=!!z.$iscX?z.br(a):[]
+z=this.vy
+if(a===z)return
+this.Ke()
+this.lS=a
+if(!!J.x(a).$iswn&&this.ts===!0&&this.ur!==!0){if(a.gID()!=null)a.sID([])
+this.VC=a.gRT().yI(this.gk8())}y=this.lS
+y=y!=null?y:[]
+this.cJ(G.jj(y,0,J.q8(y),z,0,z.length))},
+F1:function(a){var z,y,x,w
+z=J.x(a)
+if(z.n(a,-1))return this.YS.rF
+y=this.SU
 z=z.U(a,2)
 if(z>>>0!==z||z>=y.length)return H.e(y,z)
 x=y[z]
-if(M.wR(x)){z=this.e9.N1
+if(M.wR(x)){z=this.YS.rF
 z=x==null?z==null:x===z}else z=!0
 if(z)return x
-w=M.Ky(x).gkr()
+w=M.Ky(x).gos()
 if(w==null)return x
-return w.wx(C.jn.cU(w.YC.length,2)-1)},
-lP:function(a,b,c,d){var z,y,x,w,v,u
+return w.F1(C.jn.cU(w.SU.length,2)-1)},
+uy:function(a,b,c,d){var z,y,x,w,v,u
 z=J.Wx(a)
-y=this.wx(z.W(a,1))
+y=this.F1(z.W(a,1))
 x=b!=null
 if(x)w=b.lastChild
-else w=c!=null&&J.pO(c)?J.MQ(c):null
+else w=c!=null&&J.z4(c)?J.MQ(c):null
 if(w==null)w=y
 z=z.U(a,2)
-H.IC(this.YC,z,[w,d])
-v=J.TZ(this.e9.N1)
+H.IC(this.SU,z,[w,d])
+v=J.Tm(this.YS.rF)
 u=J.tx(y)
 if(x)v.insertBefore(b,u)
-else if(c!=null)for(z=J.GP(c);z.G();)v.insertBefore(z.gl(),u)},
-MC:function(a){var z,y,x,w,v,u,t,s
+else if(c!=null)for(z=J.mY(c);z.G();)v.insertBefore(z.gl(),u)},
+ne:function(a){var z,y,x,w,v,u,t,s
 z=[]
 z.$builtinTypeInfo=[W.KV]
 y=J.Wx(a)
-x=this.wx(y.W(a,1))
-w=this.wx(a)
-v=this.YC
+x=this.F1(y.W(a,1))
+w=this.F1(a)
+v=this.SU
 u=J.WB(y.U(a,2),1)
 if(u>>>0!==u||u>=v.length)return H.e(v,u)
 t=v[u]
 C.Nm.UZ(v,y.U(a,2),J.WB(y.U(a,2),2))
-J.TZ(this.e9.N1)
-for(y=J.RE(x);!J.de(w,x);){s=y.guD(x)
+J.Tm(this.YS.rF)
+for(y=J.RE(x);!J.xC(w,x);){s=y.guD(x)
 if(s==null?w==null:s===w)w=x
 v=s.parentNode
 if(v!=null)v.removeChild(s)
-z.push(s)}return new M.Ya(z,t)},
-El:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k
-if(this.pq)return
-z=this.e9
-y=z.N1
-x=(!!J.x(z.N1).$isDT?z.N1:z).gzH()
-w=J.RE(y)
-if(w.gKV(y)==null||W.Pv(w.gM0(y).defaultView)==null){this.cO(0)
-return}if(!this.U9){this.U9=!0
-if(x!=null){this.DO=x.CE(y)
-this.Fy=null}}v=P.Py(P.N3(),null,null,P.a,M.Ya)
-for(w=J.w1(a),u=w.gA(a),t=0;u.G();){s=u.gl()
-for(r=s.gRt(),r=r.gA(r),q=J.RE(s);r.G();)v.u(0,r.lo,this.MC(J.WB(q.gvH(s),t)))
-r=s.gNg()
-if(typeof r!=="number")return H.s(r)
-t-=r}for(w=w.gA(a);w.G();){s=w.gl()
-for(u=J.RE(s),p=u.gvH(s);r=J.Wx(p),r.C(p,J.WB(u.gvH(s),s.gNg()));p=r.g(p,1)){o=J.UQ(this.xG,p)
-n=v.Rz(0,o)
-if(n!=null&&J.pO(J.Y5(n))){q=J.RE(n)
-m=q.gkU(n)
-l=q.gyT(n)
-k=null}else{m=[]
-if(this.DO!=null)o=this.Mv(o)
-k=o!=null?z.a5(o,x,m):null
-l=null}this.lP(p,k,l,m)}}for(z=v.gUQ(v),z=H.VM(new H.MH(null,J.GP(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();)this.uS(J.AB(z.lo))},"$1","gZX",2,0,568,264,[]],
-uS:function(a){var z
-for(z=J.GP(a);z.G();)J.wC(z.gl())},
-Gb:function(){var z=this.IY
+z.push(s)}return new M.wS(z,t)},
+cJ:[function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f
+if(this.Jh||J.FN(a)===!0)return
+t=this.YS
+s=t.rF
+if(J.Tm(s)==null){this.S6(0)
+return}r=this.vy
+Q.Y5(r,this.lS,a)
+z=t.nF
+if(!this.Wv){this.Wv=!0
+q=(!!J.x(t.rF).$isDT?t.rF:t).gzH()
+if(q!=null){this.eY=q.A5(s)
+this.TC=null}}p=P.YM(P.N3(),null,null,P.a,M.wS)
+for(o=J.w1(a),n=o.gA(a),m=0;n.G();){l=n.gl()
+for(k=l.gRt(),k=k.gA(k),j=J.RE(l);k.G();)p.u(0,k.lo,this.ne(J.WB(j.gvH(l),m)))
+k=l.gNg()
+if(typeof k!=="number")return H.s(k)
+m-=k}for(o=o.gA(a);o.G();){l=o.gl()
+for(n=J.RE(l),i=n.gvH(l);J.u6(i,J.WB(n.gvH(l),l.gNg()));++i){if(i>>>0!==i||i>=r.length)return H.e(r,i)
+y=r[i]
+x=null
+h=p.Rz(0,y)
+w=null
+if(h!=null&&J.z4(J.Bq(h))){w=h.gWf()
+g=J.Bq(h)}else{try{w=[]
+if(this.eY!=null)y=this.RV(y)
+if(y!=null)x=t.a5(y,z,w)}catch(f){k=H.Ru(f)
+v=k
+u=new H.oP(f,null)
+k=new P.vs(0,$.X3,null,null,null,null,null,null)
+k.$builtinTypeInfo=[null]
+new P.Zf(k).$builtinTypeInfo=[null]
+j=v
+if(j==null)H.vh(P.u("Error must not be null"))
+if(k.Gv!==0)H.vh(P.w("Future already completed"))
+k.CG(j,u)}g=null}this.uy(i,x,g,w)}}for(t=p.gUQ(p),t=H.VM(new H.MH(null,J.mY(t.l6),t.T6),[H.Kp(t,0),H.Kp(t,1)]);t.G();)this.Ep(t.lo.gWf())},"$1","gk8",2,0,158,159],
+Ep:function(a){var z
+for(z=J.mY(a);z.G();)J.x0(z.gl())},
+Ke:function(){var z=this.VC
 if(z==null)return
 z.ed()
-this.IY=null},
-cO:function(a){var z,y
-if(this.pq)return
-this.Gb()
-for(z=this.YC,y=1;y<z.length;y+=2)this.uS(z[y])
+this.VC=null},
+S6:function(a){var z,y
+if(this.Jh)return
+this.Ke()
+for(z=this.SU,y=1;y<z.length;y+=2)this.Ep(z[y])
 C.Nm.sB(z,0)
-z=this.FS
-if(z!=null){z.ed()
-this.FS=null}this.e9.kr=null
-this.pq=!0}},
-VU:{
-"^":"Tp:116;",
-$1:[function(a){return[a]},"$1",null,2,0,null,28,[],"call"],
-$isEH:true},
-Kj:{
-"^":"Tp:569;a",
-$1:[function(a){var z,y,x
-z=J.U6(a)
-y=z.t(a,0)
-x=z.t(a,1)
-if(!(null!=x&&!1!==x))return
-return this.a?y:[y]},"$1",null,2,0,null,567,[],"call"],
-$isEH:true},
-R7:{
-"^":"Tp:116;b",
-$1:[function(a){return this.b.Az(J.iZ(J.MQ(a)))},"$1",null,2,0,null,353,[],"call"],
-$isEH:true},
-Ya:{
-"^":"a;yT>,kU>",
-$isYa:true},
+this.x5()
+this.YS.os=null
+this.Jh=!0}},
+wS:{
+"^":"a;UN>,Wf<",
+$iswS:true},
 XT:{
-"^":"TU;N1,mD,Ck",
-Z1:function(a,b,c,d){var z,y,x
-if(!J.de(b,"text"))return M.TU.prototype.Z1.call(this,this,b,c,d)
-this.Ih(0,b)
-z=this.gCd(this)
-y=this.N1
-x=d!=null?d:""
-x=new M.ic(y,c,null,null,"text",x)
-x.Og(y,"text",c,d)
-z.u(0,b,x)
-return x}},
-ic:{
-"^":"TR;qP,ZY,xS,PB,eS,ay",
-EC:function(a){var z=this.qP
-J.c9(z,a==null?"":H.d(a))}},
+"^":"vy;rF,u2,Vw",
+nR:function(a,b,c,d){var z
+if(!J.xC(b,"text"))return M.vy.prototype.nR.call(this,this,b,c,d)
+if(d){z=c==null?"":H.d(c)
+J.t3(this.rF,z)
+return}this.Yj(0,b)
+z=this.gMm()
+z.$1(J.mu(c,z))
+this.gCd(this).u(0,b,c)
+return c},
+ux:[function(a){var z=a==null?"":H.d(a)
+J.t3(this.rF,z)},"$1","gMm",2,0,30,16]},
 wl:{
-"^":"V2;N1,mD,Ck",
-gN1:function(){return this.N1},
-Z1:function(a,b,c,d){var z,y,x
-if(!J.de(b,"value"))return M.V2.prototype.Z1.call(this,this,b,c,d)
-z=this.gN1()
-J.MV(!!J.x(z).$isTU?z:this,b)
-J.Vs(this.N1).Rz(0,b)
+"^":"V2;rF,u2,Vw",
+grF:function(){return this.rF},
+nR:function(a,b,c,d){var z,y,x,w
+if(!J.xC(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
+if(d){M.pw(this.rF,c,b)
+return}J.SB(!!J.x(this.grF()).$isvy?this.grF():this,b)
+J.Vs(this.rF).Rz(0,b)
 z=this.gCd(this)
-y=this.N1
-x=d!=null?d:""
-x=new M.NP(null,y,c,null,null,"value",x)
-x.Og(y,"value",c,d)
-x.Ca=M.IP(y).yI(x.gqf())
+y=this.rF
+x=new M.b2(y,null,c,b)
+x.E3=M.IP(y).yI(x.gCL())
+w=x.gfM()
+M.pw(y,J.mu(x.vt,w),b)
 z.u(0,b,x)
 return x}}}],["template_binding.src.binding_delegate","package:template_binding/src/binding_delegate.dart",,O,{
 "^":"",
-T4p:{
-"^":"a;"}}],["template_binding.src.node_binding","package:template_binding/src/node_binding.dart",,X,{
+VE:{
+"^":"a;"}}],["template_binding.src.mustache_tokens","package:template_binding/src/mustache_tokens.dart",,S,{
 "^":"",
-TR:{
-"^":"a;qP<",
-gH:function(){return this.qP},
-gk8:function(){return this.ZY},
-gP:function(a){return J.Vm(this.xS)},
-sP:function(a,b){J.ta(this.xS,b)},
-cO:function(a){var z
-if(this.qP==null)return
-z=this.PB
-if(z!=null)z.ed()
-this.PB=null
-this.xS=null
-this.qP=null
-this.ZY=null},
-Og:function(a,b,c,d){var z,y
-z=J.x(this.ZY)
-z=(!!z.$isWR||!!z.$isJ3)&&J.de(d,"value")
-y=this.ZY
-if(z){this.xS=y
-z=y}else{z=L.Sk(y,this.ay,null)
-this.xS=z}this.PB=J.xq(z).yI(new X.VD(this))
-this.EC(J.Vm(this.xS))},
-$isTR:true},
-VD:{
-"^":"Tp:116;a",
-$1:[function(a){var z=this.a
-return z.EC(J.Vm(z.xS))},"$1",null,2,0,null,353,[],"call"],
-$isEH:true}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
+ab:{
+"^":"a;jU,eq<,V6",
+gqz:function(){return this.jU.length===5},
+gaW:function(){var z,y
+z=this.jU
+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},
+gcK:function(){return this.V6},
+qm:function(a){return this.gcK().$1(a)},
+gB:function(a){return C.jn.cU(this.jU.length,4)},
+AX:function(a){var z,y
+z=this.jU
+y=a*4+1
+if(y>=z.length)return H.e(z,y)
+return z[y]},
+Pn:function(a){var z,y
+z=this.jU
+y=a*4+2
+if(y>=z.length)return H.e(z,y)
+return z[y]},
+HH:function(a){var z,y
+z=this.jU
+y=a*4+3
+if(y>=z.length)return H.e(z,y)
+return z[y]},
+pu:[function(a){var z,y,x,w
+if(a==null)a=""
+z=this.jU
+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
+if(w>=x)return H.e(z,w)
+return y+H.d(z[w])},"$1","gzf",2,0,160,16],
+cH:[function(a){var z,y,x,w,v,u,t,s
+z=this.jU
+if(0>=z.length)return H.e(z,0)
+y=P.p9(z[0])
+x=C.jn.cU(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
+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","gB5",2,0,161,162],
+l3:function(a,b){this.V6=this.jU.length===5?this.gzf():this.gB5()},
+static:{"^":"OO,jO,t3a,epG,oM,Ftg",iw: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
+for(y=b==null,x=J.U6(a),w=null,v=0,u=!0;v<z;){t=x.XU(a,"{{",v)
+s=C.xB.XU(a,"[[",v)
+if(s>=0)r=t<0||s<t
+else r=!1
+if(r){t=s
+q=!0
+p="]]"}else{q=!1
+p="}}"}o=t>=0?C.xB.XU(a,p,t+2):-1
+if(o<0){if(w==null)return
+w.push(C.xB.yn(a,v))
+break}if(w==null)w=[]
+w.push(C.xB.Nj(a,v,t))
+n=C.xB.bS(C.xB.Nj(a,t+2,o))
+w.push(q)
+u=u&&q
+m=y?null:b.$1(n)
+if(m==null)w.push(L.hk(n))
+else w.push(null)
+w.push(m)
+v=o+2}if(v===z)w.push("")
+y=new S.ab(w,u,null)
+y.l3(w,u)
+return y}}}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
 "^":"",
 I5:{
-"^":["xI;tY-341,Pe-304,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-"@":function(){return[C.Ye]},
-static:{cF:[function(a){var z,y,x,w
+"^":"xI;tY,Pe,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+static:{cF:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
 a.Pe=!1
-a.SO=z
-a.B7=y
-a.X0=w
-C.V8.ZL(a)
-C.V8.oX(a)
-return a},null,null,0,0,115,"new VMRefElement$created"]}},
-"+VMRefElement":[342]}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
+a.on=z
+a.BA=y
+a.LL=w
+C.u2.ZL(a)
+C.u2.XI(a)
+return a}}}}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
 "^":"",
-en:{
-"^":["V36;ID%-317,lc%-570,AP,fn,AP,fn,dZ,Sa,Uk,oq,Wz,SO,B7,X0-306",null,null,null,null,null,null,null,null,null,null,null,null,null,function(){return[C.Nw]}],
-gzf:[function(a){return a.ID},null,null,1,0,522,"vm",308,311],
-szf:[function(a,b){a.ID=this.ct(a,C.RJ,a.ID,b)},null,null,3,0,571,30,[],"vm",308],
-gkc:[function(a){return a.lc},null,null,1,0,536,"error",308,311],
-skc:[function(a,b){a.lc=this.ct(a,C.YU,a.lc,b)},null,null,3,0,537,30,[],"error",308],
-pA:[function(a,b){J.am(a.ID).YM(b)},"$1","gvC",2,0,169,339,[],"refresh"],
-"@":function(){return[C.Hk]},
-static:{oH:[function(a){var z,y,x,w
+el:{
+"^":"V37;uB,lc,AP,fn,AP,fn,a6,nh,q9,YE,JB,on,BA,LL",
+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)},
+RF:[function(a,b){J.LE(a.uB).wM(b)},"$1","gvC",2,0,15,65],
+static:{oH:function(a){var z,y,x,w
 z=$.Nd()
-y=P.Py(null,null,null,J.O,W.I0)
-x=J.O
-w=W.cv
-w=H.VM(new V.qC(P.Py(null,null,null,x,w),null,null),[x,w])
-a.SO=z
-a.B7=y
-a.X0=w
+y=P.YM(null,null,null,P.qU,W.I0)
+x=P.qU
+w=W.h4
+w=H.VM(new V.qC(P.YM(null,null,null,x,w),null,null),[x,w])
+a.on=z
+a.BA=y
+a.LL=w
 C.nt.ZL(a)
-C.nt.oX(a)
-return a},null,null,0,0,115,"new VMViewElement$created"]}},
-"+VMViewElement":[572],
-V36:{
+C.nt.XI(a)
+return a}}},
+V37:{
 "^":"uL+Pi;",
 $isd3:true}}],])
 I.$finishClasses($$,$,null)
 $$=null
-J.O.$isString=true
-J.O.$isTx=true
-J.O.$asTx=[J.O]
-J.O.$isa=true
-J.P.$isTx=true
-J.P.$asTx=[J.P]
-J.P.$isa=true
-J.bU.$isint=true
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isTx=true
-J.bU.$asTx=[J.P]
-J.bU.$isa=true
-J.Pp.$isdouble=true
-J.Pp.$isTx=true
-J.Pp.$asTx=[J.P]
-J.Pp.$isTx=true
-J.Pp.$asTx=[J.P]
-J.Pp.$isa=true
+P.KN.$isKN=true
+P.KN.$isIj=true
+P.KN.$asIj=[P.FK]
+P.KN.$isa=true
+P.CP.$isCP=true
+P.CP.$isIj=true
+P.CP.$asIj=[P.FK]
+P.CP.$isa=true
 W.KV.$isKV=true
-W.KV.$isD0=true
 W.KV.$isa=true
-W.nX.$isa=true
+W.my.$isa=true
 W.yg.$isa=true
-W.uj.$isa=true
-N.qV.$isTx=true
-N.qV.$asTx=[N.qV]
-N.qV.$isa=true
+W.M5.$isa=true
+P.qU.$isqU=true
+P.qU.$isIj=true
+P.qU.$asIj=[P.qU]
+P.qU.$isa=true
+P.FK.$isIj=true
+P.FK.$asIj=[P.FK]
+P.FK.$isa=true
 P.a6.$isa6=true
-P.a6.$isTx=true
-P.a6.$asTx=[P.a6]
+P.a6.$isIj=true
+P.a6.$asIj=[P.a6]
 P.a6.$isa=true
-J.Q.$isList=true
-J.Q.$isQV=true
-J.Q.$isa=true
-P.Od.$isa=true
-P.a.$isa=true
-W.cv.$iscv=true
-W.cv.$isKV=true
-W.cv.$isD0=true
-W.cv.$isD0=true
-W.cv.$isa=true
 P.qv.$isa=true
-U.EZ.$ishw=true
-U.EZ.$isa=true
+P.WO.$isWO=true
+P.WO.$iscX=true
+P.WO.$isa=true
+N.qV.$isIj=true
+N.qV.$asIj=[N.qV]
+N.qV.$isa=true
+W.h4.$ish4=true
+W.h4.$isKV=true
+W.h4.$isa=true
+P.a.$isa=true
+P.Od.$isa=true
+K.O1.$isO1=true
+K.O1.$isa=true
+U.WH.$ishw=true
+U.WH.$isa=true
 U.Jy.$ishw=true
 U.Jy.$isa=true
 U.zX.$iszX=true
 U.zX.$ishw=true
 U.zX.$isa=true
-U.X7.$ishw=true
-U.X7.$isa=true
-U.uk.$ishw=true
-U.uk.$isa=true
+U.Cu.$ishw=true
+U.Cu.$isa=true
+U.HB.$ishw=true
+U.HB.$isa=true
+U.Mp.$ishw=true
+U.Mp.$isa=true
 U.x9.$ishw=true
 U.x9.$isa=true
 U.no.$ishw=true
 U.no.$isa=true
-U.jK.$ishw=true
-U.jK.$isa=true
-U.w6.$isw6=true
-U.w6.$ishw=true
-U.w6.$isa=true
-U.wk.$ishw=true
-U.wk.$isa=true
-U.kB.$ishw=true
-U.kB.$isa=true
-K.Ae.$isAe=true
-K.Ae.$isa=true
-N.TJ.$isa=true
-P.wv.$iswv=true
-P.wv.$isa=true
+U.cJ.$ishw=true
+U.cJ.$isa=true
+U.elO.$iselO=true
+U.elO.$ishw=true
+U.elO.$isa=true
+U.c0.$ishw=true
+U.c0.$isa=true
+U.ae.$ishw=true
+U.ae.$isa=true
+U.Qb.$ishw=true
+U.Qb.$isa=true
 T.yj.$isyj=true
 T.yj.$isa=true
-J.kn.$isbool=true
-J.kn.$isa=true
-W.OJ.$isea=true
-W.OJ.$isa=true
-A.XP.$isXP=true
-A.XP.$iscv=true
-A.XP.$isKV=true
-A.XP.$isD0=true
-A.XP.$isD0=true
+P.IN.$isIN=true
+P.IN.$isa=true
+G.DA.$isDA=true
+G.DA.$isa=true
+N.JM.$isa=true
+G.Y2.$isY2=true
+G.Y2.$isa=true
+W.tV.$ish4=true
+W.tV.$isKV=true
+W.tV.$isa=true
+P.uq.$isa=true
 A.XP.$isa=true
-P.RS.$isQF=true
-P.RS.$isa=true
-H.Zk.$isQF=true
-H.Zk.$isQF=true
-H.Zk.$isQF=true
-H.Zk.$isa=true
-P.D4.$isD4=true
-P.D4.$isQF=true
-P.D4.$isQF=true
-P.D4.$isa=true
-P.vr.$isvr=true
-P.vr.$isQF=true
-P.vr.$isa=true
-P.NL.$isQF=true
-P.NL.$isa=true
-P.QF.$isQF=true
-P.QF.$isa=true
-P.RY.$isQF=true
-P.RY.$isa=true
-P.tg.$isX9=true
-P.tg.$isQF=true
-P.tg.$isa=true
-P.X9.$isX9=true
-P.X9.$isQF=true
-P.X9.$isa=true
-P.Ms.$isMs=true
-P.Ms.$isX9=true
-P.Ms.$isQF=true
-P.Ms.$isQF=true
-P.Ms.$isa=true
-P.Ys.$isQF=true
-P.Ys.$isa=true
-X.TR.$isa=true
-P.MO.$isMO=true
-P.MO.$isa=true
+A.Ap.$isa=true
+L.Tv.$isTv=true
+L.Tv.$isa=true
+P.a2.$isa2=true
+P.a2.$isa=true
+M.wS.$isa=true
 F.d3.$isa=true
 W.ea.$isea=true
 W.ea.$isa=true
-P.qh.$isqh=true
-P.qh.$isa=true
-W.Wp.$isWp=true
-W.Wp.$isea=true
-W.Wp.$isa=true
-G.DA.$isDA=true
-G.DA.$isa=true
-M.Ya.$isa=true
-Y.Pn.$isa=true
-U.hw.$ishw=true
-U.hw.$isa=true
-A.zs.$iscv=true
-A.zs.$isKV=true
-A.zs.$isD0=true
-A.zs.$isD0=true
-A.zs.$isa=true
-A.bS.$isa=true
-G.Y2.$isa=true
-P.uq.$isa=true
-P.iD.$isiD=true
-P.iD.$isa=true
-W.YN.$isKV=true
-W.YN.$isD0=true
-W.YN.$isa=true
-N.HV.$isHV=true
-N.HV.$isa=true
-H.yo.$isa=true
-H.IY.$isa=true
-H.aX.$isa=true
-W.I0.$isKV=true
-W.I0.$isD0=true
-W.I0.$isa=true
+P.cb.$iscb=true
+P.cb.$isa=true
+P.MO.$isMO=true
+P.MO.$isa=true
+W.Oq.$isOq=true
+W.Oq.$isea=true
+W.Oq.$isa=true
+A.dM.$ish4=true
+A.dM.$isKV=true
+A.dM.$isa=true
 D.af.$isaf=true
 D.af.$isa=true
 D.bv.$isaf=true
 D.bv.$isa=true
-W.cx.$isea=true
-W.cx.$isa=true
-D.Vi.$isa=true
-D.e5.$isa=true
-D.Q4.$isa=true
-D.N8.$isa=true
+D.ta.$isa=true
+D.ER.$isa=true
+D.DP.$isa=true
+D.uA.$isa=true
 D.U4.$isaf=true
 D.U4.$isa=true
-D.rj.$isrj=true
-D.rj.$isaf=true
-D.rj.$isa=true
-D.SI.$isSI=true
-D.SI.$isaf=true
-D.SI.$isqC=true
-D.SI.$asqC=[null,null]
-D.SI.$isZ0=true
-D.SI.$asZ0=[null,null]
-D.SI.$isa=true
+D.vx.$isvx=true
+D.vx.$isaf=true
+D.vx.$isa=true
+D.vO.$isvO=true
+D.vO.$isaf=true
+D.vO.$isqC=true
+D.vO.$asqC=[null,null]
+D.vO.$isZ0=true
+D.vO.$asZ0=[null,null]
+D.vO.$isa=true
+D.c2.$isc2=true
 D.c2.$isa=true
-W.zU.$isD0=true
-W.zU.$isa=true
+W.fJ.$isa=true
 W.ew.$isea=true
 W.ew.$isa=true
-D.Z9.$isa=true
-G.Ni.$isa=true
 D.kx.$iskx=true
 D.kx.$isaf=true
 D.kx.$isa=true
-D.t9.$isa=true
-W.qp.$iscv=true
-W.qp.$isKV=true
-W.qp.$isD0=true
-W.qp.$isD0=true
-W.qp.$isa=true
-P.MN.$isMN=true
-P.MN.$isa=true
-P.KA.$isKA=true
-P.KA.$isnP=true
-P.KA.$isMO=true
-P.KA.$isa=true
-P.JI.$isJI=true
-P.JI.$isKA=true
-P.JI.$isnP=true
-P.JI.$isMO=true
-P.JI.$isa=true
-H.Uz.$isUz=true
-H.Uz.$isD4=true
-H.Uz.$isQF=true
-H.Uz.$isQF=true
-H.Uz.$isQF=true
-H.Uz.$isQF=true
-H.Uz.$isQF=true
-H.Uz.$isa=true
-P.e4y.$ise4y=true
-P.e4y.$isa=true
-P.dl.$isdl=true
-P.dl.$isa=true
+D.D5.$isa=true
+D.HJ.$isa=true
+W.AW.$isea=true
+W.AW.$isa=true
+H.zL.$isa=true
+H.IY.$isa=true
+H.aX.$isa=true
+W.I0.$isKV=true
+W.I0.$isa=true
+Y.qS.$isa=true
+U.hw.$ishw=true
+U.hw.$isa=true
+G.Ni.$isa=true
+P.mE.$ismE=true
+P.mE.$isa=true
+P.DR.$isDR=true
+P.DR.$isoK=true
+P.DR.$isMO=true
+P.DR.$isa=true
+P.f6.$isf6=true
+P.f6.$isDR=true
+P.f6.$isoK=true
+P.f6.$isMO=true
+P.f6.$isa=true
 V.qC.$isqC=true
 V.qC.$isZ0=true
 V.qC.$isa=true
-P.jp.$isjp=true
-P.jp.$isa=true
-P.Tx.$isTx=true
-P.Tx.$isa=true
-W.D0.$isD0=true
-W.D0.$isa=true
-P.aY.$isaY=true
-P.aY.$isa=true
-P.Z0.$isZ0=true
-P.Z0.$isa=true
-P.tU.$istU=true
-P.tU.$isa=true
-P.QV.$isQV=true
-P.QV.$isa=true
-P.nP.$isnP=true
-P.nP.$isa=true
+P.Ij.$isIj=true
+P.Ij.$isa=true
+P.cX.$iscX=true
+P.cX.$isa=true
 P.b8.$isb8=true
 P.b8.$isa=true
-P.iP.$isiP=true
-P.iP.$isTx=true
-P.iP.$asTx=[null]
-P.iP.$isa=true
-P.fIm.$isfIm=true
-P.fIm.$isa=true
-O.Qb.$isQb=true
-O.Qb.$isa=true
-D.fJ.$isfJ=true
-D.fJ.$isaf=true
-D.fJ.$isa=true
-D.hR.$ishR=true
-D.hR.$isaf=true
-D.hR.$isa=true
 P.EH.$isEH=true
 P.EH.$isa=true
+P.oK.$isoK=true
+P.oK.$isa=true
+P.fIm.$isfIm=true
+P.fIm.$isa=true
+P.iP.$isiP=true
+P.iP.$isIj=true
+P.iP.$asIj=[null]
+P.iP.$isa=true
+O.Hz.$isHz=true
+O.Hz.$isa=true
+L.AR.$isAR=true
+L.AR.$isa=true
+P.Z0.$isZ0=true
+P.Z0.$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
 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
-if(!(a instanceof P.a))return J.is.prototype
+if(!(a instanceof P.a))return J.zH.prototype
 return a}
 J.RE=function(a){if(a==null)return a
 if(typeof a!="object")return a
 if(a instanceof P.a)return a
-return J.ks(a)}
+return J.m0(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.ks(a)}
+return J.m0(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.is.prototype
+if(!(a instanceof P.a))return J.zH.prototype
 return a}
 J.rY=function(a){if(typeof a=="string")return J.O.prototype
 if(a==null)return a
-if(!(a instanceof P.a))return J.is.prototype
+if(!(a instanceof P.a))return J.zH.prototype
 return a}
 J.w1=function(a){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.ks(a)}
-J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.bU.prototype
+return J.m0(a)}
+J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.L7.prototype
 return J.Pp.prototype}if(typeof a=="string")return J.O.prototype
 if(a==null)return J.Jh.prototype
-if(typeof a=="boolean")return J.kn.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.ks(a)}
-J.AA=function(a){return J.RE(a).GB(a)}
-J.AB=function(a){return J.RE(a).gkU(a)}
+return J.m0(a)}
+J.A4=function(a,b){return J.RE(a).sjx(a,b)}
+J.AF=function(a){return J.RE(a).gIi(a)}
 J.AG=function(a){return J.x(a).bu(a)}
-J.AK=function(a){return J.RE(a).Zi(a)}
-J.Ag=function(a){return J.RE(a).goY(a)}
-J.Aw=function(a,b){return J.RE(a).sHp(a,b)}
-J.BM=function(a,b,c){return J.w1(a).xe(a,b,c)}
-J.Ba=function(a){return J.RE(a).gUx(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.AK=function(a){return J.RE(a).gWp(a)}
+J.AL=function(a){return J.RE(a).gW6(a)}
+J.Ae=function(a,b){return J.RE(a).sd4(a,b)}
+J.Ak=function(a){return J.RE(a).ghy(a)}
+J.Aw=function(a){return J.RE(a).gb6(a)}
+J.B9=function(a){return J.RE(a).gL0(a)}
+J.BC=function(a,b){return J.RE(a).sja(a,b)}
+J.BT=function(a){return J.RE(a).gNG(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.Bx=function(a){return J.RE(a).gRH(a)}
+J.Bq=function(a){return J.RE(a).gUN(a)}
+J.By=function(a,b){return J.RE(a).sLW(a,b)}
+J.C5=function(a,b){return J.RE(a).snN(a,b)}
 J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
-J.Cl=function(a,b,c){return J.w1(a).Mu(a,b,c)}
+J.CN=function(a){return J.RE(a).gd0(a)}
+J.Cm=function(a){return J.RE(a).gvC(a)}
+J.D9=function(a){return J.RE(a).GB(a)}
+J.DF=function(a,b){return J.RE(a).soc(a,b)}
+J.DL=function(a){return J.RE(a).gK4(a)}
+J.DO=function(a){return J.RE(a).gR(a)}
+J.Dd=function(a){return J.RE(a).gLe(a)}
+J.Dh=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
+J.Dn=function(a,b){return J.w1(a).zV(a,b)}
+J.Do=function(a){return J.RE(a).gM0(a)}
+J.Dq=function(a,b){return J.w1(a).Rz(a,b)}
 J.Ds=function(a){return J.RE(a).gPj(a)}
+J.E3=function(a){return J.RE(a).gRu(a)}
 J.EC=function(a){return J.RE(a).giC(a)}
-J.EY=function(a,b){return J.RE(a).od(a,b)}
-J.Eg=function(a,b){return J.rY(a).Tc(a,b)}
+J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
 J.Eh=function(a,b){return J.Wx(a).O(a,b)}
-J.Ew=function(a){return J.RE(a).gSw(a)}
-J.Ez=function(a,b){return J.Wx(a).yM(a,b)}
-J.F6=function(a,b){return J.RE(a).stD(a,b)}
+J.Er=function(a,b){return J.RE(a).sfY(a,b)}
+J.Ew=function(a){return J.RE(a).gkm(a)}
+J.Ex=function(a,b){return J.RE(a).sjl(a,b)}
 J.F8=function(a){return J.RE(a).gjO(a)}
+J.FI=function(a){return J.RE(a).gig(a)}
 J.FN=function(a){return J.U6(a).gl0(a)}
-J.FW=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
-return J.Wx(a).V(a,b)}
-J.G6=function(a){return J.RE(a).grz(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.GP=function(a){return J.w1(a).gA(a)}
+J.FS=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
+J.FW=function(a,b){return J.rY(a).j(a,b)}
+J.Fc=function(a,b){return J.RE(a).sP(a,b)}
+J.Ff=function(a){return J.RE(a).gXN(a)}
+J.Fg=function(a,b){return J.RE(a).sKE(a,b)}
+J.GT=function(a,b){return J.RE(a).sQl(a,b)}
 J.GW=function(a){return J.RE(a).gVY(a)}
-J.H2=function(a,b){return J.RE(a).sDD(a,b)}
-J.HF=function(a){return J.RE(a).gD7(a)}
-J.Hf=function(a){return J.RE(a).gTq(a)}
-J.IQ=function(a){return J.RE(a).Ms(a)}
-J.IS=function(a){return J.RE(a).gnv(a)}
-J.Ih=function(a,b,c){return J.RE(a).X6(a,b,c)}
+J.GZ=function(a,b){return J.RE(a).sph(a,b)}
+J.Gc=function(a){return J.RE(a).gnv(a)}
+J.H3=function(a,b){return J.RE(a).sZA(a,b)}
+J.HF=function(a,b){return J.RE(a).sX0(a,b)}
+J.HO=function(a){return J.RE(a).Zi(a)}
+J.Hr=function(a,b){return J.RE(a).shN(a,b)}
+J.I1=function(a){return J.RE(a).gSf(a)}
+J.I2=function(a){return J.RE(a).gwv(a)}
+J.II=function(a){return J.w1(a).Jd(a)}
+J.IO=function(a){return J.RE(a).gRH(a)}
+J.IX=function(a,b){return J.RE(a).sEu(a,b)}
+J.Ip=function(a,b){return J.RE(a).QS(a,b)}
+J.Is=function(a,b){return J.rY(a).Tc(a,b)}
 J.Iz=function(a){return J.RE(a).gfY(a)}
-J.J4=function(a,b,c,d,e,f,g,h){return J.RE(a).A8(a,b,c,d,e,f,g,h)}
 J.J5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>=b
 return J.Wx(a).F(a,b)}
 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.JV=function(a,b){return J.RE(a).sEl(a,b)}
 J.JZ=function(a,b){return J.RE(a).st0(a,b)}
-J.Jj=function(a,b,c,d){return J.RE(a).Z1(a,b,c,d)}
+J.Ja=function(a){return J.RE(a).gr9(a)}
+J.Jb=function(a,b){return J.RE(a).sdu(a,b)}
+J.Jj=function(a){return J.RE(a).gWA(a)}
+J.Jn=function(a,b){return J.RE(a).swv(a,b)}
+J.Jp=function(a){return J.RE(a).gjl(a)}
 J.Jr=function(a,b){return J.RE(a).Id(a,b)}
-J.K3=function(a,b){return J.RE(a).Kb(a,b)}
-J.KM=function(a,b){return J.U6(a).sB(a,b)}
-J.Kf=function(a,b){return J.RE(a).WO(a,b)}
-J.Kv=function(a,b){return J.RE(a).jx(a,b)}
-J.L0=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
-J.LH=function(a,b){return J.w1(a).GT(a,b)}
+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.Kd=function(a){return J.RE(a).gRY(a)}
+J.Kl=function(a){return J.RE(a).gBP(a)}
+J.Kn=function(a){return J.Wx(a).yu(a)}
+J.Kt=function(a){return J.RE(a).gG3(a)}
+J.L9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
+return J.Wx(a).V(a,b)}
+J.LB=function(a){return J.RE(a).gX0(a)}
+J.LE=function(a){return J.RE(a).VD(a)}
 J.LL=function(a){return J.Wx(a).HG(a)}
+J.LM=function(a,b){return J.RE(a).szj(a,b)}
+J.LY=function(a){return J.RE(a).gPZ(a)}
 J.Ld=function(a,b){return J.w1(a).eR(a,b)}
 J.Lh=function(a,b,c){return J.RE(a).ek(a,b,c)}
-J.Lp=function(a,b){return J.RE(a).st5(a,b)}
-J.MI=function(a,b){return J.RE(a).PN(a,b)}
+J.Ln=function(a){return J.RE(a).gdU(a)}
+J.Lp=function(a){return J.RE(a).geT(a)}
+J.M3=function(a,b){return J.RE(a).snZ(a,b)}
+J.M4=function(a){return J.RE(a).gJN(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.MQ=function(a){return J.w1(a).grZ(a)}
-J.MV=function(a,b){return J.RE(a).Ih(a,b)}
-J.Mu=function(a,b){return J.RE(a).sig(a,b)}
-J.Mz=function(a){return J.rY(a).hc(a)}
+J.Mb=function(a){return J.RE(a).gSY(a)}
+J.Mo=function(a){return J.RE(a).gx6(a)}
+J.Mx=function(a,b,c){return J.w1(a).aP(a,b,c)}
+J.Mz=function(a){return J.RE(a).goE(a)}
+J.N1=function(a){return J.RE(a).Es(a)}
+J.NO=function(a){return J.RE(a).VH(a)}
+J.NQ=function(a){return J.RE(a).gjb(a)}
 J.Nf=function(a,b){return J.RE(a).syw(a,b)}
-J.Ng=function(a){return J.RE(a).gxX(a)}
+J.Nh=function(a,b){return J.RE(a).sSY(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.O2=function(a,b){return J.RE(a).Ch(a,b)}
-J.O6=function(a){return J.RE(a).goc(a)}
-J.OBt=function(a){return J.RE(a).gfg(a)}
+J.Nl=function(a){return J.RE(a).gO3(a)}
+J.O2=function(a){return J.RE(a).JP(a)}
+J.OB=function(a){return J.RE(a).gfg(a)}
 J.OE=function(a,b){return J.RE(a).sfg(a,b)}
+J.OL=function(a){return J.RE(a).gQl(a)}
 J.OS=function(a,b){return J.w1(a).tt(a,b)}
-J.Or=function(a){return J.RE(a).yx(a)}
+J.Ok=function(a,b){return J.RE(a).vV(a,b)}
+J.Oo=function(a,b){return J.RE(a).sjT(a,b)}
+J.P2=function(a,b){return J.RE(a).sU4(a,b)}
+J.P5=function(a){return J.RE(a).gHo(a)}
+J.P6=function(a,b){return J.RE(a).sZ2(a,b)}
+J.PB=function(a){return J.RE(a).gI(a)}
+J.PP=function(a){return J.RE(a).gEu(a)}
+J.PY=function(a){return J.RE(a).goN(a)}
+J.Pk=function(a,b){return J.RE(a).svu(a,b)}
+J.Pl=function(a,b){return J.RE(a).sM6(a,b)}
+J.Pq=function(a,b){return J.RE(a).sig(a,b)}
+J.Pr=function(a){return J.RE(a).gU4(a)}
 J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
-J.Q5=function(a){return J.RE(a).gwl(a)}
-J.Q8=function(a){return J.RE(a).gp8(a)}
-J.QC=function(a){return J.w1(a).wg(a)}
+J.Q4=function(a){return J.RE(a).gph(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){return J.RE(a).gdB(a)}
 J.QE=function(a){return J.RE(a).gCd(a)}
-J.QM=function(a,b){return J.RE(a).Rg(a,b)}
-J.QP=function(a){return J.RE(a).gF1(a)}
+J.QX=function(a){return J.RE(a).gUo(a)}
 J.Qd=function(a){return J.RE(a).gRn(a)}
+J.Qf=function(a,b){return J.RE(a).soE(a,b)}
+J.Qk=function(a,b,c){return J.RE(a).aD(a,b,c)}
 J.Qr=function(a,b){return J.RE(a).skc(a,b)}
+J.Qv=function(a){return J.RE(a).gSs(a)}
+J.Qy=function(a,b){return J.RE(a).shf(a,b)}
+J.R6=function(a,b){return J.RE(a).sCI(a,b)}
+J.RC=function(a){return J.RE(a).gTA(a)}
+J.RF=function(a,b){return J.RE(a).WO(a,b)}
+J.Ry=function(a){return J.RE(a).gLW(a)}
+J.S2=function(a,b){return J.RE(a).jn(a,b)}
+J.S5=function(a,b){return J.RE(a).sbA(a,b)}
+J.S9=function(a){return J.RE(a).gyX(a)}
+J.SB=function(a,b){return J.RE(a).Yj(a,b)}
+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.Sq=function(a,b){return J.RE(a).zY(a,b)}
-J.TD=function(a){return J.RE(a).i4(a)}
-J.TZ=function(a){return J.RE(a).gKV(a)}
+J.SM=function(a){return J.RE(a).gbw(a)}
+J.SZ=function(a){return J.RE(a).gSO(a)}
+J.Sj=function(a,b){return J.RE(a).svC(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.Sz=function(a){return J.RE(a).gUx(a)}
+J.Td=function(a){return J.RE(a).gpf(a)}
+J.Tm=function(a){return J.RE(a).gBy(a)}
 J.Tr=function(a){return J.RE(a).gCj(a)}
 J.Ts=function(a,b){return J.Wx(a).Z(a,b)}
-J.Tt=function(a,b){return J.RE(a).sNl(a,b)}
+J.Tx=function(a,b){return J.RE(a).spf(a,b)}
 J.U2=function(a){return J.w1(a).V1(a)}
 J.U8=function(a){return J.RE(a).gUQ(a)}
-J.UK=function(a,b){return J.RE(a).RR(a,b)}
+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.UQ=function(a,b){if(a.constructor==Array||typeof a=="string"||H.wV(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return 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.UT=function(a){return J.RE(a).gDQ(a)}
 J.UU=function(a,b){return J.U6(a).u8(a,b)}
-J.Ut=function(a,b,c,d){return J.RE(a).rJ(a,b,c,d)}
-J.V1=function(a,b){return J.w1(a).Rz(a,b)}
-J.VN=function(a){return J.RE(a).gM0(a)}
-J.Vf=function(a){return J.RE(a).gVE(a)}
-J.Vk=function(a,b){return J.w1(a).ev(a,b)}
+J.VJ=function(a,b){return J.w1(a).sit(a,b)}
+J.VL=function(a){return J.RE(a).gR2(a)}
+J.VZ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
+J.Vi=function(a){return J.RE(a).grO(a)}
+J.Vl=function(a){return J.RE(a).gja(a)}
 J.Vm=function(a){return J.RE(a).gP(a)}
-J.Vq=function(a){return J.RE(a).xo(a)}
+J.Vr=function(a,b){return J.RE(a).Kb(a,b)}
 J.Vs=function(a){return J.RE(a).gQg(a)}
 J.Vw=function(a,b,c){return J.U6(a).Is(a,b,c)}
+J.W2=function(a){return J.RE(a).gCf(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){return J.RE(a).gG3(a)}
-J.XH=function(a){return J.Wx(a).yu(a)}
-J.XS=function(a,b){return J.w1(a).zV(a,b)}
-J.Xf=function(a,b){return J.RE(a).oo(a,b)}
-J.Y5=function(a){return J.RE(a).gyT(a)}
-J.Y8=function(a,b,c){return J.w1(a).UZ(a,b,c)}
-J.YD=function(a){return J.RE(a).gR(a)}
-J.YP=function(a){return J.RE(a).gQ7(a)}
-J.YV=function(a){return J.RE(a).goE(a)}
-J.Yl=function(a){return J.w1(a).np(a)}
+J.WI=function(a,b){return J.RE(a).sLF(a,b)}
+J.WS=function(a){return J.RE(a).gD7(a)}
+J.WT=function(a){return J.RE(a).gFR(a)}
+J.WX=function(a){return J.RE(a).gbJ(a)}
+J.WY=function(a){return J.RE(a).gnp(a)}
+J.Wp=function(a){return J.RE(a).gQU(a)}
+J.XF=function(a,b){return J.RE(a).siC(a,b)}
+J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
+J.YQ=function(a){return J.RE(a).gPL(a)}
+J.Yf=function(a){return J.w1(a).gIr(a)}
 J.Yq=function(a){return J.RE(a).gSR(a)}
-J.Z7=function(a){if(typeof a=="number")return-a
-return J.Wx(a).J(a)}
-J.ZP=function(a,b){return J.RE(a).Tk(a,b)}
+J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
+J.ZL=function(a){return J.RE(a).gAF(a)}
+J.ZN=function(a){return J.RE(a).gqN(a)}
+J.ZU=function(a,b){return J.RE(a).sRY(a,b)}
 J.ZZ=function(a,b){return J.rY(a).yn(a,b)}
-J.aK=function(a,b,c){return J.U6(a).XU(a,b,c)}
-J.ak=function(a){return J.RE(a).gNF(a)}
-J.am=function(a){return J.RE(a).VD(a)}
+J.Zg=function(a,b){return J.RE(a).sqw(a,b)}
+J.Zv=function(a){return J.RE(a).grs(a)}
+J.a8=function(a,b){return J.RE(a).sdU(a,b)}
+J.aA=function(a){return J.RE(a).gzY(a)}
+J.aT=function(a){return J.RE(a).god(a)}
 J.bB=function(a){return J.x(a).gbx(a)}
-J.bY=function(a,b){return J.Wx(a).Y(a,b)}
-J.bd=function(a,b){return J.RE(a).sBu(a,b)}
+J.ba=function(a){return J.RE(a).gKJ(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.c9=function(a,b){return J.RE(a).sa4(a,b)}
+J.br=function(a,b){return J.w1(a).XP(a,b)}
+J.bu=function(a){return J.RE(a).gyw(a)}
+J.c1=function(a,b){return J.RE(a).Wk(a,b)}
 J.cG=function(a){return J.RE(a).Ki(a)}
-J.cR=function(a,b){return J.Wx(a).WZ(a,b)}
+J.cO=function(a){return J.RE(a).gjx(a)}
+J.cU=function(a){return J.RE(a).gHh(a)}
 J.cZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
-J.cm=function(a,b){return J.RE(a).sFA(a,b)}
+J.cd=function(a){return J.RE(a).gql(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.de=function(a,b){if(a==null)return b==null
-if(typeof a!="object")return b!=null&&a===b
-return J.x(a).n(a,b)}
+J.dY=function(a){return J.RE(a).ga4(a)}
+J.de=function(a){return J.RE(a).gGd(a)}
+J.df=function(a,b,c,d){return J.RE(a).wN(a,b,c,d)}
 J.dk=function(a,b){return J.RE(a).sMj(a,b)}
-J.e2=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
-J.eI=function(a,b){return J.RE(a).bA(a,b)}
-J.f5=function(a){return J.RE(a).gI(a)}
+J.dy=function(a){return J.RE(a).gqw(a)}
+J.eU=function(a){return J.RE(a).gY9(a)}
+J.fA=function(a){return J.RE(a).gJp(a)}
+J.fD=function(a){return J.RE(a).e6(a)}
 J.fH=function(a,b){return J.RE(a).stT(a,b)}
+J.fa=function(a){return J.RE(a).gMj(a)}
+J.fb=function(a,b){return J.RE(a).sql(a,b)}
+J.fc=function(a,b){return J.RE(a).sR(a,b)}
 J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
 J.fi=function(a,b){return J.RE(a).ps(a,b)}
-J.i4=function(a,b){return J.w1(a).Zv(a,b)}
-J.iF=function(a,b){return J.RE(a).szZ(a,b)}
-J.iS=function(a){return J.RE(a).gox(a)}
-J.iZ=function(a){return J.RE(a).gzZ(a)}
-J.ja=function(a,b){return J.w1(a).Vr(a,b)}
+J.fv=function(a,b){return J.RE(a).sUx(a,b)}
+J.fw=function(a){return J.RE(a).gEl(a)}
+J.fx=function(a){return J.RE(a).gtu(a)}
+J.hS=function(a,b){return J.w1(a).srZ(a,b)}
+J.hb=function(a){return J.RE(a).gQ1(a)}
+J.ht=function(a){return J.RE(a).gZ2(a)}
+J.i9=function(a,b){return J.w1(a).Zv(a,b)}
+J.iH=function(a,b){return J.RE(a).sDQ(a,b)}
+J.iL=function(a){return J.RE(a).gNb(a)}
+J.iM=function(a,b){return J.RE(a).st5(a,b)}
+J.iY=function(a){return J.RE(a).gnN(a)}
+J.io=function(a){return J.RE(a).gBV(a)}
+J.is=function(a){return J.RE(a).gni(a)}
+J.iz=function(a,b){return J.RE(a).GE(a,b)}
+J.j1=function(a){return J.RE(a).gZA(a)}
+J.jH=function(a){return J.RE(a).ghN(a)}
+J.jM=function(a,b){return J.RE(a).sPj(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.kE=function(a,b){return J.U6(a).tg(a,b)}
+J.jl=function(a){return J.RE(a).gHt(a)}
+J.jo=function(a){return J.RE(a).gCI(a)}
+J.jzo=function(a){if(typeof a=="number")return-a
+return J.Wx(a).J(a)}
+J.k7=function(a){return J.RE(a).gbA(a)}
+J.kB=function(a,b){return J.RE(a).sFR(a,b)}
+J.kE=function(a){return J.w1(a).git(a)}
 J.kH=function(a,b){return J.w1(a).aN(a,b)}
-J.kW=function(a,b,c){if((a.constructor==Array||H.wV(a,a[init.dispatchPropertyName]))&&!a.immutable$list&&b>>>0===b&&b<a.length)return a[b]=c
+J.kS=function(a){return J.RE(a).gVU(a)}
+J.kT=function(a,b){return J.RE(a).snv(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.kl=function(a,b){return J.w1(a).ez(a,b)}
-J.kq=function(a,b){return J.RE(a).sF1(a,b)}
+J.ks=function(a){return J.RE(a).gB1(a)}
+J.kv=function(a){return J.RE(a).glp(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.lB=function(a){return J.RE(a).gP1(a)}
-J.lE=function(a,b){return J.rY(a).j(a,b)}
-J.m4=function(a){return J.RE(a).gig(a)}
-J.mQ=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a&b)>>>0
-return J.Wx(a).i(a,b)}
-J.nJ=function(a){return J.RE(a).ga4(a)}
+J.l7=function(a,b){return J.RE(a).sv8(a,b)}
+J.lN=function(a){return J.RE(a).gil(a)}
+J.lT=function(a){return J.RE(a).gOd(a)}
+J.ls=function(a){return J.RE(a).gt3(a)}
+J.m9=function(a,b){return J.RE(a).wR(a,b)}
+J.mP=function(a){return J.RE(a).gzj(a)}
+J.mY=function(a){return J.w1(a).gA(a)}
+J.mb=function(a,b){return J.RE(a).sWA(a,b)}
+J.mu=function(a,b){return J.RE(a).TR(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.nG=function(a){return J.RE(a).gv8(a)}
+J.ns=function(a){return J.RE(a).gjT(a)}
+J.o0=function(a,b){return J.RE(a).sRu(a,b)}
 J.oE=function(a,b){return J.Qc(a).iM(a,b)}
 J.oJ=function(a,b){return J.RE(a).srs(a,b)}
-J.oL=function(a){return J.RE(a).gE8(a)}
+J.oL=function(a){return J.RE(a).gWT(a)}
+J.oO=function(a,b){return J.RE(a).siJ(a,b)}
+J.oe=function(a){return J.RE(a).gks(a)}
+J.okV=function(a,b){return J.RE(a).RR(a,b)}
 J.on=function(a){return J.RE(a).gtT(a)}
-J.pO=function(a){return J.U6(a).gor(a)}
+J.pB=function(a){return J.RE(a).gDX(a)}
 J.pP=function(a){return J.RE(a).gDD(a)}
-J.pe=function(a,b){return J.RE(a).pr(a,b)}
+J.pW=function(a,b,c,d){return J.RE(a).Si(a,b,c,d)}
+J.pj=function(a,b){return J.RE(a).sni(a,b)}
+J.pm=function(a){return J.RE(a).gt0(a)}
+J.q0=function(a,b){return J.RE(a).syG(a,b)}
+J.q6=function(a,b,c){return J.U6(a).XU(a,b,c)}
 J.q8=function(a){return J.U6(a).gB(a)}
 J.qA=function(a){return J.w1(a).br(a)}
-J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
-J.qK=function(a,b){return J.RE(a).aJ(a,b)}
-J.qd=function(a,b,c,d){return J.RE(a).aC(a,b,c,d)}
-J.qz=function(a){return J.RE(a).gPw(a)}
+J.ql=function(a){return J.RE(a).gV5(a)}
+J.qq=function(a,b){return J.RE(a).sNG(a,b)}
+J.qr=function(a,b){return J.RE(a).sGd(a,b)}
+J.r0=function(a,b){return J.Wx(a).Sy(a,b)}
 J.r4=function(a){return J.RE(a).pj(a)}
-J.rK=function(a,b){return J.RE(a).szf(a,b)}
-J.rP=function(a,b){return J.RE(a).sTq(a,b)}
 J.rr=function(a){return J.rY(a).bS(a)}
-J.t8=function(a,b){return J.RE(a).FL(a,b)}
-J.ta=function(a,b){return J.RE(a).sP(a,b)}
-J.td=function(a){return J.RE(a).gng(a)}
-J.ti=function(a,b){return J.RE(a).sQr(a,b)}
+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.tE=function(a){return J.RE(a).goc(a)}
+J.tF=function(a){return J.RE(a).gyW(a)}
+J.tv=function(a,b){return J.RE(a).sDX(a,b)}
 J.tx=function(a){return J.RE(a).guD(a)}
-J.u3=function(a){return J.RE(a).geT(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.rY(a).Fr(a,b)}
+J.uM=function(a,b){return J.RE(a).sod(a,b)}
+J.uP=function(a){return J.RE(a).gVE(a)}
+J.uW=function(a){return J.RE(a).gyG(a)}
 J.uf=function(a){return J.RE(a).gxr(a)}
-J.uw=function(a){return J.RE(a).gwd(a)}
+J.ul=function(a,b,c){return J.w1(a).UZ(a,b,c)}
+J.un=function(a){return J.RE(a).giJ(a)}
+J.uy=function(a){return J.RE(a).gHm(a)}
 J.v1=function(a){return J.x(a).giO(a)}
-J.vF=function(a){return J.RE(a).gbP(a)}
+J.vI=function(a,b,c){return J.RE(a).D9(a,b,c)}
 J.vP=function(a){return J.RE(a).My(a)}
+J.vU=function(a,b){return J.RE(a).skm(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.ve=function(a,b){return J.RE(a).sdG(a,b)}
+J.vi=function(a){return J.RE(a).gNa(a)}
+J.vo=function(a,b){return J.w1(a).ev(a,b)}
+J.vr=function(a){return J.RE(a).dQ(a)}
+J.w7=function(a,b){return J.RE(a).syW(a,b)}
 J.w8=function(a){return J.RE(a).gkc(a)}
-J.wC=function(a){return J.RE(a).cO(a)}
 J.wD=function(a,b){return J.w1(a).sIr(a,b)}
-J.wT=function(a,b){return J.w1(a).h(a,b)}
-J.wp=function(a,b,c,d){return J.w1(a).zB(a,b,c,d)}
+J.wJ=function(a,b){return J.RE(a).slp(a,b)}
+J.wO=function(a){return J.RE(a).gE7(a)}
+J.wg=function(a,b){return J.U6(a).sB(a,b)}
+J.wp=function(a){return J.w1(a).zB(a)}
+J.wz=function(a){return J.RE(a).gzx(a)}
+J.x0=function(a){return J.RE(a).S6(a)}
+J.x5=function(a,b){return J.U6(a).tg(a,b)}
+J.xC=function(a,b){if(a==null)return b==null
+if(typeof a!="object")return b!=null&&a===b
+return J.x(a).n(a,b)}
 J.xH=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
 return J.Wx(a).W(a,b)}
 J.xR=function(a){return J.RE(a).ghf(a)}
-J.xq=function(a){return J.RE(a).gUj(a)}
-J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yn=function(a,b){return J.RE(a).vV(a,b)}
-J.yxg=function(a){return J.RE(a).gGd(a)}
-J.z2=function(a){return J.RE(a).gG1(a)}
-J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
+J.xZ=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
 return J.Wx(a).D(a,b)}
-J.zH=function(a){return J.RE(a).gt5(a)}
-J.zJ=function(a){return J.RE(a).aA(a)}
+J.xa=function(a){return J.RE(a).geS(a)}
+J.xq=function(a,b){return J.w1(a).Vr(a,b)}
+J.y2=function(a,b){return J.RE(a).mx(a,b)}
+J.y9=function(a){return J.RE(a).lh(a)}
+J.yA=function(a){return J.RE(a).gvu(a)}
+J.yB=function(a,b){return J.RE(a).sIt(a,b)}
+J.yK=function(a){return J.RE(a).gWw(a)}
+J.yO=function(a,b){return J.RE(a).stN(a,b)}
+J.ye=function(a,b){return J.RE(a).sE7(a,b)}
+J.yi=function(a){return J.RE(a).gbN(a)}
+J.yn=function(a){return J.RE(a).gkZ(a)}
+J.yo=function(a){return J.RE(a).gPW(a)}
+J.yq=function(a){return J.RE(a).gNs(a)}
+J.yz=function(a){return J.RE(a).gLF(a)}
+J.z2=function(a){return J.RE(a).gG1(a)}
+J.z3=function(a){return J.RE(a).gu6(a)}
+J.z4=function(a){return J.U6(a).gor(a)}
+J.zD=function(a){return J.RE(a).gKE(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){return J.RE(a).glQ(a)}
 J.zj=function(a){return J.RE(a).gvH(a)}
-C.Uy=X.hV.prototype
-C.J0=B.pz.prototype
-C.ae=A.iL.prototype
-C.oq=Q.Tg.prototype
-C.ka=Z.Jc.prototype
-C.IK=O.CN.prototype
+C.Gx=X.hV.prototype
+C.J0=B.G6.prototype
+C.HR=A.wM.prototype
+C.YZz=Q.eW.prototype
+C.ka=Z.aC.prototype
+C.tA=O.VY.prototype
 C.ux=F.Be.prototype
-C.j8=R.i6.prototype
-C.O0=R.lw.prototype
-C.OD=F.Ir.prototype
-C.Gh=L.rm.prototype
-C.UF=R.Lt.prototype
-C.MC=D.UL.prototype
-C.LT=A.jM.prototype
-C.Xo=U.qW.prototype
-C.h4=N.mk.prototype
-C.pJ=O.pL.prototype
-C.Vc=K.jY.prototype
-C.W3=W.zU.prototype
-C.cp=B.pR.prototype
-C.pU=Z.hx.prototype
-C.wQ=D.YA.prototype
-C.rC=D.Yj.prototype
-C.RR=A.Mv.prototype
-C.kS=X.E7.prototype
-C.LN=N.oO.prototype
-C.F2=D.IWF.prototype
-C.kd=D.Oz.prototype
-C.Qt=D.Stq.prototype
-C.Xe=L.qkb.prototype
+C.T0=R.i6.prototype
+C.O0=R.JI.prototype
+C.OD=F.ZP.prototype
+C.Gh=L.nJ.prototype
+C.qL=R.Eg.prototype
+C.Yl=D.i7.prototype
+C.by=A.Gk.prototype
+C.Xo=U.DK.prototype
+C.p0=N.BS.prototype
+C.pJ=O.Vb.prototype
+C.Vc=K.Ly.prototype
+C.W3=W.fJ.prototype
+C.Ie=E.mO.prototype
+C.Ig=E.DE.prototype
+C.NK=E.U1.prototype
+C.wd=E.L4.prototype
+C.EL=B.pR.prototype
+C.yd=Z.hx.prototype
+C.wQ=D.Mc.prototype
+C.rC=D.Qh.prototype
+C.uF=A.fl.prototype
+C.bb=X.kK.prototype
+C.LN=N.oa.prototype
+C.F2=D.IW.prototype
+C.Ji=D.Oz.prototype
+C.nM=D.St.prototype
+C.BJ=L.qk.prototype
 C.Nm=J.Q.prototype
 C.ON=J.Pp.prototype
-C.jn=J.bU.prototype
+C.jn=J.L7.prototype
 C.jN=J.Jh.prototype
 C.CD=J.P.prototype
 C.xB=J.O.prototype
 C.Yt=Z.vj.prototype
-C.ct=A.oM.prototype
+C.ct=A.UK.prototype
 C.Z3=R.LU.prototype
-C.MG=M.KL.prototype
-C.S2=W.H9.prototype
-C.kD=A.F1.prototype
-C.SU=A.aQ.prototype
-C.nn=A.Qa.prototype
+C.MG=M.CX.prototype
+C.mU=H.eEV.prototype
+C.kD=A.md.prototype
+C.SU=A.Bm.prototype
+C.nn=A.Ya.prototype
 C.J7=A.Ww.prototype
 C.t5=W.yk.prototype
-C.k0=V.F1i.prototype
+C.k0=V.F1.prototype
 C.Pf=Z.uL.prototype
-C.ZQ=J.FP.prototype
-C.zb=A.XP.prototype
-C.Iv=A.xc.prototype
-C.Cc=Q.NQ.prototype
-C.HD=T.SM.prototype
-C.c0=A.knI.prototype
-C.cJ=U.fI.prototype
-C.SX=R.zMr.prototype
-C.Vd=D.nk.prototype
-C.ZO=U.ob.prototype
+C.Sx=J.iC.prototype
+C.Vk=A.ir.prototype
+C.Cc=Q.qZ.prototype
+C.oA=T.Uy.prototype
+C.Mh=A.kn.prototype
+C.FH=U.fI.prototype
+C.SX=R.zM.prototype
+C.ZJ=D.Rk.prototype
+C.th=U.Ti.prototype
 C.wU=Q.xI.prototype
-C.fA=Q.Uj.prototype
-C.dX=K.xT.prototype
-C.bg=X.uwf.prototype
-C.lx=A.tz.prototype
-C.vB=J.is.prototype
-C.V8=X.I5.prototype
-C.nt=U.en.prototype
-C.ol=W.u9.prototype
+C.Yo=Q.CY.prototype
+C.dX=K.nm.prototype
+C.wB=X.uw.prototype
+C.lx=A.G1.prototype
+C.vB=J.zH.prototype
+C.u2=X.I5.prototype
+C.nt=U.el.prototype
 C.KZ=new H.hJ()
-C.OL=new U.EZ()
-C.Gw=new H.yq()
-C.E3=new J.Q()
-C.Fm=new J.kn()
-C.yX=new J.Pp()
-C.c1=new J.bU()
-C.x0=new J.Jh()
-C.oD=new J.P()
-C.Kn=new J.O()
-C.J19=new K.ndx()
-C.IU=new P.TO()
-C.Us=new A.yL()
-C.Nw=new K.vly()
+C.x4=new U.WH()
+C.Gw=new H.Xc()
+C.Eq=new P.vG()
 C.Wj=new P.JF()
-C.xd=new A.Mh()
-C.OY=new P.mg()
-C.NU=new P.R8()
-C.v8=new P.AHi()
+C.pr=new P.mgb()
+C.dV=new L.iNc()
+C.NU=new P.R81()
 C.WA=new D.WAE("Collected")
 C.l8=new D.WAE("Dart")
-C.nj=new D.WAE("Native")
+C.Oc=new D.WAE("Native")
 C.yP=new D.WAE("Reused")
-C.oA=new D.WAE("Tag")
-C.F9=new A.V3("action-link")
-C.vr3=new A.V3("service-exception-view")
-C.Ux=new A.V3("isolate-location")
-C.Br=new A.V3("observatory-element")
-C.dA=new A.V3("heap-profile")
-C.I3=new A.V3("script-view")
-C.XG=new A.V3("nav-refresh")
-C.Bd=new A.V3("isolate-counter-chart")
-C.E6=new A.V3("field-ref")
-C.aM=new A.V3("isolate-summary")
-C.Is=new A.V3("response-viewer")
-C.OLi=new A.V3("script-inset")
-C.qT=new A.V3("nav-menu-item")
-C.KI=new A.V3("library-nav-menu")
-C.Tl=new A.V3("service-view")
-C.Cu=new A.V3("heap-map")
-C.nu=new A.V3("function-view")
-C.jR=new A.V3("isolate-profile")
-C.xW=new A.V3("code-view")
-C.aQx=new A.V3("class-view")
-C.NG=new A.V3("isolate-view")
-C.Vn=new A.V3("eval-link")
-C.mS=new A.V3("sliding-checkbox")
-C.Hk=new A.V3("vm-view")
-C.Oyb=new A.V3("library-view")
-C.H3=new A.V3("code-ref")
-C.NT=new A.V3("top-nav-menu")
-C.js=new A.V3("stack-trace")
-C.Ur=new A.V3("script-ref")
-C.tSc=new A.V3("class-ref")
-C.Po=new A.V3("isolate-shared-summary")
-C.jy=new A.V3("breakpoint-list")
-C.VW=new A.V3("instance-ref")
-C.Ye=new A.V3("vm-ref")
-C.Gu=new A.V3("collapsible-content")
-C.Xv=new A.V3("stack-frame")
-C.kR=new A.V3("observatory-application")
-C.uvO=new A.V3("service-error-view")
-C.Qz=new A.V3("eval-box")
-C.zaS=new A.V3("isolate-nav-menu")
-C.qJ=new A.V3("class-nav-menu")
-C.uW=new A.V3("error-view")
-C.u7=new A.V3("nav-menu")
-C.Xuf=new A.V3("isolate-run-state")
-C.KH=new A.V3("json-view")
-C.j6=new A.V3("isolate-ref")
-C.o3=new A.V3("function-ref")
-C.uy=new A.V3("library-ref")
-C.vc=new A.V3("field-view")
-C.JD=new A.V3("service-ref")
-C.nW=new A.V3("nav-bar")
-C.DKS=new A.V3("curly-block")
-C.qlk=new A.V3("instance-view")
-C.ny=new P.a6(0)
-C.mt=H.VM(new W.UC("change"),[W.ea])
-C.pi=H.VM(new W.UC("click"),[W.Wp])
-C.MD=H.VM(new W.UC("error"),[W.ew])
-C.PP=H.VM(new W.UC("hashchange"),[W.ea])
-C.i3=H.VM(new W.UC("input"),[W.ea])
-C.fK=H.VM(new W.UC("load"),[W.ew])
-C.Ns=H.VM(new W.UC("message"),[W.cx])
-C.DK=H.VM(new W.UC("mousedown"),[W.Wp])
-C.W2=H.VM(new W.UC("mousemove"),[W.Wp])
-C.Mc=function(hooks) {
+C.Z7=new D.WAE("Tag")
+C.nU=new A.iYn(0)
+C.BM=new A.iYn(1)
+C.it=new A.iYn(2)
+C.YT=new H.GD("expr")
+C.HH=H.IL('dynamic')
+C.NS=new K.vly()
+C.px=new A.yL()
+I.ko=function(a){a.immutable$list=init
+a.fixed$length=init
+return a}
+C.XVh=I.ko([C.NS,C.px])
+C.V0=new A.ES(C.YT,C.BM,!1,C.HH,!1,C.XVh)
+C.rB=new H.GD("isolate")
+C.Ug=H.IL('bv')
+C.ZQ=new A.ES(C.rB,C.BM,!1,C.Ug,!1,C.XVh)
+C.Ms=new H.GD("iconClass")
+C.Db=H.IL('qU')
+C.mI=new K.ndx()
+C.y0=I.ko([C.NS,C.mI])
+C.Gl=new A.ES(C.Ms,C.BM,!1,C.Db,!1,C.y0)
+C.VK=new H.GD("devtools")
+C.BQ=H.IL('a2')
+C.m8=new A.ES(C.VK,C.BM,!1,C.BQ,!1,C.XVh)
+C.EV=new H.GD("library")
+C.Sk=H.IL('U4')
+C.Ei=new A.ES(C.EV,C.BM,!1,C.Sk,!1,C.XVh)
+C.zU=new H.GD("uncheckedText")
+C.IK=new A.ES(C.zU,C.BM,!1,C.Db,!1,C.XVh)
+C.UL=new H.GD("profileChanged")
+C.yQ=H.IL('EH')
+C.xD=I.ko([])
+C.mM=new A.ES(C.UL,C.it,!1,C.yQ,!1,C.xD)
+C.Ql=new H.GD("hasClass")
+C.TJ=new A.ES(C.Ql,C.BM,!1,C.BQ,!1,C.y0)
+C.B0=new H.GD("expand")
+C.Rf=new A.ES(C.B0,C.BM,!1,C.BQ,!1,C.XVh)
+C.kV=new H.GD("link")
+C.Os=new A.ES(C.kV,C.BM,!1,C.Db,!1,C.XVh)
+C.Wm=new H.GD("refChanged")
+C.QW=new A.ES(C.Wm,C.it,!1,C.yQ,!1,C.xD)
+C.SA=new H.GD("lines")
+C.hAX=H.IL('WO')
+C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.y0)
+C.bJ=new H.GD("counters")
+C.jJ=H.IL('qC')
+C.iF=new A.ES(C.bJ,C.BM,!1,C.jJ,!1,C.XVh)
+C.cg=new H.GD("anchor")
+C.pU=new A.ES(C.cg,C.BM,!1,C.Db,!1,C.XVh)
+C.fn=new H.GD("instance")
+C.MR1=H.IL('vO')
+C.cV=new A.ES(C.fn,C.BM,!1,C.MR1,!1,C.XVh)
+C.aH=new H.GD("displayCutoff")
+C.hR=new A.ES(C.aH,C.BM,!1,C.Db,!1,C.y0)
+C.uk=new H.GD("last")
+C.Mq=new A.ES(C.uk,C.BM,!1,C.BQ,!1,C.XVh)
+C.bz=new H.GD("isolateChanged")
+C.Bk=new A.ES(C.bz,C.it,!1,C.yQ,!1,C.xD)
+C.CG=new H.GD("posChanged")
+C.Ml=new A.ES(C.CG,C.it,!1,C.yQ,!1,C.xD)
+C.QH=new H.GD("fragmentation")
+C.kt=new A.ES(C.QH,C.BM,!1,C.MR1,!1,C.XVh)
+C.td=new H.GD("object")
+C.SmN=H.IL('af')
+C.No=new A.ES(C.td,C.BM,!1,C.SmN,!1,C.XVh)
+C.SR=new H.GD("map")
+C.HL=new A.ES(C.SR,C.BM,!1,C.MR1,!1,C.XVh)
+C.Gs=new H.GD("sampleCount")
+C.iO=new A.ES(C.Gs,C.BM,!1,C.Db,!1,C.y0)
+C.kw=new H.GD("trace")
+C.W9=new A.ES(C.kw,C.BM,!1,C.MR1,!1,C.XVh)
+C.uu=new H.GD("internal")
+C.x3=new A.ES(C.uu,C.BM,!1,C.BQ,!1,C.XVh)
+C.TW=new H.GD("tagSelector")
+C.H0=new A.ES(C.TW,C.BM,!1,C.Db,!1,C.y0)
+C.nf=new H.GD("function")
+C.Up=new A.ES(C.nf,C.BM,!1,C.MR1,!1,C.XVh)
+C.Ys=new H.GD("pad")
+C.hK=new A.ES(C.Ys,C.BM,!1,C.BQ,!1,C.XVh)
+C.He=new H.GD("hideTagsChecked")
+C.oV=new A.ES(C.He,C.BM,!1,C.BQ,!1,C.y0)
+C.zz=new H.GD("timeSpan")
+C.lS=new A.ES(C.zz,C.BM,!1,C.Db,!1,C.y0)
+C.Gr=new H.GD("endPos")
+C.yw=H.IL('KN')
+C.j3=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.XVh)
+C.mr=new H.GD("expanded")
+C.DC=new A.ES(C.mr,C.BM,!1,C.BQ,!1,C.y0)
+C.j2=new H.GD("app")
+C.PS=H.IL('mL')
+C.zJ=new A.ES(C.j2,C.BM,!1,C.PS,!1,C.XVh)
+C.xP=new H.GD("ref")
+C.hI=new A.ES(C.xP,C.BM,!1,C.SmN,!1,C.XVh)
+C.qs=new H.GD("io")
+C.ly=new A.ES(C.qs,C.BM,!1,C.MR1,!1,C.XVh)
+C.qX=new H.GD("fragmentationChanged")
+C.dO=new A.ES(C.qX,C.it,!1,C.yQ,!1,C.xD)
+C.i0=new H.GD("coverageChanged")
+C.GH=new A.ES(C.i0,C.it,!1,C.yQ,!1,C.xD)
+C.pO=new H.GD("functionChanged")
+C.au=new A.ES(C.pO,C.it,!1,C.yQ,!1,C.xD)
+C.rP=new H.GD("mapChanged")
+C.Nt=new A.ES(C.rP,C.it,!1,C.yQ,!1,C.xD)
+C.aP=new H.GD("active")
+C.xO=new A.ES(C.aP,C.BM,!1,C.BQ,!1,C.XVh)
+C.WQ=new H.GD("field")
+C.NA=new A.ES(C.WQ,C.BM,!1,C.MR1,!1,C.XVh)
+C.YD=new H.GD("sampleRate")
+C.fP=new A.ES(C.YD,C.BM,!1,C.Db,!1,C.y0)
+C.Aa=new H.GD("results")
+C.va=H.IL('wn')
+C.Uz=new A.ES(C.Aa,C.BM,!1,C.va,!1,C.y0)
+C.t6=new H.GD("mapAsString")
+C.b6=new A.ES(C.t6,C.BM,!1,C.Db,!1,C.y0)
+C.hf=new H.GD("label")
+C.n6=new A.ES(C.hf,C.BM,!1,C.Db,!1,C.XVh)
+C.UY=new H.GD("result")
+C.rT=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.XVh)
+C.PX=new H.GD("script")
+C.qn=H.IL('vx')
+C.Cj=new A.ES(C.PX,C.BM,!1,C.qn,!1,C.XVh)
+C.S4=new H.GD("busy")
+C.FB=new A.ES(C.S4,C.BM,!1,C.BQ,!1,C.y0)
+C.AO=new H.GD("qualifiedName")
+C.UE=new A.ES(C.AO,C.BM,!1,C.Db,!1,C.XVh)
+C.eh=new H.GD("lineMode")
+C.rH=new A.ES(C.eh,C.BM,!1,C.Db,!1,C.y0)
+C.XA=new H.GD("cls")
+C.CO=new A.ES(C.XA,C.BM,!1,C.MR1,!1,C.XVh)
+C.AV=new H.GD("callback")
+C.h1=new A.ES(C.AV,C.BM,!1,C.HH,!1,C.XVh)
+C.PM=new H.GD("status")
+C.jv=new A.ES(C.PM,C.BM,!1,C.Db,!1,C.y0)
+C.kz=new H.GD("showCoverageChanged")
+C.db=new A.ES(C.kz,C.it,!1,C.yQ,!1,C.xD)
+C.ox=new H.GD("countersChanged")
+C.Rh=new A.ES(C.ox,C.it,!1,C.yQ,!1,C.xD)
+C.bk=new H.GD("checked")
+C.Nu=new A.ES(C.bk,C.BM,!1,C.BQ,!1,C.XVh)
+C.bE=new H.GD("sampleDepth")
+C.h3=new A.ES(C.bE,C.BM,!1,C.Db,!1,C.y0)
+C.tW=new H.GD("pos")
+C.HM=new A.ES(C.tW,C.BM,!1,C.yw,!1,C.XVh)
+C.RJ=new H.GD("vm")
+C.n8S=H.IL('wv')
+C.Ce=new A.ES(C.RJ,C.BM,!1,C.n8S,!1,C.XVh)
+C.WZ=new H.GD("coverage")
+C.Um=new A.ES(C.WZ,C.BM,!1,C.BQ,!1,C.XVh)
+C.wu=H.IL('Sa')
+C.ti=new A.ES(C.AV,C.BM,!1,C.wu,!1,C.XVh)
+C.N8=new H.GD("scriptChanged")
+C.qE=new A.ES(C.N8,C.it,!1,C.yQ,!1,C.xD)
+C.UX=new H.GD("msg")
+C.X4=new A.ES(C.UX,C.BM,!1,C.MR1,!1,C.XVh)
+C.rE=new H.GD("frame")
+C.Kv=new A.ES(C.rE,C.BM,!1,C.jJ,!1,C.XVh)
+C.ak=new H.GD("hasParent")
+C.yI=new A.ES(C.ak,C.BM,!1,C.BQ,!1,C.y0)
+C.xS=new H.GD("tagSelectorChanged")
+C.bw=new A.ES(C.xS,C.it,!1,C.yQ,!1,C.xD)
+C.kG=new H.GD("classTable")
+C.jt=H.IL('Vz')
+C.dh=new A.ES(C.kG,C.BM,!1,C.jt,!1,C.y0)
+C.Dj=new H.GD("refreshTime")
+C.Ay=new A.ES(C.Dj,C.BM,!1,C.Db,!1,C.y0)
+C.i4=new H.GD("code")
+C.nq=H.IL('kx')
+C.h9=new A.ES(C.i4,C.BM,!1,C.nq,!1,C.XVh)
+C.oj=new H.GD("httpServer")
+C.dF=new A.ES(C.oj,C.BM,!1,C.MR1,!1,C.XVh)
+C.vb=new H.GD("profile")
+C.eq=new A.ES(C.vb,C.BM,!1,C.MR1,!1,C.XVh)
+C.a0=new H.GD("isDart")
+C.P9=new A.ES(C.a0,C.BM,!1,C.BQ,!1,C.y0)
+C.Gn=new H.GD("objectChanged")
+C.az=new A.ES(C.Gn,C.it,!1,C.yQ,!1,C.xD)
+C.ne=new H.GD("exception")
+C.SNu=H.IL('EP')
+C.l6=new A.ES(C.ne,C.BM,!1,C.SNu,!1,C.XVh)
+C.QK=new H.GD("qualified")
+C.VQ=new A.ES(C.QK,C.BM,!1,C.BQ,!1,C.XVh)
+C.yh=new H.GD("error")
+C.k5t=H.IL('ft')
+C.yc=new A.ES(C.yh,C.BM,!1,C.k5t,!1,C.XVh)
+C.oUD=H.IL('N7')
+C.xQ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.XVh)
+C.r1=new H.GD("expandChanged")
+C.nP=new A.ES(C.r1,C.it,!1,C.yQ,!1,C.xD)
+C.XY=new H.GD("showCoverage")
+C.ec=new A.ES(C.XY,C.BM,!1,C.BQ,!1,C.XVh)
+C.Lc=new H.GD("kind")
+C.Tt=new A.ES(C.Lc,C.BM,!1,C.Db,!1,C.XVh)
+C.ngm=I.ko([C.mI])
+C.Qs=new A.ES(C.i4,C.BM,!0,C.nq,!1,C.ngm)
+C.lH=new H.GD("checkedText")
+C.A5=new A.ES(C.lH,C.BM,!1,C.Db,!1,C.XVh)
+C.GE=new A.ES(C.yh,C.BM,!1,C.SmN,!1,C.XVh)
+C.XM=new H.GD("path")
+C.hL=new A.ES(C.XM,C.BM,!1,C.MR1,!1,C.XVh)
+C.mi=new H.GD("text")
+C.yV=new A.ES(C.mi,C.BM,!1,C.Db,!1,C.y0)
+C.vp=new H.GD("list")
+C.K9=new A.ES(C.vp,C.BM,!1,C.MR1,!1,C.XVh)
+C.PI=new H.GD("displayValue")
+C.lg=new A.ES(C.PI,C.BM,!1,C.Db,!1,C.y0)
+C.RT=new P.a6(0)
+C.mt=H.VM(new W.pq("change"),[W.ea])
+C.nI=H.VM(new W.pq("click"),[W.Oq])
+C.MD=H.VM(new W.pq("error"),[W.ew])
+C.yZ=H.VM(new W.pq("hashchange"),[W.ea])
+C.i3=H.VM(new W.pq("input"),[W.ea])
+C.LF=H.VM(new W.pq("load"),[W.ew])
+C.ph=H.VM(new W.pq("message"),[W.AW])
+C.uh=H.VM(new W.pq("mousedown"),[W.Oq])
+C.Kq=H.VM(new W.pq("mousemove"),[W.Oq])
+C.JS=function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
 }
@@ -17445,23 +16989,23 @@
   }
   hooks.getTag = getTagFirefox;
 }
-C.XQ=function(hooks) { return hooks; }
-
-C.AS=function getTagFallback(o) {
+C.w2=function getTagFallback(o) {
   var constructor = o.constructor;
   if (typeof constructor == "function") {
     var name = constructor.name;
-    if (typeof name == "string"
-        && name !== ""
-        && name !== "Object"
-        && name !== "Function.prototype") {
+    if (typeof name == "string" &&
+        name.length > 2 &&
+        name !== "Object" &&
+        name !== "Function.prototype") {
       return name;
     }
   }
   var s = Object.prototype.toString.call(o);
   return s.substring(8, s.length - 1);
 }
-C.ur=function(getTagFallback) {
+C.XQ=function(hooks) { return hooks; }
+
+C.ku=function(getTagFallback) {
   return function(hooks) {
     if (typeof navigator != "object") return hooks;
     var ua = navigator.userAgent;
@@ -17555,393 +17099,365 @@
   hooks.getTag = getTagFixed;
   hooks.prototypeForTag = prototypeForTagFixed;
 }
-C.xr=new P.by(null,null)
+C.zc=new P.D4(null,null)
 C.A3=new P.Cf(null)
-C.cb=new P.ze(null,null)
-C.Ek=new N.qV("FINER",400)
-C.R5=new N.qV("FINE",500)
+C.Sr=new P.dI(null,null)
+C.Ab=new N.qV("FINER",400)
+C.eI=new N.qV("FINE",500)
 C.IF=new N.qV("INFO",800)
-C.cV=new N.qV("SEVERE",1000)
+C.Xm=new N.qV("SEVERE",1000)
 C.nT=new N.qV("WARNING",900)
-I.makeConstantList = function(list) {
-  list.immutable$list = init;
-  list.fixed$length = init;
-  return list;
-};
-C.HE=I.makeConstantList([0,0,26624,1023,0,0,65534,2047])
-C.mK=I.makeConstantList([0,0,26624,1023,65534,2047,65534,2047])
-C.yD=I.makeConstantList([0,0,26498,1023,65534,34815,65534,18431])
-C.xu=I.makeConstantList([43,45,42,47,33,38,60,61,62,63,94,124])
-C.u0=I.makeConstantList(["==","!=","<=",">=","||","&&"])
-C.Me=H.VM(I.makeConstantList([]),[P.Ms])
-C.dn=H.VM(I.makeConstantList([]),[P.tg])
-C.hU=H.VM(I.makeConstantList([]),[P.X9])
-C.iH=H.VM(I.makeConstantList([]),[J.bU])
-C.xD=I.makeConstantList([])
-C.Qy=I.makeConstantList(["in","this"])
-C.Ym=I.makeConstantList(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
-C.kg=I.makeConstantList([0,0,24576,1023,65534,34815,65534,18431])
-C.aa=I.makeConstantList([0,0,32754,11263,65534,34815,65534,18431])
-C.Wd=I.makeConstantList([0,0,32722,12287,65535,34815,65534,18431])
-C.iq=I.makeConstantList([40,41,91,93,123,125])
-C.jH=I.makeConstantList(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.uE=new H.LPe(11,{caption:null,col:null,colgroup:null,option:null,optgroup:null,tbody:null,td:null,tfoot:null,th:null,thead:null,tr:null},C.jH)
-C.uS=I.makeConstantList(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
-C.FS=new H.LPe(16,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.uS)
-C.a5k=I.makeConstantList(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.dj=new H.LPe(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.a5k)
-C.paX=I.makeConstantList(["name","extends","constructor","noscript","attributes"])
-C.kr=new H.LPe(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
-C.CM=new H.LPe(0,{},C.xD)
-C.MEG=I.makeConstantList(["enumerate"])
-C.eu=new H.LPe(1,{enumerate:K.UM()},C.MEG)
-C.PU=new H.GD("dart.core.Object")
-C.N4=new H.GD("dart.core.DateTime")
-C.Kc=new H.GD("dart.core.bool")
-C.fz=new H.GD("[]")
-C.aP=new H.GD("active")
-C.Es=new H.GD("anchor")
-C.wh=new H.GD("app")
-C.US=new H.GD("architecture")
-C.Zg=new H.GD("args")
-C.ly=new H.GD("assertsEnabled")
-C.S4=new H.GD("busy")
-C.Ka=new H.GD("call")
-C.AV=new H.GD("callback")
-C.wb=new H.GD("checked")
-C.lH=new H.GD("checkedText")
-C.M5=new H.GD("classTable")
-C.XA=new H.GD("cls")
-C.b1=new H.GD("code")
-C.MR=new H.GD("counters")
-C.Xs=new H.GD("coverage")
-C.h1=new H.GD("currentHash")
-C.of=new H.GD("devtools")
-C.aH=new H.GD("displayCutoff")
-C.Jw=new H.GD("displayValue")
-C.nN=new H.GD("dynamic")
-C.Gr=new H.GD("endPos")
-C.tP=new H.GD("entry")
-C.YU=new H.GD("error")
-C.ne=new H.GD("exception")
-C.dI=new H.GD("expand")
-C.mr=new H.GD("expanded")
-C.Of=new H.GD("expander")
-C.Jt=new H.GD("expanderStyle")
-C.Yy=new H.GD("expr")
-C.Gx=new H.GD("field")
-C.CX=new H.GD("fileAndLine")
-C.Gd=new H.GD("firstTokenPos")
-C.Aq=new H.GD("formattedAverage")
-C.WG=new H.GD("formattedCollections")
-C.uU=new H.GD("formattedExclusiveTicks")
-C.eF=new H.GD("formattedInclusiveTicks")
-C.Zt=new H.GD("formattedLine")
-C.ST=new H.GD("formattedTotalCollectionTime")
-C.QH=new H.GD("fragmentation")
-C.rE=new H.GD("frame")
-C.nf=new H.GD("function")
-C.JB=new H.GD("getColumnLabel")
-C.mP=new H.GD("hasClass")
-C.zS=new H.GD("hasDisassembly")
-C.D2=new H.GD("hasParent")
-C.Ia=new H.GD("hashLinkWorkaround")
-C.lb=new H.GD("hideTagsChecked")
-C.wq=new H.GD("hitStyle")
-C.bA=new H.GD("hoverText")
-C.AZ=new H.GD("dart.core.String")
-C.Di=new H.GD("iconClass")
-C.q2=new H.GD("idle")
-C.fn=new H.GD("instance")
-C.zD=new H.GD("internal")
-C.P9=new H.GD("isDart")
+C.Yy=new H.GD("keys")
+C.Yn=new H.GD("values")
+C.Wn=new H.GD("length")
 C.ai=new H.GD("isEmpty")
 C.nZ=new H.GD("isNotEmpty")
-C.FQ=new H.GD("isOptimized")
-C.Z8=new H.GD("isolate")
-C.Qn=new H.GD("jumpTarget")
-C.fy=new H.GD("kind")
-C.y2=new H.GD("label")
-C.QL=new H.GD("last")
+C.WK=I.ko([C.Yy,C.Yn,C.Wn,C.ai,C.nZ])
+C.yD=I.ko([0,0,26498,1023,65534,34815,65534,18431])
+C.G8=I.ko(["==","!=","<=",">=","||","&&"])
+C.Cd=I.ko(["in","this"])
+C.QC=I.ko(["rowColor0","rowColor1","rowColor2","rowColor3","rowColor4","rowColor5","rowColor6","rowColor7","rowColor8"])
+C.bg=I.ko([43,45,42,47,33,38,37,60,61,62,63,94,124])
+C.ML=I.ko([40,41,91,93,123,125])
+C.zao=I.ko(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
+C.uE=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.p5=I.ko(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
+C.Mk=new H.Px(27,{"!":0,":":0,",":0,")":0,"]":0,"}":0,"?":1,"||":2,"&&":3,"|":4,"^":5,"&":6,"!=":7,"==":7,">=":8,">":8,"<=":8,"<":8,"+":9,"-":9,"%":10,"/":10,"*":10,"(":11,"[":11,".":11,"{":11},C.p5)
+C.paX=I.ko(["name","extends","constructor","noscript","attributes"])
+C.kr=new H.Px(5,{name:1,extends:1,constructor:1,noscript:1,attributes:1},C.paX)
+C.CM=new H.Px(0,{},C.xD)
+C.MB=I.ko(["webkitanimationstart","webkitanimationend","webkittransitionend","domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
+C.SP=new H.Px(17,{webkitanimationstart:"webkitAnimationStart",webkitanimationend:"webkitAnimationEnd",webkittransitionend:"webkitTransitionEnd",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.MB)
+C.MEG=I.ko(["enumerate"])
+C.eu=new H.Px(1,{enumerate:K.G5()},C.MEG)
+C.tq=H.IL('Bo')
+C.MS=H.IL('wA')
+C.wE=I.ko([C.MS])
+C.Xk=new A.Wq(!1,!1,!0,C.tq,!1,!0,C.wE,null)
+C.wVi=H.IL('yL')
+C.bt=I.ko([C.wVi])
+C.YV=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.bt,null)
+C.IH=new H.GD("address")
+C.US=new H.GD("architecture")
+C.Za=new H.GD("args")
+C.ET=new H.GD("assertsEnabled")
+C.WC=new H.GD("bpt")
+C.Ro=new H.GD("buttonClick")
+C.Ka=new H.GD("call")
+C.C0=new H.GD("change")
+C.eZ=new H.GD("changeSort")
+C.OI=new H.GD("classes")
+C.qt=new H.GD("coloring")
+C.p1=new H.GD("columns")
+C.M8=new H.GD("currentHash")
+C.iE=new H.GD("descriptor")
+C.f4=new H.GD("descriptors")
+C.aK=new H.GD("doAction")
+C.GP=new H.GD("element")
+C.tP=new H.GD("entry")
+C.Zb=new H.GD("eval")
+C.u7=new H.GD("evalNow")
+C.Ek=new H.GD("expander")
+C.Pn=new H.GD("expanderStyle")
+C.Gd=new H.GD("firstTokenPos")
+C.FP=new H.GD("formatSize")
+C.kF=new H.GD("formatTime")
+C.UD=new H.GD("formattedAddress")
+C.Aq=new H.GD("formattedAverage")
+C.DS=new H.GD("formattedCollections")
+C.C9=new H.GD("formattedDeoptId")
+C.VF=new H.GD("formattedExclusive")
+C.uU=new H.GD("formattedExclusiveTicks")
+C.YJ=new H.GD("formattedInclusive")
+C.eF=new H.GD("formattedInclusiveTicks")
+C.oI=new H.GD("formattedLine")
+C.ST=new H.GD("formattedTotalCollectionTime")
+C.EI=new H.GD("functions")
+C.JB=new H.GD("getColumnLabel")
+C.Uq=new H.GD("getFormattedValue")
+C.A8=new H.GD("getValue")
+C.SI=new H.GD("hasDescriptors")
+C.zS=new H.GD("hasDisassembly")
+C.eo=new H.GD("hashLink")
+C.Ge=new H.GD("hashLinkWorkaround")
+C.wq=new H.GD("hitStyle")
+C.k6=new H.GD("hoverText")
+C.PJ=new H.GD("human")
+C.q2=new H.GD("idle")
+C.d2=new H.GD("imp")
+C.kN=new H.GD("imports")
+C.eJ=new H.GD("instruction")
+C.iG=new H.GD("instructions")
+C.Py=new H.GD("interface")
+C.h7=new H.GD("ioEnabled")
+C.I9=new H.GD("isBool")
+C.C1=new H.GD("isComment")
+C.Yg=new H.GD("isDartCode")
+C.bR=new H.GD("isDouble")
+C.ob=new H.GD("isError")
+C.Iv=new H.GD("isInstance")
+C.Wg=new H.GD("isInt")
+C.tD=new H.GD("isList")
+C.Of=new H.GD("isNull")
+C.pY=new H.GD("isOptimized")
+C.Lk=new H.GD("isString")
+C.dK=new H.GD("isType")
+C.xf=new H.GD("isUnexpected")
+C.Jx=new H.GD("isolates")
+C.b5=new H.GD("jumpTarget")
 C.kA=new H.GD("lastTokenPos")
-C.Wn=new H.GD("length")
-C.Ij=new H.GD("libraries")
-C.EV=new H.GD("library")
-C.eh=new H.GD("lineMode")
-C.Cv=new H.GD("lines")
-C.dB=new H.GD("link")
-C.jA=new H.GD("loading")
-C.dH=new H.GD("mainPort")
-C.p3=new H.GD("map")
-C.t6=new H.GD("mapAsString")
-C.PC=new H.GD("dart.core.int")
-C.ch=new H.GD("message")
-C.UX=new H.GD("msg")
+C.ur=new H.GD("lib")
+C.VN=new H.GD("libraries")
+C.VI=new H.GD("line")
+C.DY=new H.GD("loading")
+C.wT=new H.GD("mainPort")
+C.pX=new H.GD("message")
+C.VD=new H.GD("mouseOut")
+C.NN=new H.GD("mouseOver")
 C.YS=new H.GD("name")
-C.KG=new H.GD("nameIsEmpty")
+C.pu=new H.GD("nameIsEmpty")
 C.So=new H.GD("newHeapCapacity")
-C.IO=new H.GD("newHeapUsed")
+C.EK=new H.GD("newHeapUsed")
 C.OV=new H.GD("noSuchMethod")
-C.VJ=new H.GD("object")
-C.xG=new H.GD("objectPool")
-C.Le=new H.GD("oldHeapCapacity")
-C.SW=new H.GD("oldHeapUsed")
-C.ZU=new H.GD("pad")
+C.zO=new H.GD("objectPool")
+C.eH=new H.GD("oldHeapCapacity")
+C.ap=new H.GD("oldHeapUsed")
+C.zm=new H.GD("padding")
+C.Ic=new H.GD("pause")
 C.yG=new H.GD("pauseEvent")
-C.Kl=new H.GD("pos")
-C.vb=new H.GD("profile")
-C.zc=new H.GD("qualified")
-C.AO=new H.GD("qualifiedName")
-C.kY=new H.GD("ref")
-C.Dj=new H.GD("refreshTime")
-C.c8=new H.GD("registerCallback")
-C.mE=new H.GD("response")
-C.UY=new H.GD("result")
-C.Aa=new H.GD("results")
-C.xe=new H.GD("rootLib")
-C.X8=new H.GD("running")
-C.ok=new H.GD("dart.core.Null")
-C.md=new H.GD("dart.core.double")
-C.XU=new H.GD("sampleCount")
-C.bE=new H.GD("sampleDepth")
-C.mI=new H.GD("sampleRate")
-C.fX=new H.GD("script")
-C.eC=new H.GD("[]=")
-C.V0=new H.GD("showCoverage")
-C.AH=new H.GD("sortedRows")
+C.GR=new H.GD("refresh")
+C.KX=new H.GD("refreshCoverage")
+C.ja=new H.GD("refreshGC")
+C.MT=new H.GD("registerCallback")
+C.Gi=new H.GD("relativeHashLink")
+C.X2=new H.GD("resetAccumulator")
+C.F3=new H.GD("response")
+C.nY=new H.GD("resume")
+C.HD=new H.GD("retainedSize")
+C.iU=new H.GD("retainingPath")
+C.eN=new H.GD("rootLib")
+C.ue=new H.GD("row")
+C.nh=new H.GD("rows")
+C.L2=new H.GD("running")
+C.EA=new H.GD("scripts")
+C.oW=new H.GD("selectExpr")
+C.hd=new H.GD("serviceType")
+C.DW=new H.GD("sortedRows")
 C.R3=new H.GD("stacktrace")
-C.PM=new H.GD("status")
-C.TW=new H.GD("tagSelector")
-C.mi=new H.GD("text")
-C.zz=new H.GD("timeSpan")
-C.EB=new H.GD("topFrame")
-C.QK=new H.GD("totalSamplesInProfile")
-C.kw=new H.GD("trace")
+C.Nv=new H.GD("subclass")
+C.hO=new H.GD("tipExclusive")
+C.ei=new H.GD("tipKind")
+C.HK=new H.GD("tipParent")
+C.je=new H.GD("tipTicks")
+C.hN=new H.GD("tipTime")
+C.Q1=new H.GD("toggleExpand")
+C.ID=new H.GD("toggleExpanded")
+C.z6=new H.GD("tokenPos")
+C.bc=new H.GD("topFrame")
+C.Kj=new H.GD("totalSamplesInProfile")
 C.ep=new H.GD("tree")
 C.J2=new H.GD("typeChecksEnabled")
-C.WY=new H.GD("uncheckedText")
+C.bn=new H.GD("updateLineMode")
 C.mh=new H.GD("uptime")
 C.Fh=new H.GD("url")
-C.ls=new H.GD("value")
+C.jh=new H.GD("v")
+C.YI=new H.GD("value")
+C.xw=new H.GD("variables")
 C.zn=new H.GD("version")
-C.RJ=new H.GD("vm")
-C.KS=new H.GD("vmName")
-C.v6=new H.GD("void")
-C.n8=H.uV('qC')
-C.WP=new H.QT(C.n8,"K",0)
-C.SL=H.uV('Ae')
-C.xC=new H.QT(C.SL,"V",0)
-C.QJ=H.uV('xh')
-C.wW=new H.QT(C.QJ,"T",0)
-C.Gsc=H.uV('wn')
-C.io=new H.QT(C.Gsc,"E",0)
-C.nz=new H.QT(C.n8,"V",0)
-C.k5t=H.uV('hx')
-C.KSy=H.uV('Yj')
-C.q0S=H.uV('Dg')
-C.z6Y=H.uV('Tg')
-C.xFi=H.uV('rm')
-C.eY=H.uV('n6')
-C.J9=H.uV('zMr')
-C.Vh=H.uV('Pz')
-C.zq=H.uV('Qa')
-C.qfw=H.uV('qW')
-C.z7=H.uV('YA')
-C.GTO=H.uV('F1')
-C.nY=H.uV('a')
-C.Yc=H.uV('iP')
-C.jRs=H.uV('Be')
-C.Ow=H.uV('oO')
-C.PT=H.uV('I2')
-C.p8F=H.uV('NQ')
-C.xLI=H.uV('pz')
-C.xz=H.uV('Stq')
-C.T1=H.uV('Wy')
-C.aj=H.uV('fI')
-C.Kh=H.uV('I5')
-C.lg=H.uV('hV')
-C.la=H.uV('ZX')
-C.G4=H.uV('CN')
-C.O4=H.uV('double')
-C.yw=H.uV('int')
-C.b7=H.uV('uwf')
-C.RcY=H.uV('aQ')
-C.KJ=H.uV('mk')
-C.ST4=H.uV('en')
-C.X6M=H.uV('jM')
-C.yiu=H.uV('knI')
-C.dUi=H.uV('Uj')
-C.U9=H.uV('UL')
-C.iG=H.uV('yc')
-C.HI=H.uV('Pg')
-C.ab=H.uV('xI')
-C.lk=H.uV('mJ')
-C.lpG=H.uV('LU')
-C.EG=H.uV('Oz')
-C.Ch=H.uV('KL')
-C.kbo=H.uV('SM')
-C.jV=H.uV('rF')
-C.OdR=H.uV('pL')
-C.cj=H.uV('E7')
-C.UNa=H.uV('F1i')
-C.wE=H.uV('vj')
-C.yB=H.uV('Mv')
-C.JW=H.uV('Ww')
-C.qo=H.uV('jY')
-C.l49=H.uV('uL')
-C.yQ=H.uV('EH')
-C.Im=H.uV('X6')
-C.FU=H.uV('lw')
-C.p5=H.uV('oM')
-C.nG=H.uV('zt')
-C.px=H.uV('tz')
-C.epC=H.uV('Jc')
-C.eB=H.uV('IWF')
-C.JA3=H.uV('b0B')
-C.PF=H.uV('nk')
-C.Db=H.uV('String')
-C.Tu=H.uV('xc')
-C.jwA=H.uV('qkb')
-C.bh=H.uV('i6')
-C.Bm=H.uV('XP')
-C.hg=H.uV('hd')
-C.Fv=H.uV('ob')
-C.Wza=H.uV('pR')
-C.leN=H.uV('Lt')
-C.HL=H.uV('bool')
-C.Qf=H.uV('Null')
-C.HH=H.uV('dynamic')
-C.vVv=H.uV('iL')
-C.Gp=H.uV('cw')
-C.ri=H.uV('yy')
-C.X0=H.uV('Ir')
-C.CS=H.uV('vm')
-C.hN=H.uV('oI')
-C.R4R=H.uV('xT')
-C.xM=new P.z0(!1)
-C.hi=H.VM(new W.bO(W.pq()),[W.OJ])
+C.Tc=new H.GD("vmName")
+C.k5=H.IL('hx')
+C.Mf=H.IL('G1')
+C.cI=H.IL('Dg')
+C.Dl=H.IL('F1')
+C.UJ=H.IL('oa')
+C.E0=H.IL('aI')
+C.Y3=H.IL('CY')
+C.kq=H.IL('Nn')
+C.j4=H.IL('IW')
+C.Vh=H.IL('qZ')
+C.dH=H.IL('Pz')
+C.HC=H.IL('F0')
+C.yS=H.IL('G6')
+C.Sb=H.IL('kn')
+C.FQ=H.IL('a')
+C.Yc=H.IL('iP')
+C.vw=H.IL('UK')
+C.Jo=H.IL('i7')
+C.jR=H.IL('Be')
+C.al=H.IL('es')
+C.PT=H.IL('CX')
+C.iD=H.IL('Vb')
+C.Zt=H.IL('Uy')
+C.ce=H.IL('kK')
+C.FA=H.IL('Ya')
+C.T1=H.IL('Wy')
+C.hG=H.IL('ir')
+C.Th=H.IL('fI')
+C.tU=H.IL('L4')
+C.yT=H.IL('FK')
+C.cK=H.IL('I5')
+C.jA=H.IL('Eg')
+C.K4=H.IL('hV')
+C.Mt=H.IL('hu')
+C.la=H.IL('ZX')
+C.CR=H.IL('CP')
+C.xE=H.IL('aC')
+C.vu=H.IL('uw')
+C.Yxm=H.IL('Pg')
+C.il=H.IL('xI')
+C.G0=H.IL('mJ')
+C.lp=H.IL('LU')
+C.TU=H.IL('Oz')
+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.JW=H.IL('Ww')
+C.CT=H.IL('St')
+C.wH=H.IL('zM')
+C.l4=H.IL('uL')
+C.Wh=H.IL('U1')
+C.Zj=H.IL('md')
+C.KA=H.IL('X6')
+C.YZ=H.IL('zt')
+C.NR=H.IL('nm')
+C.qF=H.IL('mO')
+C.Ey=H.IL('wM')
+C.nX=H.IL('DE')
+C.bh=H.IL('i6')
+C.jRi=H.IL('we')
+C.KO=H.IL('ZP')
+C.BV=H.IL('Mc')
+C.Wz=H.IL('pR')
+C.Io=H.IL('Qh')
+C.wk=H.IL('nJ')
+C.te=H.IL('BS')
+C.ms=H.IL('Bm')
+C.qJ=H.IL('pG')
+C.pK=H.IL('Rk')
+C.lE=H.IL('DK')
+C.ri=H.IL('yy')
+C.CS=H.IL('vm')
+C.Az=H.IL('Gk')
+C.GX=H.IL('c8')
+C.X8=H.IL('Ti')
+C.Lg=H.IL('JI')
+C.Ju=H.IL('Ly')
+C.mq=H.IL('qk')
+C.XW=H.IL('uEY')
+C.oT=H.IL('VY')
+C.jK=H.IL('el')
+C.xM=new P.Fd(!1)
 $.libraries_to_load = {}
-$.te="$cachedFunction"
+$.z7="$cachedFunction"
 $.eb="$cachedInvocation"
 $.OK=0
 $.bf=null
 $.P4=null
-$.Jl=!1
+$.UA=!1
 $.NF=null
 $.TX=null
 $.x7=null
 $.nw=null
 $.vv=null
 $.Bv=null
-$.NR=null
-$.oK=null
-$.tY=null
+$.BY=null
+$.oKB=null
 $.S6=null
 $.k8=null
 $.X3=C.NU
 $.Ss=0
-$.L4=null
+$.Qz=null
 $.PN=null
 $.RL=!1
 $.Y4=C.IF
-$.xO=0
-$.el=0
-$.tW=null
-$.Td=!1
+$.Y1=0
+$.ax=0
+$.iq=null
+$.AM=!1
+$.ps=0
+$.xG=null
 $.Bh=0
-$.uP=!0
-$.VZ="objects/"
+$.ok=!1
+$.RQ="objects/"
 $.To=null
-$.Dq=["A3","A8","AC","AE","AZ","Ar","B2","BN","BT","BX","Ba","Bf","C","C0","C4","Ch","Cp","Cx","D","D3","D6","Dd","E","EX","Ec","Ey","F","FL","FV","FW","Fr","Ft","GB","GG","GT","HG","Hn","Hs","Ic","Id","Ih","Is","J","J2","J3","JG","JP","JV","Ja","Jk","K1","KI","Kb","LI","LV","Ly","Md","Mh","Mi","Ms","Mu","My","NZ","Nj","O","OM","OP","Ob","On","P9","PM","PN","PZ","Pa","Pk","Pv","Q0","QE","Qi","Qx","R3","R4","RB","RC","RR","RU","Rg","Rz","SS","Se","T","TJ","TP","TW","Tc","Tk","Tp","Ty","U","U8","UD","UH","UZ","Uc","V","V1","VD","VH","VI","Vk","Vp","Vr","W","W3","W4","WE","WO","WZ","X6","XG","XU","Xe","Xl","Y","Y9","YF","YI","YS","YU","YW","Yy","Z","Z1","Z2","ZB","ZC","ZF","ZL","ZZ","Ze","Zi","Zv","aA","aC","aD","aJ","aN","ak","an","at","az","b1","b2r","bA","bF","bS","ba","br","bu","cO","cQ","cU","cn","ct","d0","dR","dd","du","eJ","eR","ea","ek","eo","er","es","ev","ez","f1","f6","fZ","fk","fm","g","gA","gAG","gAQ","gAS","gAb","gAn","gAp","gAu","gAy","gB","gB1","gB3","gBJ","gBP","gBV","gBW","gBb","gBs","gBu","gCO","gCY","gCd","gCj","gD5","gD7","gDD","gDe","gE1","gE8","gEW","gEh","gEly","gEu","gF1","gFA","gFR","gFZ","gFs","gFw","gG0","gG1","gG3","gG6","gGQ","gGV","gGd","gGe","gHJ","gHX","gHm","gHp","gHq","gHu","gI","gID","gIF","gIK","gIO","gIW","gIZ","gIr","gIu","gJ0","gJS","gJf","gJo","gKM","gKU","gKV","gKW","gLA","gLF","gLm","gLn","gLx","gM0","gM5","gMB","gMj","gMz","gN","gNF","gNG","gNT","gNW","gNl","gNo","gO3","gO9","gOL","gOZ","gOc","gOe","gOh","gOl","gOm","gP","gP1","gPA","gPK","gPL","gPe","gPj","gPu","gPw","gPy","gQ7","gQG","gQV","gQg","gQl","gQr","gR","gRA","gRH","gRY","gRn","gRu","gRw","gSB","gSR","gSY4","gSw","gT3","gT8","gTS","gTi","gTq","gU4","gUL","gUQ","gUj","gUo","gUx","gUy","gUz","gV4","gV5","gVE","gVY","gVl","gWA","gX7","gXX","gXc","gXd","gXh","gXt","gXv","gXx","gYe","gYr","gZf","ga1","ga3","ga4","gai","gbP","gbY","gbx","gcC","gdB","gdG","gdU","gdW","gdt","ge6","geH","geT","gey","gfN","gfY","gfc","gfg","gfi","ghU","ghX","ghf","ghi","gho","ghw","gi9","giC","giF","giO","giX","gib","gig","gik","git","giy","gjA","gjG","gjJ","gjL","gjO","gjS","gjT","gjv","gk5","gkF","gkU","gkW","gkc","gkp","gl0","glc","glh","gmC","gmH","gmN","gnc","gng","gnv","gnx","gnz","goE","goM","goY","goc","gor","gox","goy","gp8","gpD","gph","gqO","gqW","gqe","gqn","grM","grU","grZ","grd","grs","grz","gt0","gt5","gt7","gtD","gtH","gtN","gtT","gtY","gtp","gts","gu6","guD","guT","guw","gvH","gvJ","gvt","gwd","gwl","gx","gx8","gxU","gxX","gxj","gxr","gxw","gy","gy4","gyG","gyH","gyT","gyX","gys","gyw","gyz","gz1","gzP","gzU","gzW","gzZ","gzf","gzg","gzh","gzj","gzt","h","h8","hZ","hc","hr","hu","i","i4","i5","iM","ii","iw","j","j9","jh","jp","jx","k0","kO","ka","kk","l5","lj","m","m2","m5","mK","n","nC","nH","nN","nY","ni","np","nq","oB","oC","oF","oP","oW","oX","oZ","od","oo","pA","pM","pZ","pj","pp","pr","ps","q1","qA","qC","qEQ","qZ","ql","r6","rJ","rL","rW","ra","rh","sAG","sAQ","sAS","sAb","sAn","sAp","sAu","sAy","sB","sB1","sB3","sBJ","sBP","sBV","sBW","sBb","sBs","sBu","sCO","sCY","sCd","sCj","sDD","sDe","sE1","sEW","sEh","sEly","sEu","sF1","sFA","sFR","sFZ","sFs","sFw","sG1","sG3","sG6","sGQ","sGV","sGd","sGe","sHJ","sHX","sHm","sHp","sHq","sHu","sID","sIF","sIK","sIO","sIZ","sIr","sIu","sJ0","sJS","sJo","sKM","sKU","sKV","sKW","sLA","sLF","sLn","sLx","sM0","sM5","sMB","sMj","sMz","sN","sNF","sNG","sNT","sNW","sNl","sNo","sO3","sO9","sOZ","sOc","sOe","sOh","sOl","sOm","sP","sPA","sPK","sPL","sPe","sPj","sPu","sPw","sPy","sQ7","sQG","sQV","sQl","sQr","sR","sRA","sRH","sRY","sRn","sRu","sSB","sSY4","sSw","sT3","sT8","sTS","sTi","sTq","sU4","sUL","sUQ","sUo","sUx","sUy","sUz","sV4","sV5","sWA","sX7","sXX","sXc","sXd","sXh","sXt","sXv","sXx","sYe","sYr","sa1","sa3","sa4","sai","sbP","sbY","scC","sdB","sdG","sdU","sdW","sdt","se6","seH","seT","sfN","sfY","sfc","sfg","sfi","shU","shX","shf","shi","sho","shw","siC","siF","siX","sib","sig","sik","sit","siy","sjA","sjG","sjJ","sjL","sjO","sjS","sjT","sjv","sk5","skF","skU","skW","skc","skp","slc","slh","smC","smH","smN","snc","sng","snv","snx","soE","soM","soY","soc","sox","soy","sp8","spD","sph","sqO","sqW","sqe","srM","srU","srZ","srd","srs","srz","st0","st5","st7","stD","stN","stT","stY","sts","su6","suD","suT","suw","svH","svJ","svt","swd","sx","sxU","sxX","sxj","sxr","sxw","sy","sy4","syG","syH","syT","syX","sys","syw","syz","sz1","szU","szW","szZ","szf","szg","szh","szj","szt","t","tR","tZ","tg","tn","tt","u","u8","uB","uW","vD","vQ","vV","w","wB","wE","wL","wY","wg","x3","xJ","xW","xc","xe","xo","y0","yM","yN","yc","yn","yq","yu","yx","yy","z2","z6","zB","zV","zY","ze"]
-$.Au=[C.k5t,Z.hx,{created:Z.Co},C.KSy,D.Yj,{created:D.b2},C.q0S,H.Dg,{"":H.bu},C.z6Y,Q.Tg,{created:Q.rt},C.xFi,L.rm,{created:L.Rp},C.J9,R.zMr,{created:R.hp},C.zq,A.Qa,{created:A.JR},C.qfw,U.qW,{created:U.Wz},C.z7,D.YA,{created:D.BP},C.GTO,A.F1,{created:A.aD},C.jRs,F.Be,{created:F.Fe},C.Ow,N.oO,{created:N.Zgg},C.p8F,Q.NQ,{created:Q.Zo},C.xLI,B.pz,{created:B.t4},C.xz,D.Stq,{created:D.N5},C.aj,U.fI,{created:U.Ry},C.Kh,X.I5,{created:X.cF},C.lg,X.hV,{created:X.zy},C.G4,O.CN,{created:O.On},C.b7,X.uwf,{created:X.bV},C.RcY,A.aQ,{created:A.AJ},C.KJ,N.mk,{created:N.N0},C.ST4,U.en,{created:U.oH},C.X6M,A.jM,{created:A.bH},C.yiu,A.knI,{created:A.Th},C.dUi,Q.Uj,{created:Q.Al},C.U9,D.UL,{created:D.zY},C.HI,H.Pg,{"":H.aR},C.ab,Q.xI,{created:Q.lK},C.lpG,R.LU,{created:R.rA},C.EG,D.Oz,{created:D.RP},C.Ch,M.KL,{created:M.Ro},C.kbo,T.SM,{created:T.T5},C.OdR,O.pL,{created:O.pn},C.cj,X.E7,{created:X.jD},C.UNa,V.F1i,{created:V.fv},C.wE,Z.vj,{created:Z.mA},C.yB,A.Mv,{created:A.Du},C.JW,A.Ww,{created:A.zN},C.qo,K.jY,{created:K.Lz},C.l49,Z.uL,{created:Z.Hx},C.FU,R.lw,{created:R.fR},C.p5,A.oM,{created:A.IV},C.px,A.tz,{created:A.J8},C.epC,Z.Jc,{created:Z.zg},C.eB,D.IWF,{created:D.dm},C.JA3,H.b0B,{"":H.UI},C.PF,D.nk,{created:D.dS},C.Tu,A.xc,{created:A.G7},C.jwA,L.qkb,{created:L.uD},C.bh,R.i6,{created:R.Hv},C.Bm,A.XP,{created:A.XL},C.hg,W.hd,{},C.Fv,U.ob,{created:U.lv},C.Wza,B.pR,{created:B.lu},C.leN,R.Lt,{created:R.fL},C.vVv,A.iL,{created:A.lT},C.ri,W.yy,{},C.X0,F.Ir,{created:F.hG},C.R4R,K.xT,{created:K.an}]
+$.Au=[C.tq,W.Bo,{},C.k5,Z.hx,{created:Z.BN},C.Mf,A.G1,{created:A.J8},C.cI,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.VO},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Al},C.j4,D.IW,{created:D.dm},C.Vh,Q.qZ,{created:Q.RH},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.D2},C.vw,A.UK,{created:A.JT},C.Jo,D.i7,{created:D.dq},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.as},C.iD,O.Vb,{created:O.pn},C.Zt,T.Uy,{created:T.Zz},C.ce,X.kK,{created:X.os},C.FA,A.Ya,{created:A.JR},C.hG,A.ir,{created:A.G7},C.Th,U.fI,{created:U.UF},C.tU,E.L4,{created:E.p4},C.cK,X.I5,{created:X.cF},C.jA,R.Eg,{created:R.fL},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.zB},C.vu,X.uw,{created:X.bV},C.Yxm,H.Pg,{"":H.KY},C.il,Q.xI,{created:Q.lK},C.lp,R.LU,{created:R.rA},C.TU,D.Oz,{created:D.RP},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.Du},C.Tq,Z.vj,{created:Z.M7},C.JW,A.Ww,{created:A.ZC},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.cE},C.l4,Z.uL,{created:Z.EE},C.Wh,E.U1,{created:E.hm},C.Zj,A.md,{created:A.aD},C.NR,K.nm,{created:K.an},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.nX,E.DE,{created:E.oB},C.bh,R.i6,{created:R.IT},C.jRi,H.we,{"":H.m6},C.KO,F.ZP,{created:F.Yw},C.BV,D.Mc,{created:D.BP},C.Wz,B.pR,{created:B.lu},C.Io,D.Qh,{created:D.Qj},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.yU},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.E5},C.ri,W.yy,{},C.Az,A.Gk,{created:A.Sy},C.X8,U.Ti,{created:U.lv},C.Lg,R.JI,{created:R.p7},C.Ju,K.Ly,{created:K.le},C.mq,L.qk,{created:L.KM},C.XW,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","cO","C5",function(){return $.jk().window})
-I.$lazy($,"globalWorker","zA","Nl",function(){return $.jk().Worker})
+I.$lazy($,"globalWindow","UW","My",function(){return $.jk().window})
+I.$lazy($,"globalWorker","uj","nB",function(){return $.jk().Worker})
 I.$lazy($,"globalPostMessageDefined","Da","JU",function(){return $.jk().postMessage!==void 0})
-I.$lazy($,"thisScript","Kb","Ak",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[J.bU])})
-I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.LX(H.S7({toString:function(){return"$receiver$"}}))})
-I.$lazy($,"notClosurePattern","k1","OI",function(){return H.LX(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
-I.$lazy($,"nullCallPattern","Re","PH",function(){return H.LX(H.S7(null))})
-I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.LX(function(){var $argumentsExpr$='$arguments$'
+I.$lazy($,"thisScript","Kb","Rs",function(){return H.yl()})
+I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.kM(null),[P.KN])})
+I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
+I.$lazy($,"notClosurePattern","k1","KL",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
+I.$lazy($,"nullCallPattern","Re","PH",function(){return H.cM(H.S7(null))})
+I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
 try{null.$method$($argumentsExpr$)}catch(z){return z.message}}())})
-I.$lazy($,"undefinedCallPattern","qi","rx",function(){return H.LX(H.S7(void 0))})
-I.$lazy($,"undefinedLiteralCallPattern","rZ","Kr",function(){return H.LX(function(){var $argumentsExpr$='$arguments$'
+I.$lazy($,"undefinedCallPattern","GK","LC",function(){return H.cM(H.S7(void 0))})
+I.$lazy($,"undefinedLiteralCallPattern","rZ","Kr",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
 try{(void 0).$method$($argumentsExpr$)}catch(z){return z.message}}())})
-I.$lazy($,"nullPropertyPattern","BX","zO",function(){return H.LX(H.Mj(null))})
-I.$lazy($,"nullLiteralPropertyPattern","tt","Bi",function(){return H.LX(function(){try{null.$method$}catch(z){return z.message}}())})
-I.$lazy($,"undefinedPropertyPattern","dt","eA",function(){return H.LX(H.Mj(void 0))})
-I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.LX(function(){try{(void 0).$method$}catch(z){return z.message}}())})
-I.$lazy($,"customElementsReady","xp","ax",function(){return new B.wJ().$0()})
-I.$lazy($,"_toStringList","Ml","RM",function(){return[]})
-I.$lazy($,"publicSymbolPattern","Np","bw",function(){return new H.VR(H.v4("^(?:(?:[\\-+*/%&|^]|\\[\\]=?|==|~/?|<[<=]?|>[>=]?|unary-)$|(?!(?:assert|break|c(?:a(?:se|tch)|lass|on(?:st|tinue))|d(?:efault|o)|e(?:lse|num|xtends)|f(?:alse|inal(?:ly)?|or)|i[fns]|n(?:ew|ull)|ret(?:hrow|urn)|s(?:uper|witch)|t(?:h(?:is|row)|r(?:ue|y))|v(?:ar|oid)|w(?:hile|ith))\\b(?!\\$))[a-zA-Z$][\\w$]*(?:=?$|[.](?!$)))+?$",!1,!0,!1),null,null)})
-I.$lazy($,"_dynamicType","QG","P8",function(){return new H.EE(C.nN)})
-I.$lazy($,"_voidType","Q3","oj",function(){return new H.EE(C.v6)})
-I.$lazy($,"librariesByName","Ct","vK",function(){return H.dF()})
-I.$lazy($,"currentJsMirrorSystem","GR","Cm",function(){return new H.Sn(null,new H.Lj(init.globalState.N0))})
-I.$lazy($,"mangledNames","tj","bx",function(){return H.hY(init.mangledNames,!1)})
-I.$lazy($,"reflectiveNames","DE","I6",function(){return H.YK($.bx())})
-I.$lazy($,"mangledGlobalNames","iC","Sl",function(){return H.hY(init.mangledGlobalNames,!0)})
-I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.Oj()})
+I.$lazy($,"nullPropertyPattern","BX","W6",function(){return H.cM(H.Mj(null))})
+I.$lazy($,"nullLiteralPropertyPattern","tt","Bi",function(){return H.cM(function(){try{null.$method$}catch(z){return z.message}}())})
+I.$lazy($,"undefinedPropertyPattern","dt","eA",function(){return H.cM(H.Mj(void 0))})
+I.$lazy($,"undefinedLiteralPropertyPattern","A7","ko",function(){return H.cM(function(){try{(void 0).$method$}catch(z){return z.message}}())})
+I.$lazy($,"_completer","IQ","Ib",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
+I.$lazy($,"_toStringList","mC","ng",function(){return[]})
+I.$lazy($,"scheduleImmediateClosure","lI","ej",function(){return P.C2()})
 I.$lazy($,"_toStringVisiting","xg","xb",function(){return P.yv(null)})
 I.$lazy($,"_toStringList","yu","tw",function(){return[]})
-I.$lazy($,"webkitEvents","fD","Vp",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","eo","cM",function(){return P.ND(function(){return this}())})
-I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
+I.$lazy($,"webkitEvents","xW","Z2",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","ca",function(){return P.ND(function(){return this}())})
+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","Je","hs",function(){return function DartObject(a){this.o=a}})
-I.$lazy($,"_freeColor","nK","R2",function(){return[255,255,255,255]})
-I.$lazy($,"_pageSeparationColor","RD","eK",function(){return[0,0,0,255]})
-I.$lazy($,"_loggers","DY","U0",function(){return P.Fl(J.O,N.TJ)})
-I.$lazy($,"_logger","G3","iU",function(){return N.Jx("Observable.dirtyCheck")})
-I.$lazy($,"objectType","XV","aA",function(){return P.re(C.nY)})
-I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.Md().$0()})
-I.$lazy($,"_spacesRegExp","JV","c3",function(){return new H.VR(H.v4("\\s",!1,!0,!1),null,null)})
-I.$lazy($,"_logger","y7","aT",function(){return N.Jx("observe.PathObserver")})
-I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,J.O,P.uq)})
-I.$lazy($,"_waitType","Mp","p2",function(){return P.L5(null,null,null,J.O,A.XP)})
-I.$lazy($,"_waitSuper","uv","xY",function(){return P.L5(null,null,null,J.O,[J.Q,A.XP])})
-I.$lazy($,"_declarations","EJ","cd",function(){return P.L5(null,null,null,J.O,A.XP)})
-I.$lazy($,"_objectType","p0","H8",function(){return P.re(C.nY)})
-I.$lazy($,"_sheetLog","Fa","vM",function(){return N.Jx("polymer.stylesheet")})
-I.$lazy($,"_reverseEventTranslations","fp","QX",function(){return new A.w12().$0()})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR(H.v4("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,J.O,P.a)
+I.$lazy($,"_freeColor","nK","aw",function(){return[255,255,255,255]})
+I.$lazy($,"_pageSeparationColor","fM","Sd",function(){return[0,0,0,255]})
+I.$lazy($,"_loggers","Uj","R2",function(){return P.Fl(P.qU,N.JM)})
+I.$lazy($,"_logger","jz","T5",function(){return N.QM("Observable.dirtyCheck")})
+I.$lazy($,"_instance","qa","C4",function(){return new L.vH([])})
+I.$lazy($,"_pathRegExp","Jm","tN",function(){return new L.MdQ().$0()})
+I.$lazy($,"_logger","y7","Ku",function(){return N.QM("observe.PathObserver")})
+I.$lazy($,"_pathCache","zC","fX",function(){return P.L5(null,null,null,P.qU,L.Tv)})
+I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
+I.$lazy($,"_declarations","ef","RA",function(){return P.L5(null,null,null,P.qU,A.XP)})
+I.$lazy($,"_hasShadowDomPolyfill","jQ","Nc",function(){return $.ca().Eg("ShadowDOMPolyfill")})
+I.$lazy($,"_sheetLog","dz","Es",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.NL())})
+I.$lazy($,"_reverseEventTranslations","fp","pT",function(){return new A.DOe().$0()})
+I.$lazy($,"_ATTRIBUTES_REGEX","vg","zZ",function(){return new H.VR("\\s|,",H.ol("\\s|,",!1,!0,!1),null,null)})
+I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.ol("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
+I.$lazy($,"_polymerSyntax","Df","Nd",function(){var z=P.L5(null,null,null,P.qU,P.a)
 z.FV(0,C.eu)
-return new A.HJ(z)})
-I.$lazy($,"_ready","tS","mC",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"veiledElements","yi","IN",function(){return["body"]})
-I.$lazy($,"_observeLog","DZ","a3",function(){return N.Jx("polymer.observe")})
-I.$lazy($,"_eventsLog","Fj","SS",function(){return N.Jx("polymer.events")})
-I.$lazy($,"_unbindLog","fV","P5",function(){return N.Jx("polymer.unbind")})
-I.$lazy($,"_bindLog","Q6","ZH",function(){return N.Jx("polymer.bind")})
-I.$lazy($,"_shadowHost","cU","od",function(){return H.VM(new P.kM(null),[A.zs])})
-I.$lazy($,"_librariesToLoad","x2","UP",function(){return A.GA(document,window.location.href,null,null)})
-I.$lazy($,"_libs","D9","UG",function(){return $.Cm().gvU()})
-I.$lazy($,"_rootUri","aU","RQ",function(){return $.Cm().F1.gcZ().gFP()})
-I.$lazy($,"_loaderLog","ha","M7",function(){return N.Jx("polymer.loader")})
-I.$lazy($,"_typeHandlers","lq","CT",function(){return new Z.W6().$0()})
-I.$lazy($,"_logger","m0","eH",function(){return N.Jx("polymer_expressions")})
-I.$lazy($,"_BINARY_OPERATORS","Af","Ra",function(){return P.EF(["+",new K.Uf(),"-",new K.wJY(),"*",new K.zOQ(),"/",new K.W6o(),"==",new K.MdQ(),"!=",new K.YJG(),">",new K.DOe(),">=",new K.lPa(),"<",new K.Ufa(),"<=",new K.Raa(),"||",new K.w0(),"&&",new K.w4(),"|",new K.w5()],null,null)})
-I.$lazy($,"_UNARY_OPERATORS","ju","ww",function(){return P.EF(["+",new K.w7(),"-",new K.w10(),"!",new K.w11()],null,null)})
-I.$lazy($,"_currentIsolateMatcher","tV","PY",function(){return new H.VR(H.v4("isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR(H.v4("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.DO().$0()})
+return new A.N9(z)})
+I.$lazy($,"_ready","T6","ln",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
+I.$lazy($,"_observeLog","DZ","dn",function(){return N.QM("polymer.observe")})
+I.$lazy($,"_eventsLog","mf","Uk",function(){return N.QM("polymer.events")})
+I.$lazy($,"_unbindLog","fV","RI",function(){return N.QM("polymer.unbind")})
+I.$lazy($,"_bindLog","Q6","ZH",function(){return N.QM("polymer.bind")})
+I.$lazy($,"_shadowHost","v8","RV",function(){return H.VM(new P.kM(null),[A.dM])})
+I.$lazy($,"_typeHandlers","lq","QL",function(){return P.EF([C.Db,new Z.Md(),C.GX,new Z.lP(),C.Yc,new Z.Uf(),C.BQ,new Z.Ra(),C.yw,new Z.wJY(),C.CR,new Z.zOQ()],null,null)})
+I.$lazy($,"_BINARY_OPERATORS","Af","Jl",function(){return P.EF(["+",new K.lPa(),"-",new K.Ufa(),"*",new K.Raa(),"/",new K.w0(),"==",new K.w5(),"!=",new K.w10(),">",new K.w11(),">=",new K.w12(),"<",new K.w13(),"<=",new K.w14(),"||",new K.w15(),"&&",new K.w16(),"|",new K.w17()],null,null)})
+I.$lazy($,"_UNARY_OPERATORS","ju","fs",function(){return P.EF(["+",new K.w18(),"-",new K.w19(),"!",new K.w20()],null,null)})
+I.$lazy($,"_currentIsolateMatcher","vfp","OX",function(){return new H.VR("isolates/\\d+",H.ol("isolates/\\d+",!1,!0,!1),null,null)})
+I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.ol("isolates/\\d+/",!1,!0,!1),null,null)})
+I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
+I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
+I.$lazy($,"symbolConverter","qe","b7",function(){return D.kP()})
+I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.YJG().$0()})
 I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.kM(null),[null])})
-I.$lazy($,"_ownerStagingDocument","EW","JM",function(){return H.VM(new P.kM(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.lP()).zV(0,", ")})
-I.$lazy($,"_expando","fF","rw",function(){return H.VM(new P.kM("template_binding"),[null])})
+I.$lazy($,"_ownerStagingDocument","EW","Lu",function(){return H.VM(new P.kM(null),[null])})
+I.$lazy($,"_allTemplatesSelectors","Sf","cz",function(){return"template, "+J.kl(C.uE.gvc(),new M.W6o()).zV(0,", ")})
+I.$lazy($,"_templateCreator","H8","rf",function(){return H.VM(new P.kM(null),[null])})
+I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.kM("template_binding"),[null])})
 
-init.functionAliases={}
-init.metadata=[P.a,C.WP,C.nz,C.xC,C.io,C.wW,"object","interceptor","proto","extension","indexability","type","name","codeUnit","string","index","isolate","function","entry","args","sender","e","msg","topLevel","message","isSpawnUri","startPaused","replyTo","x","record","value","memberName",{func:"pL",args:[J.O]},"source","radix","handleError","array","codePoints","charCodes","charCode","years","month","day","hours","minutes","seconds","milliseconds","isUtc","receiver","key","positionalArguments","namedArguments","className","argument","ex","expression","keyValuePairs","result","closure","numberOfArguments","arg1","arg2","arg3","arg4","arity","functions","reflectionInfo","isStatic","jsArguments","propertyName","isSuperCall","stubName","isIntercepted","fieldName","property","staticName","list","returnType","parameterTypes","optionalParameterTypes","rti","typeArguments","target","typeInfo","substitutionName",,"onTypeVariable","types","startIndex","substitution","arguments","isField","checks","asField","s","t","signature","context","contextName","o","allowShorter","obj","tag","interceptorClass","transformer","hooks","pattern","multiLine","caseSensitive","global","needle","haystack","other","from","to",{func:"ny"},{func:"Dv",args:[null]},"_","a","total","pad",{func:"Pt",ret:J.O,args:[J.bU]},"v","time","bytes",{func:"RJ",ret:J.O,args:[null]},{func:"kl",void:true},"iterable","f","initialValue","combine","leftDelimiter","rightDelimiter","compare","start","end","skipCount","src","srcStart","dst","dstStart","count","element","endIndex","left","right","symbol",{func:"pB",ret:P.vr,args:[P.a]},"reflectee","mangledName","methods","fields","variables","mixinNames","code","typeVariables","owner","simpleName","victim","fieldSpecification","jsMangledNames","isGlobal","map",{func:"n9",void:true,args:[{func:"kl",void:true}]},"callback","errorHandler","zone","listeners","notificationHandler",{func:"G5",void:true,args:[null]},{func:"Mx",void:true,args:[null],opt:[P.MN]},"error","stackTrace","userCode","onSuccess","onError","subscription","future","duration",{func:"cX",void:true,args:[P.dl,P.e4y,P.dl,null,P.MN]},"self","parent",{func:"UW",args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"wD",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"ny"},args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"v7",ret:{func:"Dv",args:[null]},args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"IU",ret:{func:"bh",args:[null,null]},args:[P.dl,P.e4y,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.e4y,P.dl,{func:"ny"}]},{func:"xN",ret:P.tU,args:[P.dl,P.e4y,P.dl,P.a6,{func:"kl",void:true}]},{func:"Zb",void:true,args:[P.dl,P.e4y,P.dl,J.O]},"line",{func:"kx",void:true,args:[J.O]},{func:"Nf",ret:P.dl,args:[P.dl,P.e4y,P.dl,P.aY,P.Z0]},"specification","zoneValues","table",{func:"Ib",ret:J.kn,args:[null,null]},"b",{func:"bX",ret:J.bU,args:[null]},"parts","m","number","json","reviver",{func:"uJ",ret:P.a,args:[null]},"toEncodable","indent",{func:"P2",ret:J.bU,args:[P.Tx,P.Tx]},"formattedString","n",{func:"E0",ret:J.kn,args:[P.a,P.a]},{func:"Gm",ret:J.bU,args:[P.a]},{func:"K4",ret:J.bU,args:[J.O],named:{onError:{func:"Tl",ret:J.bU,args:[J.O]},radix:J.bU}},"uri","host","scheme","query","queryParameters","fragment","component",C.xM,!1,"canonicalTable","text","encoding","spaceToPlus",{func:"Tf",ret:J.O,args:[W.D0]},"typeExtension","url","withCredentials","onProgress","method","responseType","mimeType","requestHeaders","sendData","hash","win","constructor",{func:"jn",args:[null,null,null,null]},"oldValue","newValue","document","extendsTagName","w","captureThis","data","length","createProxy","mustCopy","nativeImageData","imageData","current","currentStart","currentEnd","old","oldStart","oldEnd","distances","arr1","arr2","searchLength","splices","records","field","cls","props","getter","template","extendee","sheet","node","path","originalPrepareBinding","methodName","style","scope","doc","baseUri","seen","scripts","uriString","currentValue","expr","l",{func:"qq",ret:[P.QV,K.Ae],args:[P.QV]},"classMirror","c","collection","delegate","model","bound","stagingDocument","el","useRoot","content","bindings","val",{func:"bh",args:[null,null]},{func:"Za",args:[J.O,null]},"parameter",{func:"hF",args:[null,J.O]},J.kn,J.O,[P.Z0,J.O,W.cv],{func:"Uf",ret:J.kn},C.Nw,C.J19,{func:"zk",args:[J.kn]},C.Us,{func:"I0",ret:J.O},{func:"ZT",void:true,args:[null,null,null]},X.LP,H.Tp,G.dZ,D.zM,{func:"Wy",ret:D.bv},{func:"Gt",args:[D.bv]},{func:"e2",ret:D.af},{func:"fK",args:[D.af]},{func:"F3",void:true,args:[D.fJ]},{func:"GJ",void:true,args:[D.hR]},"exception","event",J.bU,[J.Q,G.Y2],[J.Q,J.O],{func:"r5",ret:[J.Q,J.bU]},{func:"qE",ret:J.O,args:[J.bU,J.bU]},"row","column",{func:"wI",args:[J.bU,J.bU]},"i","j",D.SI,{func:"Eg",ret:D.SI},{func:"Q5",args:[D.SI]},"done",B.pv,D.af,Q.xI,{func:"Wr",ret:[P.b8,D.af],args:[J.O]},"dummy",Z.Dsd,{func:"DP",ret:D.kx},D.kx,{func:"FH",args:[D.kx]},{func:"Vj",ret:W.cv,args:[W.KV]},{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail",F.tuj,"r",R.Vct,R.Nr,"library",{func:"h0",args:[H.Uz]},{func:"Gk",args:[P.wv,P.QF]},{func:"lv",args:[P.wv,null]},"typeArgument","tv",{func:"VG",ret:P.Ms,args:[J.bU]},{func:"Z5",args:[J.bU]},{func:"UC",ret:P.X9,args:[J.bU]},"reflectiveName",{func:"ag",args:[J.O,J.O]},{func:"uu",void:true,args:[P.a],opt:[P.MN]},{func:"cq",void:true,opt:[null]},{func:"BG",args:[null],opt:[null]},"ignored","convert","isMatch",{func:"ha",args:[null,P.MN]},{func:"aR",void:true,args:[null,P.MN]},"each","k",{func:"Yz",ret:J.kn,args:[P.jp]},"matched",{func:"Tl",ret:J.bU,args:[J.O]},{func:"Zh",ret:J.Pp,args:[J.O]},"ch",{func:"cd",ret:J.kn,args:[J.bU]},{func:"Dt",ret:J.bU,args:[J.bU]},"digit","part",{func:"GF",ret:J.bU,args:[null,null]},"byteString",{func:"HE",ret:J.bU,args:[J.bU,J.bU]},"byte","buffer","xhr","header","prevValue",F.D13,{func:"vl",ret:[P.b8,V.qC],args:[J.O]},Q.wn,{func:"IqV",ret:{func:"vl",ret:[P.b8,V.qC],args:[J.O]}},{func:"kP",args:[{func:"vl",ret:[P.b8,V.qC],args:[J.O]}]},{func:"ln",ret:Q.wn},{func:"FG",args:[Q.wn]},{func:"uG",void:true,args:[W.Wp]},L.WZq,R.Bc,A.pva,U.rs,{func:"fO",ret:J.O,args:[D.SI]},N.cda,{func:"Fc",ret:O.Qb},{func:"Ke",ret:J.bU,args:[[P.QV,J.bU]]},"color",{func:"S1",void:true,args:[J.bU,J.O,[P.QV,J.bU]]},"classId",{func:"D8",void:true,args:[null,J.bU]},"classList","freeClassId",{func:"XK",ret:[P.QV,J.bU],args:[J.bU]},{func:"D9",ret:J.O,args:[[P.hL,J.bU]]},"point",{func:"Vu",ret:O.uc,args:[[P.hL,J.bU]]},{func:"j4",void:true,args:[J.bU]},"startPage",O.waa,"response","st",G.Vz,{func:"ua",ret:G.Vz},{func:"Ww",args:[G.Vz]},{func:"Sz",void:true,args:[W.ea,null,W.cv]},{func:"Rs",ret:J.kn,args:[P.Z0]},{func:"Xb",args:[P.Z0,J.bU]},{func:"Yi",ret:J.O,args:[J.kn]},"newSpace",K.V4,{func:"iR",args:[J.bU,null]},{func:"xD",ret:P.QV,args:[{func:"pL",args:[J.O]}]},{func:"uj",ret:P.QV,args:[{func:"qt",ret:P.QV,args:[J.O]}]},{func:"pw",void:true,args:[J.kn,null]},"expand",Z.V9,D.t9,J.Pp,G.XN,{func:"nzZ",ret:J.O,args:[G.Y2]},X.V10,D.bv,D.V11,{func:"KD",ret:P.b8,args:[null]},D.V12,D.V13,D.V14,V.qC,D.vT,{func:"c7",ret:V.qC},{func:"JC",args:[V.qC]},D.V15,P.tU,L.Lr,L.V16,"tagProfile",Z.V17,D.U4,{func:"ax",ret:D.U4},{func:"SN",args:[D.U4]},M.V18,"rec",{func:"IM",args:[N.HV]},A.V19,A.V20,A.V21,A.V22,A.V23,A.V24,A.V25,A.V26,G.mL,{func:"ru",ret:G.mL},{func:"pu",args:[G.mL]},V.V27,{func:"Z8",void:true,args:[J.O,null,null]},{func:"Pz",ret:J.O,args:[J.Pp]},{func:"vI",ret:J.O,args:[P.Z0]},"frame",{func:"h6",ret:J.kn,args:[J.O]},A.xc,{func:"B4",args:[P.e4y,P.dl]},{func:"kG",args:[P.dl,P.e4y,P.dl,{func:"Dv",args:[null]}]},{func:"cH",ret:J.bU},{func:"Lc",ret:J.kn,args:[P.a]},{func:"DF",void:true,args:[P.a]},{func:"ZD",args:[[J.Q,G.DA]]},{func:"oe",args:[[J.Q,T.yj]]},"onName","eventType",{func:"rj",void:true,args:[J.O,J.O]},{func:"KTC",void:true,args:[[P.QV,T.yj]]},"changes",{func:"WW",void:true,args:[W.ea]},"pair","p",{func:"YT",void:true,args:[[J.Q,T.yj]]},"d","def",{func:"Zu",args:[J.O,null,null]},"arg0",{func:"PO",ret:U.zX,args:[U.hw,U.hw]},"h","item",3,{func:"Qc",args:[U.hw]},Q.V28,D.rj,[J.Q,D.c2],{func:"c4",ret:D.rj},{func:"PF",args:[D.rj]},{func:"Rb",ret:[J.Q,D.c2]},{func:"mRV",args:[[J.Q,D.c2]]},{func:"Yg",ret:J.O,args:[D.c2]},T.V29,A.x4,U.V30,{func:"nf",ret:D.u0g},{func:"Lr",ret:D.zM},{func:"pDN",ret:[P.QV,D.bv]},{func:"m3",ret:J.Pp},{func:"mV",args:[J.Pp]},"isolateId",[P.Z0,J.O,J.Pp],{func:"zs",ret:J.O,args:[J.O]},"id",{func:"Mg",void:true,args:[D.SI]},"coverage",{func:"EIX",ret:[Q.wn,D.U4]},{func:"P5",args:[[Q.wn,D.U4]]},{func:"Tt",ret:P.Z0},{func:"IQ",args:[P.Z0]},{func:"Kq",ret:D.pD},{func:"UV",args:[D.pD]},"scriptCoverage","timer",[J.Q,D.Z9],{func:"iZ",ret:D.Q4},{func:"F1T",args:[D.Q4]},{func:"H6",ret:J.O,args:[D.kx]},{func:"xE",ret:D.WAE},{func:"Ep",args:[D.WAE]},{func:"qQ",void:true,args:[D.rj]},"script","func",D.fJ,{func:"Q8",ret:D.fJ},{func:"LS",args:[D.fJ]},R.V31,D.hR,{func:"VL",ret:D.hR},{func:"WC",args:[D.hR]},D.V32,{func:"nR",ret:Z.uL},U.V33,Q.Vfx,"details",Q.LPc,K.V34,X.V35,"y",{func:"Vv",ret:J.O,args:[P.a]},{func:"e3",ret:J.O,args:[[J.Q,P.a]]},"values",{func:"PzC",void:true,args:[[J.Q,G.DA]]},{func:"UxH",args:[J.Q]},D.pD,{func:"Af",args:[D.zM]},U.V36,];$=null
+init.functionAliases={Sa:163}
+init.metadata=["sender","e",{func:"pL",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"b1",void:true,args:[{func:"kl",void:true}]},{func:"G5",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.mE]},,"error","stackTrace",{func:"Ib",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.Ij,P.Ij]},{func:"E0",ret:P.a2,args:[P.a,P.a]},{func:"DZ",ret:P.KN,args:[P.a]},{func:"aB",args:[null]},"receiver",{func:"b3",args:[null,null,null,null]},"name","oldValue","newValue","callback","captureThis","self","arguments","o",{func:"ZD",ret:P.a2,args:[P.IN]},"symbol",{func:"qq",ret:[P.cX,K.O1],args:[P.cX]},"iterable","invocation","f",{func:"NT"},{func:"ob",args:[P.EH]},"code",{func:"bh",args:[null,null]},"key",{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"Yv",void:true,args:[null,null,null]},"c",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception","event","obj",{func:"qE",ret:P.qU,args:[P.KN,P.KN]},"row","column",{func:"c3",args:[P.KN,P.KN]},"done",{func:"Wr",ret:[P.b8,D.af],args:[P.qU]},"text","dummy",{func:"Np",void:true,args:[W.ea,null,W.KV]},"detail","target",{func:"Aw",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.mE]},{func:"BG",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},"_",{func:"Cm",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.mE]},{func:"aR",void:true,args:[null,P.mE]},"arg","each",{func:"lv",args:[P.IN,null]},{func:"jK",ret:P.KN,args:[P.qU]},{func:"cS",ret:P.CP,args:[P.qU]},"xhr",{func:"QO",void:true,args:[W.Oq]},"result",{func:"fK",args:[D.af]},{func:"XG",ret:O.Hz},"response",{func:"Q5",args:[D.vO]},"st",{func:"Sz",void:true,args:[W.ea,null,W.h4]},{func:"xo",ret:P.qU,args:[P.a2]},"newSpace",{func:"vO",args:[P.KN]},{func:"iR",args:[P.KN,null]},{func:"xD",ret:P.cX,args:[{func:"pL",args:[P.qU]}]},{func:"Qd",ret:P.cX,args:[{func:"uW",ret:P.cX,args:[P.qU]}]},{func:"S0",void:true,args:[P.a2,null]},"expand",{func:"KDY",ret:[P.b8,D.af],args:[null]},{func:"Df",ret:P.qU,args:[G.Y2]},"m",{func:"fnh",ret:P.b8,args:[null]},"tagProfile",{func:"le",ret:P.qU,args:[P.CP]},"time",{func:"h6",ret:P.a2,args:[P.qU]},"type","s",{func:"DF",void:true,args:[P.a]},"records",{func:"kk",args:[L.Tv,null]},{func:"qx",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"WW",void:true,args:[W.ea]},"i","changes","model","node","oneTime",{func:"cq",args:[null,null,null]},{func:"YT",void:true,args:[[P.WO,T.yj]]},"jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},"k","v",{func:"oe",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.hw,U.hw]},{func:"qo",args:[U.hw]},{func:"Yg",ret:P.qU,args:[D.c2]},"line","map",{func:"JC",args:[V.qC]},{func:"If",ret:P.qU,args:[P.qU]},"id",{func:"rl",ret:P.b8},{func:"a0",void:true,args:[D.vO]},"coverage","scriptCoverage","timer",{func:"I0",ret:P.qU},{func:"xA",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func","msg","details","x",{func:"K7",void:true,args:[[P.WO,G.DA]]},"splices",{func:"Vv",ret:P.qU,args:[P.a]},{func:"e3",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"vl",ret:[P.b8,V.qC],args:[P.qU]},];$=null
 I = I.$finishIsolateConstructor(I)
 $=new I()
-function convertToFastObject(properties) {
-  function MyClass() {};
-  MyClass.prototype = properties;
-  new MyClass();
-  return properties;
-}
+function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
+new MyClass()
+return a}
 A = convertToFastObject(A)
 B = convertToFastObject(B)
 C = convertToFastObject(C)
@@ -17978,35 +17494,11 @@
 init.isolateTag=v
 break}}}()
 init.dispatchPropertyName=init.getIsolateTag("dispatch_record")
-;(function (callback) {
-  if (typeof document === "undefined") {
-    callback(null);
-    return;
-  }
-  if (document.currentScript) {
-    callback(document.currentScript);
-    return;
-  }
-
-  var scripts = document.scripts;
-  function onLoad(event) {
-    for (var i = 0; i < scripts.length; ++i) {
-      scripts[i].removeEventListener("load", onLoad, false);
-    }
-    callback(event.target);
-  }
-  for (var i = 0; i < scripts.length; ++i) {
-    scripts[i].addEventListener("load", onLoad, false);
-  }
-})(function(currentScript) {
-  init.currentScript = currentScript;
-
-  if (typeof dartMainRunner === "function") {
-    dartMainRunner((function(a){H.oT(E.KU(),a)}), []);
-  } else {
-    (function(a){H.oT(E.KU(),a)})([]);
-  }
-})
+;(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.Tb(),b)},[])}else{(function(b){H.wW(E.Tb(),b)})([])}})
 function init(){I.p={}
 function generateAccessor(a,b,c){var y=a.split("-")
 var x=y[0]
@@ -18063,7 +17555,7 @@
 var t=[]}for(var s in a){if(w.call(a,s)){var r=a[s]
 if(r instanceof Array)r=r[1]
 var q=r["^"],p,o=s,n=q
-if(typeof q=="object"&&q instanceof Array){q=n=q[0]}if(typeof q=="string"){var m=q.split("/")
+if(typeof q=="string"){var m=q.split("/")
 if(m.length==2){o=m[0]
 n=m[1]}}var l=n.split(";")
 n=l[1]==""?[]:l[1].split(",")
@@ -18083,8 +17575,7 @@
 var r=a[s]
 var f=b
 if(r instanceof Array){f=r[0]||b
-r=r[1]}g["@"]=r
-x[s]=g
+r=r[1]}x[s]=g
 f[s]=g}v=null
 var e={}
 init.interceptorsByTag=Object.create(null)
@@ -18107,9 +17598,7 @@
 for(var a6=0;a6<a7.length;a6++){var a8=x[a7[a6]]
 a8.$nativeSuperclassTag=a5[0]}}for(a6=0;a6<a5.length;a6++){init.interceptorsByTag[a5[a6]]=a1
 init.leafTags[a5[a6]]=false}}}}for(var s in y)finishClass(s)}
-I.$lazy=function(a,b,c,d,e){if(!init.lazies)init.lazies={}
-init.lazies[c]=d
-var y={}
+I.$lazy=function(a,b,c,d,e){var y={}
 var x={}
 a[c]=y
 a[d]=function(){var w=$[c]
@@ -18123,6 +17612,6 @@
 Isolate.prototype.constructor=Isolate
 Isolate.p=y
 Isolate.$finishClasses=a.$finishClasses
-Isolate.makeConstantList=a.makeConstantList
+Isolate.ko=a.ko
 return Isolate}}
 })()
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/browser/interop.js b/runtime/bin/vmservice/client/deployed/web/packages/browser/interop.js
index d7c7de6..ec02e58 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/browser/interop.js
+++ b/runtime/bin/vmservice/client/deployed/web/packages/browser/interop.js
@@ -2,9 +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.
 
-// Type for remote proxies to Dart objects with dart2js.
-// WARNING: do not call this constructor or rely on it being
-// in the global namespace, as it may be removed.
-function DartObject(o) {
-  this.o = o;
+// TODO(jmesserly): remove this script after a deprecation period.
+if (typeof console == "object" && typeof console.warn == "function") {
+  console.warn('<script src="packages/browser/interop.js"> is no longer ' +
+      'needed for dart:js. See http://pub.dartlang.org/packages/browser.');
 }
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html
index 03550ef..ee101d2 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/elements.html
@@ -17,6 +17,7 @@
   <link rel="import" href="src/elements/function_ref.html">
   <link rel="import" href="src/elements/function_view.html">
   <link rel="import" href="src/elements/heap_map.html">
+  <link rel="import" href="src/elements/io_view.html">
   <link rel="import" href="src/elements/isolate_ref.html">
   <link rel="import" href="src/elements/isolate_summary.html">
   <link rel="import" href="src/elements/isolate_view.html">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html
index 7c1974f..fa691cb 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/action_link.html
@@ -22,5 +22,5 @@
     </template>
 
   </template>
-  <script type="application/dart" src="action_link.dart"></script>
+  <script type="application/dart;component=1" src="action_link.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
index 5068ea7..3fbb4c0 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/breakpoint_list.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="breakpoint-list" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
@@ -26,5 +26,5 @@
       </ul>
     </template>
   </template>
-  <script type="application/dart" src="breakpoint_list.dart"></script>
+  <script type="application/dart;component=1" src="breakpoint_list.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html
index 62020db..043ecce 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_ref.html
@@ -3,7 +3,7 @@
 </head>
 <polymer-element name="class-ref" extends="service-ref">
 
-<template><link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+<template><link rel="stylesheet" href="css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
-<script type="application/dart" src="class_ref.dart"></script>
+<script type="application/dart;component=1" src="class_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
index 89e557c..79ccf65 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
@@ -12,7 +12,7 @@
 </head>
 <polymer-element name="class-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
@@ -147,5 +147,5 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart" src="class_view.dart"></script>
+  <script type="application/dart;component=1" src="class_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
index 368a0ac..f18b3ca 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_ref.html
@@ -3,7 +3,7 @@
 </head>
 <polymer-element name="code-ref" extends="service-ref">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <template if="{{ code.isDartCode }}">
         <template if="{{ code.isOptimized }}">
           <a href="{{ url }}">*{{ name }}</a>
@@ -16,5 +16,5 @@
       <span>{{ name }}</span>
     </template>
   </template>
-<script type="application/dart" src="code_ref.dart"></script>
+<script type="application/dart;component=1" src="code_ref.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
index a0a7297..a40131f 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/code_view.html
@@ -5,7 +5,7 @@
 <link rel="import" href="script_ref.html">
 <polymer-element name="code-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <style>
       div.flex-row:hover {
         background-color: #FFF3E3;
@@ -162,5 +162,5 @@
       </template>
     </div>
   </template>
-  <script type="application/dart" src="code_view.dart"></script>
+  <script type="application/dart;component=1" src="code_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/collapsible_content.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/collapsible_content.html
index 035e312..2e2f371 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/collapsible_content.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/collapsible_content.html
@@ -13,5 +13,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart" src="collapsible_content.dart"></script>
+  <script type="application/dart;component=1" src="collapsible_content.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/curly_block.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/curly_block.html
index d105267..16f3270 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/curly_block.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/curly_block.html
@@ -36,5 +36,5 @@
       </template>
     </template>
   </template>
-  <script type="application/dart" src="curly_block.dart"></script>
+  <script type="application/dart;component=1" src="curly_block.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
index 878a0ec..9f5de00 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/error_view.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="error-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
@@ -14,5 +14,5 @@
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
-  <script type="application/dart" src="error_view.dart"></script>
+  <script type="application/dart;component=1" src="error_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html
index 7d4d50b..add16d3 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_box.html
@@ -83,4 +83,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart" src="eval_box.dart"></script>
+<script type="application/dart;component=1" src="eval_box.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_link.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_link.html
index 8de2c84..dcc7746 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_link.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/eval_link.html
@@ -15,15 +15,15 @@
     </style>
 
     <template if="{{ busy }}">
-      <span class="busy">[evaluate]</span>
+      <span class="busy">{{ label }}</span>
     </template>
     <template if="{{ !busy }}">
-      <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
+      <span class="idle"><a on-click="{{ evalNow }}">{{ label }}</a></span>
     </template>
     <template if="{{ result != null }}">
       = <instance-ref ref="{{ result }}"></instance-ref>
     </template>
 
   </template>
-  <script type="application/dart" src="eval_link.dart"></script>
+  <script type="application/dart;component=1" src="eval_link.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html
index 36d4dd3..ebf0a1e 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_ref.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="field-ref" extends="service-ref">
   <template>
-  <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+  <link rel="stylesheet" href="css/shared.css">
     <div>
       <template if="{{ ref['static'] }}">static</template>
       <template if="{{ ref['final'] }}">final</template>
@@ -20,5 +20,5 @@
       <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
     </div>
   </template>
-  <script type="application/dart" src="field_ref.dart"></script>
+  <script type="application/dart;component=1" src="field_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
index 7058f36..ead150d 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/field_view.html
@@ -8,7 +8,7 @@
 </head>
 <polymer-element name="field-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
@@ -90,5 +90,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart" src="field_view.dart"></script>
+  <script type="application/dart;component=1" src="field_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html
index aeb09c5..e29c2b0 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_ref.html
@@ -3,7 +3,7 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="function-ref" extends="service-ref">
-  <template><link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css" /><!-- These comments are here to allow newlines.
+  <template><link rel="stylesheet" href="css/shared.css" /><!-- These comments are here to allow newlines.
      --><template if="{{ isDart }}"><!--
        --><template if="{{ qualified && !hasParent && hasClass }}"><!--
        --><class-ref ref="{{ ref['owner'] }}"></class-ref>.</template><!--
@@ -12,5 +12,5 @@
           </function-ref>.<!--
      --></template><a href="{{ url }}">{{ name }}</a><!--
   --></template><template if="{{ !isDart }}"><span> {{ name }}</span></template></template>
-<script type="application/dart" src="function_ref.dart"></script>
+<script type="application/dart;component=1" src="function_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
index aba3443..137b065 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/function_view.html
@@ -10,7 +10,7 @@
 </head>
 <polymer-element name="function-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu>
@@ -115,5 +115,5 @@
 
     <br>
   </template>
-  <script type="application/dart" src="function_view.dart"></script>
+  <script type="application/dart;component=1" src="function_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
index 984ce06..dfe2797 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_map.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="heap-map" extends="observatory-element">
 <template>
-  <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+  <link rel="stylesheet" href="css/shared.css">
   <style>
     .hover {
       position: fixed;
@@ -35,5 +35,5 @@
     <canvas id="fragmentation" width="1px" height="1px"></canvas>
   </div>
 </template>
-<script type="application/dart" src="heap_map.dart"></script>
+<script type="application/dart;component=1" src="heap_map.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
index 087849b..4454a82 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/heap_profile.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="heap-profile" extends="observatory-element">
 <template>
-  <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+  <link rel="stylesheet" href="css/shared.css">
   <style>
     .table {
       border-collapse: collapse!important;
@@ -116,5 +116,5 @@
     </table>
   </div>
 </template>
-<script type="application/dart" src="heap_profile.dart"></script>
+<script type="application/dart;component=1" src="heap_profile.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
index e74dfdb..6627285 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_ref.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <style>
       .errorBox {
         background-color: #f5f5f5;
@@ -85,5 +85,5 @@
       </template>
     </span>
   </template>
-  <script type="application/dart" src="instance_ref.dart"></script>
+  <script type="application/dart;component=1" src="instance_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
index 3ff1251..bdf61c8 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/instance_view.html
@@ -11,7 +11,7 @@
 </head>
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ instance.isolate }}"></isolate-nav-menu>
@@ -55,7 +55,38 @@
           <div class="memberItem">
             <div class="memberName">retained size</div>
             <div class="memberValue">
-              <eval-link callback="{{ retainedSize }}"></eval-link>
+              <eval-link callback="{{ retainedSize }}"
+                         label="[calculate]">
+              </eval-link>
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">retaining path</div>
+            <div class="memberValue">
+              <template if="{{ path == null }}">
+                <eval-link callback="{{ retainingPath }}"
+                           label="[find]"
+                           expr="10">
+                </eval-link>
+              </template>
+              <template if="{{ path != null }}">
+                <template repeat="{{ element in path['elements'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ element['index']}}]</div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                  </div>
+                  </div>
+                </template>
+                <template if="{{ path['length'] > path['elements'].length }}">
+                  showing {{ path['elements'].length }} of {{ path['length'] }}
+                  <eval-link
+                    callback="{{ retainingPath }}"
+                    label="[find more]"
+                    expr="{{ path['elements'].length * 2 }}">
+                  </eval-link>
+                </template>
+              </template>
             </div>
           </div>
           <template if="{{ instance['type_class'] != null }}">
@@ -148,7 +179,8 @@
       </div>
       <br><br><br><br>
       <br><br><br><br>
+
     </template>
   </template>
-  <script type="application/dart" src="instance_view.dart"></script>
+  <script type="application/dart;component=1" src="instance_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
index fe8ddb9..7975491 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_profile.html
@@ -7,7 +7,7 @@
 </head>
 <polymer-element name="isolate-profile" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
@@ -186,5 +186,5 @@
       </table>
     </div>
   </template>
-  <script type="application/dart" src="isolate_profile.dart"></script>
+  <script type="application/dart;component=1" src="isolate_profile.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html
index ff46718..b2858d2 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_ref.html
@@ -2,8 +2,8 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="isolate-ref" extends="service-ref">
-<template><link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+<template><link rel="stylesheet" href="css/shared.css">
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
-<script type="application/dart" src="isolate_ref.dart"></script>
+<script type="application/dart;component=1" src="isolate_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
index e19fbe4..8968df2 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_summary.html
@@ -8,10 +8,10 @@
 </head>
 <polymer-element name="isolate-summary" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <div class="flex-row">
       <div class="flex-item-10-percent">
-        <img src="../../../../packages/observatory/src/elements/img/isolate_icon.png">
+        <img src="img/isolate_icon.png">
       </div>
       <div class="flex-item-10-percent">
         <isolate-ref ref="{{ isolate }}"></isolate-ref>
@@ -110,7 +110,7 @@
         white-space: pre;
       }
     </style>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <template if="{{ isolate.error != null }}">
       <div class="content-centered">
         <pre class="errorBox">{{ isolate.error.message }}</pre>
@@ -124,47 +124,52 @@
         <isolate-counter-chart counters="{{ isolate.counters }}"></isolate-counter-chart>
       </div>
       <div class="flex-item-40-percent">
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberName">new heap</div>
-              <div class="memberValue">
-                {{ isolate.newHeapUsed | formatSize }}
-                of
-                {{ isolate.newHeapCapacity | formatSize }}
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberName">old heap</div>
-              <div class="memberValue">
-                {{ isolate.oldHeapUsed | formatSize }}
-                of
-                {{ isolate.oldHeapCapacity | formatSize }}
-              </div>
-            </div>
-          </div>
-          <br>
+        <div class="memberList">
           <div class="memberItem">
+            <div class="memberName">new heap</div>
             <div class="memberValue">
-              See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+              {{ isolate.newHeapUsed | formatSize }}
+              of
+              {{ isolate.newHeapCapacity | formatSize }}
             </div>
           </div>
           <div class="memberItem">
+            <div class="memberName">old heap</div>
             <div class="memberValue">
-              See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+              {{ isolate.oldHeapUsed | formatSize }}
+              of
+              {{ isolate.oldHeapCapacity | formatSize }}
             </div>
           </div>
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
-              </div>
+        </div>
+        <br>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+          </div>
+        </div>
+        <template if="{{ isolate.ioEnabled }}">
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('io') }}">dart:io</a>
             </div>
           </div>
+        </template>
       </div>
       <div class="flex-item-10-percent">
       </div>
@@ -178,4 +183,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart" src="isolate_summary.dart"></script>
+<script type="application/dart;component=1" src="isolate_summary.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
index e829a4c..f7ab7a8 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/isolate_view.html
@@ -12,7 +12,7 @@
 </head>
 <polymer-element name="isolate-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <style>
       .sourceInset {
         padding-left: 15%;
@@ -137,5 +137,5 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart" src="isolate_view.dart"></script>
+  <script type="application/dart;component=1" src="isolate_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html
index f7e42ff..100bcc3 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/json_view.html
@@ -7,5 +7,5 @@
     </nav-bar>
       <pre>{{ mapAsString }}</pre>
   </template>
-  <script type="application/dart" src="json_view.dart"></script>
+  <script type="application/dart;component=1" src="json_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
index 74e2d29..20242ba 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_ref.html
@@ -2,7 +2,7 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="library-ref" extends="service-ref">
-<template><link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+<template><link rel="stylesheet" href="css/shared.css">
   <template if="{{ nameIsEmpty }}">
     <a href="{{ url }}">unnamed</a>
   </template>
@@ -10,5 +10,5 @@
     <a href="{{ url }}">{{ name }}</a>
   </template>
 </template>
-<script type="application/dart" src="library_ref.dart"></script>
+<script type="application/dart;component=1" src="library_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
index 6abf998..f525cc2 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/library_view.html
@@ -12,7 +12,7 @@
 </head>
 <polymer-element name="library-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
 
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -137,5 +137,5 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart" src="library_view.dart"></script>
+  <script type="application/dart;component=1" src="library_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
index 34d7461..bac4f72 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/nav_bar.html
@@ -4,7 +4,7 @@
 
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <style>
       nav {
         position: fixed;
@@ -209,4 +209,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart" src="nav_bar.dart"></script>
+<script type="application/dart;component=1" src="nav_bar.dart"></script>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_application.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_application.html
index 58f3d54..9b77f24 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_application.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_application.html
@@ -1,11 +1,10 @@
 <head>
-  <link rel="import" href="isolate_profile.html">
-  <link rel="import" href="response_viewer.html">
   <link rel="import" href="observatory_element.html">
+  <link rel="import" href="response_viewer.html">
 </head>
 <polymer-element name="observatory-application" extends="observatory-element">
   <template>
-    <response-viewer app="{{ app }}"></response-viewer>
+    <response-viewer app="{{ this.app }}"></response-viewer>
   </template>
-  <script type="application/dart" src="observatory_application.dart"></script>
+  <script type="application/dart;component=1" src="observatory_application.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_element.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_element.html
index 8a24a8c..c825782 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_element.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/observatory_element.html
@@ -1,3 +1,3 @@
 <polymer-element name="observatory-element">
-  <script type="application/dart" src="observatory_element.dart"></script>
+  <script type="application/dart;component=1" src="observatory_element.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/response_viewer.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/response_viewer.html
index 230120a..0ab71dc 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/response_viewer.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/response_viewer.html
@@ -6,5 +6,5 @@
   <template>
     <service-view object="{{ app.response }}"></service-view>
   </template>
-  <script type="application/dart" src="response_viewer.dart"></script>
+  <script type="application/dart;component=1" src="response_viewer.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html
index e4023b4..af4e478 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_inset.html
@@ -44,5 +44,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart" src="script_inset.dart"></script>
+  <script type="application/dart;component=1" src="script_inset.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html
index ad5f727..9f4445c 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_ref.html
@@ -4,8 +4,8 @@
 </head>
 <polymer-element name="script-ref" extends="service-ref">
 <template>
-  <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+  <link rel="stylesheet" href="css/shared.css">
   <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
-<script type="application/dart" src="script_ref.dart"></script>
+<script type="application/dart;component=1" src="script_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
index bc0d5d1..9876a42 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/script_view.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="script-view" extends="observatory-element">
 <template>
-  <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+  <link rel="stylesheet" href="css/shared.css">
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
@@ -25,5 +25,5 @@
   <h1>script {{ script.name }}</h1>
   </script-inset>
 </template>
-<script type="application/dart" src="script_view.dart"></script>
+<script type="application/dart;component=1" src="script_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
index a45c081..da7f132 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_error_view.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="service-error-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
@@ -14,5 +14,5 @@
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
-  <script type="application/dart" src="service_error_view.dart"></script>
+  <script type="application/dart;component=1" src="service_error_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
index b3d9c62..709e41f 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_exception_view.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="service-exception-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
@@ -17,5 +17,5 @@
       </template>
     </div>
   </template>
-  <script type="application/dart" src="service_exception_view.dart"></script>
+  <script type="application/dart;component=1" src="service_exception_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_ref.html
index 1818675..d5efab1 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_ref.html
@@ -2,5 +2,5 @@
   <link rel="import" href="observatory_element.html">
 </head>
 <polymer-element name="service-ref" extends="observatory-element">
-  <script type="application/dart" src="service_ref.dart"></script>
+  <script type="application/dart;component=1" src="service_ref.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_view.html
index 22b3b98..1a12e6d 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/service_view.html
@@ -18,5 +18,5 @@
 <polymer-element name="service-view" extends="observatory-element">
   <!-- This element explicitly manages the child elements to avoid setting
        an observable property on the old element to an invalid type. -->
-  <script type="application/dart" src="service_view.dart"></script>
+  <script type="application/dart;component=1" src="service_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/sliding_checkbox.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/sliding_checkbox.html
index 80f39aa..760fb65 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/sliding_checkbox.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/sliding_checkbox.html
@@ -83,5 +83,5 @@
       </label>
     </div>
   </template>
-  <script type="application/dart" src="sliding_checkbox.dart"></script>
+  <script type="application/dart;component=1" src="sliding_checkbox.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html
index cbb9b21..2691125 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_frame.html
@@ -7,7 +7,7 @@
 </head>
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <div class="flex-row">
       <div class="flex-item-fixed-1-12">
       </div>
@@ -37,5 +37,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart" src="stack_frame.dart"></script>
+  <script type="application/dart;component=1" src="stack_frame.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
index 13ad0a5..132a486 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/stack_trace.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="stack-trace" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
@@ -27,5 +27,5 @@
       </ul>
     </template>
   </template>
-  <script type="application/dart" src="stack_trace.dart"></script>
+  <script type="application/dart;component=1" src="stack_trace.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html
index f2d7f5c..75d1507 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_ref.html
@@ -2,8 +2,8 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="vm-ref" extends="service-ref">
-<template><link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+<template><link rel="stylesheet" href="css/shared.css">
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
-<script type="application/dart" src="vm_ref.dart"></script>
+<script type="application/dart;component=1" src="vm_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html
index 25cae37..448d8f4 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/vm_view.html
@@ -10,7 +10,7 @@
 </head>
 <polymer-element name="vm-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="../../../../packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -51,5 +51,5 @@
       </template>
     </ul>
   </template>
-  <script type="application/dart" src="vm_view.dart"></script>
+  <script type="application/dart;component=1" src="vm_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/boot.js b/runtime/bin/vmservice/client/deployed/web/packages/polymer/boot.js
index d4a0f8f..a4a148e 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/polymer/boot.js
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/boot.js
@@ -1,11 +1,148 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+/// Bootstrap to initialize polymer applications. This library is will be
+/// replaced by boot.dart in the near future (see dartbug.com/18007).
+///
+/// This script contains logic to bootstrap polymer apps during development. It
+/// internally discovers special Dart script tags through HTML imports, and
+/// constructs a new entrypoint for the application that is then launched in an
+/// isolate.
+///
+/// For each script tag found, we will load the corresponding Dart library and
+/// execute all methods annotated with `@initMethod` and register all classes
+/// labeled with `@CustomTag`. We keep track of the order of imports and execute
+/// initializers in the same order.
+///
+/// All polymer applications use this bootstrap logic. It is included
+/// automatically when you include the polymer.html import:
+///
+///    <link rel="import" href="packages/polymer/polymer.html">
+///
+/// There are two important changes compared to previous versions of polymer
+/// (0.10.0-pre.6 and older):
+///
+///   * Use 'application/dart;component=1' instead of 'application/dart':
+///   Dartium already limits to have a single script tag per document, but it
+///   will be changing semantics soon and make them even stricter. Multiple
+///   script tags are not going to be running on the same isolate after this
+///   change. For polymer applications we'll use a parameter on the script tags
+///   mime-type to prevent Dartium from loading them separately. Instead this
+///   bootstrap script combines those special script tags and creates the
+///   application Dartium needs to run.
+///
+//    If you had:
+///
+///      <polymer-element name="x-foo"> ...
+///      <script type="application/dart" src="x_foo.dart'></script>
+///
+///   Now you need to write:
+///
+///      <polymer-element name="x-foo"> ...
+///      <script type="application/dart;component=1" src="x_foo.dart'></script>
+///
+///   * `initPolymer` is gone: we used to initialize applications in two
+///   possible ways: using `init.dart` or invoking initPolymer in your main. Any
+///   of these initialization patterns can be replaced to use an `@initMethod`
+///   instead. For example, If you need to run some initialization code before
+///   any other code is executed, include a "application/dart;component=1"
+///   script tag that contains an initializer method with the body of your old
+///   main, and make sure this tag is placed above other html-imports that load
+///   the rest of the application. Initialization methods are executed in the
+///   order in which they are discovered in the HTML document.
 (function() {
-  console.error('"boot.js" is now deprecated. Instead, you can initialize '
-    + 'your polymer application by adding the following tags: \'' +
-    + '<script type="application/dart">export "package:polymer/init.dart";'
-    + '</script><script src="packages/browser/dart.js"></script>\'. '
-    + 'Make sure these script tags come after all HTML imports.');
+  // Only run in Dartium.
+  if (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.
+  function getScriptUrl(script) {
+    var url = script.src;
+    if (url) {
+      // Normalize package: urls
+      var index = url.indexOf('packages/');
+      if (index == 0 || (index > 0 && url[index - 1] == '/')) {
+        url = "package:" + url.slice(index + 9);
+      }
+      return url;
+    }
+
+    // TODO(sigmund): change back to application/dart: using application/json is
+    // wrong but it hides a warning in Dartium (dartbug.com/18000).
+    return "data:application/json;base64," + window.btoa(script.textContent);
+  }
+
+  // Creates a Dart program that imports [urls] and passes them to
+  // startPolymerInDevelopment, which in turn will invoke methods marked with
+  // @initMethod, and register any custom tag labeled with @CustomTag in those
+  // libraries.
+  function createMain(urls, mainUrl) {
+    var imports = Array(urls.length + 1);
+    for (var i = 0; i < urls.length; ++i) {
+      imports[i] = 'import "' + urls[i] + '" as i' + i + ';';
+    }
+    imports[urls.length] = 'import "package:polymer/src/mirror_loader.dart";';
+    var arg = urls.length == 0 ? '[]' :
+        ('[\n      "' + urls.join('",\n      "') + '"\n     ]');
+    return (imports.join('\n') +
+        '\n\nmain() {\n' +
+        '  startPolymerInDevelopment(' + arg + ');\n' +
+        '}\n');
+  }
+
+  function discoverScripts(content, state) {
+    if (!state) {
+      // internal state tracking documents we've visited, the resulting list of
+      // scripts, and any tags with the incorrect mime-type.
+      state = {seen: {}, scripts: [], badTags: []};
+    }
+    if (!content) return state;
+
+    // Note: we visit both script and link-imports together to ensure we
+    // preserve the order of the script tags as they are discovered.
+    var nodes = content.querySelectorAll('script,link[rel="import"]');
+    for (var i = 0; i < nodes.length; i++) {
+      var node = nodes[i];
+      if (node instanceof HTMLLinkElement) {
+        // TODO(jmesserly): figure out why ".import" fails in content_shell but
+        // works in Dartium.
+        if (node.import && node.import.href) node = node.import;
+
+        if (state.seen[node.href]) continue;
+        state.seen[node.href] = node;
+        discoverScripts(node.import, state);
+      } else if (node instanceof HTMLScriptElement) {
+        if (node.type == 'application/dart;component=1') {
+          state.scripts.push(getScriptUrl(node));
+        }
+        if (node.type == 'application/dart') {
+          state.badTags.push(node);
+        }
+      }
+    }
+    return state;
+  }
+
+  // TODO(jmesserly): we're using this function because DOMContentLoaded can
+  // be fired too soon: https://www.w3.org/Bugs/Public/show_bug.cgi?id=23526
+  HTMLImports.whenImportsReady(function() {
+    // Append a new script tag that initializes everything.
+    var newScript = document.createElement('script');
+    newScript.type = "application/dart";
+
+    var results = discoverScripts(document);
+    if (results.badTags.length > 0) {
+      console.warn('Dartium currently only allows a single Dart script tag '
+        + 'per application, and in the future it will run them in '
+        + 'separtate isolates.  To prepare for this all the following '
+        + 'script tags need to be updated to use the mime-type '
+        + '"application/dart;component=1" instead of "application/dart":');
+      for (var i = 0; i < results.badTags.length; i++) {
+        console.warn(results.badTags[i]);
+      }
+    }
+    newScript.textContent = createMain(results.scripts);
+    document.body.appendChild(newScript);
+  });
 })();
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/polymer.html b/runtime/bin/vmservice/client/deployed/web/packages/polymer/polymer.html
new file mode 100644
index 0000000..5cbaf79
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/polymer.html
@@ -0,0 +1,32 @@
+<!--
+ 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.
+-->
+
+<script src="src/js/use_native_dartium_shadowdom.js"></script>
+
+<!--
+These two files are from the Polymer project:
+https://github.com/Polymer/platform/ and https://github.com/Polymer/polymer/.
+
+You can replace platform.js and polymer.html with different versions if desired.
+-->
+<!-- minified for deployment: -->
+<script src="../../packages/web_components/platform.js"></script>
+<link rel="import" href="src/js/polymer/polymer.html">
+
+<!-- unminfied for debugging:
+<script src="../../packages/web_components/platform.concat.js"></script>
+<script src="src/js/polymer/polymer.concat.js"></script>
+<link rel="import" href="src/js/polymer/polymer-body.html">
+-->
+
+<!-- Teach dart2js about Shadow DOM polyfill objects. -->
+<script src="../../packages/web_components/dart_support.js"></script>
+
+<!-- Bootstrap the user application in a new isolate. -->
+<script src="boot.js"></script>
+<!-- TODO(sigmund): replace boot.js by boot.dart (dartbug.com/18007)
+<script type="application/dart">export "package:polymer/boot.dart";</script>
+ -->
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/AUTHORS b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/AUTHORS
new file mode 100644
index 0000000..0617765
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/AUTHORS
@@ -0,0 +1,9 @@
+# Names should be added to this file with this pattern:
+#
+# For individuals:
+#   Name <email address>
+#
+# For organizations:
+#   Organization <fnmatch pattern>
+#
+Google Inc. <*@google.com>
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/CONTRIBUTING.md b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/CONTRIBUTING.md
new file mode 100644
index 0000000..1de2f34
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/CONTRIBUTING.md
@@ -0,0 +1,73 @@
+# Contributing
+
+Want to contribute to Polymer? Great!
+
+We are more than happy to accept external contributions to the project in the form of [feedback](https://groups.google.com/forum/?fromgroups=#!forum/polymer-dev), [bug reports](../../issues), and pull requests.
+
+## Contributor License Agreement
+
+Before we can accept patches, there's a quick web form you need to fill out.
+
+- If you're contributing as an individual (e.g. you own the intellectual property), fill out [this form](http://code.google.com/legal/individual-cla-v1.0.html).
+- If you're contributing under a company, fill out [this form](http://code.google.com/legal/corporate-cla-v1.0.html) instead.
+
+This CLA asserts that contributions are owned by you and that we can license all work under our [license](LICENSE).
+
+Other projects require a similar agreement: jQuery, Firefox, Apache, Node, and many more.
+
+[More about CLAs](https://www.google.com/search?q=Contributor%20License%20Agreement)
+
+## Initial setup
+
+Here's an easy guide that should get you up and running:
+
+1. Setup Grunt: `sudo npm install -g grunt-cli`
+1. Fork the project on github and pull down your copy.
+   > replace the {{ username }} with your username and {{ repository }} with the repository name
+
+        git clone git@github.com:{{ username }}/{{ repository }}.git --recursive
+
+    Note the `--recursive`. This is necessary for submodules to initialize properly. If you don't do a recursive clone, you'll have to init them manually:
+
+        git submodule init
+        git submodule update
+
+    Download and run the `pull-all.sh` script to install the sibling dependencies.
+
+        git clone git://github.com/Polymer/tools.git && tools/bin/pull-all.sh
+
+1. Test your change
+   > in the repo you've made changes to, run the tests:
+
+        cd $REPO
+        npm install
+        grunt test
+
+1. Commit your code and make a pull request.
+
+That's it for the one time setup. Now you're ready to make a change.
+
+## Submitting a pull request
+
+We iterate fast! To avoid potential merge conflicts, it's a good idea to pull from the main project before making a change and submitting a pull request. The easiest way to do this is setup a remote called `upstream` and do a pull before working on a change:
+
+    git remote add upstream git://github.com/Polymer/{{ repository }}.git
+
+Then before making a change, do a pull from the upstream `master` branch:
+
+    git pull upstream master
+
+To make life easier, add a "pull upstream" alias in your `.gitconfig`:
+
+    [alias]
+      pu = !"git fetch origin -v; git fetch upstream -v; git merge upstream/master"
+
+That will pull in changes from your forked repo, the main (upstream) repo, and merge the two. Then it's just a matter of running `git pu` before a change and pushing to your repo:
+
+    git checkout master
+    git pu
+    # make change
+    git commit -a -m 'Awesome things.'
+    git push
+
+Lastly, don't forget to submit the pull request.
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/LICENSE b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/LICENSE
new file mode 100644
index 0000000..95987ba
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/LICENSE
@@ -0,0 +1,27 @@
+// Copyright (c) 2014 The Polymer 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/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/PATENTS b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/PATENTS
new file mode 100644
index 0000000..e120963
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/PATENTS
@@ -0,0 +1,23 @@
+Additional IP Rights Grant (Patents)
+
+"This implementation" means the copyrightable works distributed by
+Google as part of the Polymer project.
+
+Google hereby grants to You a perpetual, worldwide, non-exclusive,
+no-charge, royalty-free, irrevocable (except as stated in this section)
+patent license to make, have made, use, offer to sell, sell, import,
+transfer and otherwise run, modify and propagate the contents of this
+implementation of Polymer, where such license applies only to those
+patent claims, both currently owned or controlled by Google and acquired
+in the future, licensable by Google that are necessarily infringed by
+this implementation of Polymer.  This grant does not include claims
+that would be infringed only as a consequence of further modification of
+this implementation.  If you or your agent or exclusive licensee
+institute or order or agree to the institution of patent litigation
+against any entity (including a cross-claim or counterclaim in a
+lawsuit) alleging that this implementation of Polymer or any code
+incorporated within this implementation of Polymer constitutes
+direct or contributory patent infringement, or inducement of patent
+infringement, then any patent rights granted to you under this License
+for this implementation of Polymer shall terminate as of the date
+such litigation is filed.
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/README.md b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/README.md
new file mode 100644
index 0000000..2d54458
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/README.md
@@ -0,0 +1,17 @@
+# Polymer
+
+[![Analytics](https://ga-beacon.appspot.com/UA-39334307-2/Polymer/polymer/README)](https://github.com/igrigorik/ga-beacon)
+
+Build Status: [http://build.chromium.org/p/client.polymer/waterfall](http://build.chromium.org/p/client.polymer/waterfall)
+
+## Brief Overview
+
+For more detailed info goto [http://polymer-project.org/](http://polymer-project.org/).
+
+Polymer is a new type of library for the web, designed to leverage the existing browser infrastructure to provide the encapsulation and extendability currently only available in JS libraries.
+
+Polymer is based on a set of future technologies, including [Shadow DOM](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html), [Custom Elements](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html) and Model Driven Views. Currently these technologies are implemented as polyfills or shims, but as browsers adopt these features natively, the platform code that drives Polymer evacipates, leaving only the value-adds.
+
+## Tools & Testing
+
+For running tests or building minified files, consult the [tooling information](http://polymer-project.org/tooling-strategy.html).
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/bower.json b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/bower.json
new file mode 100644
index 0000000..816d40a
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/bower.json
@@ -0,0 +1,20 @@
+{
+  "name": "polymer",
+  "description": "Polymer is a new type of library for the web, built on top of Web Components, and designed to leverage the evolving web platform on modern browsers.",
+  "homepage": "http://www.polymer-project.org/",
+  "keywords": [
+    "util",
+    "client",
+    "browser",
+    "web components",
+    "web-components"
+  ],
+  "author": "Polymer Authors <polymer-dev@googlegroups.com>",
+  "main": [
+    "polymer.js"
+  ],
+  "dependencies": {
+    "platform": "Polymer/platform#0.2.0"
+  },
+  "version": "0.2.0"
+}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/build.log b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/build.log
new file mode 100644
index 0000000..2daeb00
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/build.log
@@ -0,0 +1,32 @@
+BUILD LOG
+---------
+Build Time: 2014-04-01T15:27:00
+
+NODEJS INFORMATION
+==================
+nodejs: v0.10.26
+chai: 1.9.1
+grunt-concat-sourcemap: 0.4.1
+grunt: 0.4.4
+grunt-audit: 0.0.3
+grunt-contrib-concat: 0.4.0
+grunt-contrib-uglify: 0.4.0
+grunt-contrib-yuidoc: 0.5.2
+grunt-karma: 0.8.2
+karma: 0.12.2
+karma-firefox-launcher: 0.1.3
+karma-crbot-reporter: 0.0.4
+karma-mocha: 0.1.3
+karma-ie-launcher: 0.1.4
+karma-safari-launcher: 0.1.1
+karma-script-launcher: 0.1.0
+mocha: 1.18.2
+Polymer: 0.2.2
+
+REPO REVISIONS
+==============
+polymer-dev: 40bde06093289de27439809e0c5ea34b9be14b66
+
+BUILD HASHES
+============
+build/polymer.js: 13d61f33186d09afa35cdf77fcfedb742f8a2880
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer-body.html b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer-body.html
new file mode 100644
index 0000000..5f07a01
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer-body.html
@@ -0,0 +1,33 @@
+<polymer-element name="polymer-body" extends="body">
+
+  <script>
+
+  // upgrade polymer-body last so that it can contain other imported elements
+  document.addEventListener('polymer-ready', function() {
+    
+    Polymer('polymer-body', Platform.mixin({
+
+      created: function() {
+        this.template = document.createElement('template');
+        var body = wrap(document).body;
+        var c$ = body.childNodes.array();
+        for (var i=0, c; (c=c$[i]); i++) {
+          if (c.localName !== 'script') {
+            this.template.content.appendChild(c);
+          }
+        }
+        // snarf up user defined model
+        window.model = this;
+      },
+
+      parseDeclaration: function(elementElement) {
+        this.lightFromTemplate(this.template);
+      }
+
+    }, window.model));
+
+  });
+
+  </script>
+
+</polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js
new file mode 100644
index 0000000..85a6554
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js
@@ -0,0 +1,2392 @@
+/*
+ * 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.
+ */
+Polymer = {};
+
+/*
+ * 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.
+ */
+
+// 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
+// of polymer; once we refine the loading process this likely goes away.
+if (typeof window.Polymer === 'function') {
+  Polymer = {};
+}
+
+
+/*
+ * 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) {
+
+  // copy own properties from 'api' to 'prototype, with name hinting for 'super'
+  function extend(prototype, api) {
+    if (prototype && api) {
+      // use only own properties of 'api'
+      Object.getOwnPropertyNames(api).forEach(function(n) {
+        // acquire property descriptor
+        var pd = Object.getOwnPropertyDescriptor(api, n);
+        if (pd) {
+          // clone property via descriptor
+          Object.defineProperty(prototype, n, pd);
+          // cache name-of-method for 'super' engine
+          if (typeof pd.value == 'function') {
+            // hint the 'super' engine
+            pd.value.nom = n;
+          }
+        }
+      });
+    }
+    return prototype;
+  }
+  
+  // exports
+
+  scope.extend = extend;
+
+})(Polymer);
+
+/* 
+ * 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) {
+  
+  // usage
+  
+  // invoke cb.call(this) in 100ms, unless the job is re-registered,
+  // which resets the timer
+  // 
+  // this.myJob = this.job(this.myJob, cb, 100)
+  //
+  // returns a job handle which can be used to re-register a job
+
+  var Job = function(inContext) {
+    this.context = inContext;
+    this.boundComplete = this.complete.bind(this)
+  };
+  Job.prototype = {
+    go: function(callback, wait) {
+      this.callback = callback;
+      var h;
+      if (!wait) {
+        h = requestAnimationFrame(this.boundComplete);
+        this.handle = function() {
+          cancelAnimationFrame(h);
+        }
+      } else {
+        h = setTimeout(this.boundComplete, wait);
+        this.handle = function() {
+          clearTimeout(h);
+        }
+      }
+    },
+    stop: function() {
+      if (this.handle) {
+        this.handle();
+        this.handle = null;
+      }
+    },
+    complete: function() {
+      if (this.handle) {
+        this.stop();
+        this.callback.call(this.context);
+      }
+    }
+  };
+  
+  function job(job, callback, wait) {
+    if (job) {
+      job.stop();
+    } else {
+      job = new Job(this);
+    }
+    job.go(callback, wait);
+    return job;
+  }
+  
+  // exports 
+
+  scope.job = job;
+  
+})(Polymer);
+
+/*
+ * 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 registry = {};
+
+  HTMLElement.register = function(tag, prototype) {
+    registry[tag] = prototype;
+  }
+
+  // get prototype mapped to node <tag>
+  HTMLElement.getPrototypeForTag = function(tag) {
+    var prototype = !tag ? HTMLElement.prototype : registry[tag];
+    // TODO(sjmiles): creating <tag> is likely to have wasteful side-effects
+    return prototype || Object.getPrototypeOf(document.createElement(tag));
+  };
+
+  // we have to flag propagation stoppage for the event dispatcher
+  var originalStopPropagation = Event.prototype.stopPropagation;
+  Event.prototype.stopPropagation = function() {
+    this.cancelBubble = true;
+    originalStopPropagation.apply(this, arguments);
+  };
+  
+  // TODO(sorvell): remove when we're sure imports does not need
+  // to load stylesheets
+  /*
+  HTMLImports.importer.preloadSelectors += 
+      ', polymer-element link[rel=stylesheet]';
+  */
+})(Polymer);
+
+/*
+ * 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) {
+    // super
+
+    // `arrayOfArgs` is an optional array of args like one might pass
+    // to `Function.apply`
+
+    // TODO(sjmiles):
+    //    $super must be installed on an instance or prototype chain
+    //    as `super`, and invoked via `this`, e.g.
+    //      `this.super();`
+
+    //    will not work if function objects are not unique, for example,
+    //    when using mixins.
+    //    The memoization strategy assumes each function exists on only one 
+    //    prototype chain i.e. we use the function object for memoizing)
+    //    perhaps we can bookkeep on the prototype itself instead
+    function $super(arrayOfArgs) {
+      // since we are thunking a method call, performance is important here: 
+      // memoize all lookups, once memoized the fast path calls no other 
+      // functions
+      //
+      // find the caller (cannot be `strict` because of 'caller')
+      var caller = $super.caller;
+      // memoized 'name of method' 
+      var nom = caller.nom;
+      // memoized next implementation prototype
+      var _super = caller._super;
+      if (!_super) {
+        if (!nom) {
+          nom = caller.nom = nameInThis.call(this, caller);
+        }
+        if (!nom) {
+          console.warn('called super() on a method not installed declaratively (has no .nom property)');
+        }
+        // super prototype is either cached or we have to find it
+        // by searching __proto__ (at the 'top')
+        _super = memoizeSuper(caller, nom, getPrototypeOf(this));
+      }
+      if (!_super) {
+        // if _super is falsey, there is no super implementation
+        //console.warn('called $super(' + nom + ') where there is no super implementation');
+      } else {
+        // our super function
+        var fn = _super[nom];
+        // memoize information so 'fn' can call 'super'
+        if (!fn._super) {
+          memoizeSuper(fn, nom, _super);
+        }
+        // invoke the inherited method
+        // if 'fn' is not function valued, this will throw
+        return fn.apply(this, arrayOfArgs || []);
+      }
+    }
+
+    function nextSuper(proto, name, caller) {
+      // look for an inherited prototype that implements name
+      while (proto) {
+        if ((proto[name] !== caller) && proto[name]) {
+          return proto;
+        }
+        proto = getPrototypeOf(proto);
+      }
+    }
+
+    function memoizeSuper(method, name, proto) {
+      // find and cache next prototype containing `name`
+      // we need the prototype so we can do another lookup
+      // from here
+      method._super = nextSuper(proto, name, method);
+      if (method._super) {
+        // _super is a prototype, the actual method is _super[name]
+        // tag super method with it's name for further lookups
+        method._super[name].nom = name;
+      }
+      return method._super;
+    }
+
+    function nameInThis(value) {
+      var p = this.__proto__;
+      while (p && p !== HTMLElement.prototype) {
+        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive
+        var n$ = Object.getOwnPropertyNames(p);
+        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {
+          var d = Object.getOwnPropertyDescriptor(p, n);
+          if (typeof d.value === 'function' && d.value === value) {
+            return n;
+          }
+        }
+        p = p.__proto__;
+      }
+    }
+
+    // NOTE: In some platforms (IE10) the prototype chain is faked via 
+    // __proto__. Therefore, always get prototype via __proto__ instead of
+    // the more standard Object.getPrototypeOf.
+    function getPrototypeOf(prototype) {
+      return prototype.__proto__;
+    }
+
+    // utility function to precompute name tags for functions
+    // in a (unchained) prototype
+    function hintSuper(prototype) {
+      // tag functions with their prototype name to optimize
+      // super call invocations
+      for (var n in prototype) {
+        var pd = Object.getOwnPropertyDescriptor(prototype, n);
+        if (pd && typeof pd.value === 'function') {
+          pd.value.nom = n;
+        }
+      }
+    }
+
+    // exports
+
+    scope.super = $super;
+
+})(Polymer);
+
+/* 
+ * 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 typeHandlers = {
+    string: function(value) {
+      return value;
+    },
+    date: function(value) {
+      return new Date(Date.parse(value) || Date.now());
+    },
+    boolean: function(value) {
+      if (value === '') {
+        return true;
+      }
+      return value === 'false' ? false : !!value;
+    },
+    number: function(value) {
+      var n = parseFloat(value);
+      // hex values like "0xFFFF" parseFloat as 0
+      if (n === 0) {
+        n = parseInt(value);
+      }
+      return isNaN(n) ? value : n;
+      // this code disabled because encoded values (like "0xFFFF")
+      // do not round trip to their original format
+      //return (String(floatVal) === value) ? floatVal : value;
+    },
+    object: function(value, currentValue) {
+      if (currentValue === null) {
+        return value;
+      }
+      try {
+        // If the string is an object, we can parse is with the JSON library.
+        // include convenience replace for single-quotes. If the author omits
+        // quotes altogether, parse will fail.
+        return JSON.parse(value.replace(/'/g, '"'));
+      } catch(e) {
+        // The object isn't valid JSON, return the raw value
+        return value;
+      }
+    },
+    // avoid deserialization of functions
+    'function': function(value, currentValue) {
+      return currentValue;
+    }
+  };
+
+  function deserializeValue(value, currentValue) {
+    // attempt to infer type from default value
+    var inferredType = typeof currentValue;
+    // invent 'date' type value for Date
+    if (currentValue instanceof Date) {
+      inferredType = 'date';
+    }
+    // delegate deserialization via type string
+    return typeHandlers[inferredType](value, currentValue);
+  }
+
+  // exports
+
+  scope.deserializeValue = deserializeValue;
+
+})(Polymer);
+
+/*
+ * 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) {
+
+  // imports
+
+  var extend = scope.extend;
+
+  // module
+
+  var api = {};
+
+  api.declaration = {};
+  api.instance = {};
+
+  api.publish = function(apis, prototype) {
+    for (var n in apis) {
+      extend(prototype, apis[n]);
+    }
+  }
+
+  // exports
+
+  scope.api = api;
+
+})(Polymer);
+
+/*
+ * 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 utils = {
+    /**
+      * Invokes a function asynchronously. The context of the callback
+      * function is bound to 'this' automatically.
+      * @method async
+      * @param {Function|String} method
+      * @param {any|Array} args
+      * @param {number} timeout
+      */
+    async: function(method, args, timeout) {
+      // when polyfilling Object.observe, ensure changes 
+      // propagate before executing the async method
+      Platform.flush();
+      // second argument to `apply` must be an array
+      args = (args && args.length) ? args : [args];
+      // function to invoke
+      var fn = function() {
+        (this[method] || method).apply(this, args);
+      }.bind(this);
+      // execute `fn` sooner or later
+      var handle = timeout ? setTimeout(fn, timeout) :
+          requestAnimationFrame(fn);
+      // NOTE: switch on inverting handle to determine which time is used.
+      return timeout ? handle : ~handle;
+    },
+    cancelAsync: function(handle) {
+      if (handle < 0) {
+        cancelAnimationFrame(~handle);
+      } else {
+        clearTimeout(handle);
+      }
+    },
+    /**
+      * Fire an event.
+      * @method fire
+      * @returns {Object} event
+      * @param {string} type An event name.
+      * @param {any} detail
+      * @param {Node} onNode Target node.
+      */
+    fire: function(type, detail, onNode, bubbles, cancelable) {
+      var node = onNode || this;
+      var detail = detail || {};
+      var event = new CustomEvent(type, {
+        bubbles: (bubbles !== undefined ? bubbles : true), 
+        cancelable: (cancelable !== undefined ? cancelable : true), 
+        detail: detail
+      });
+      node.dispatchEvent(event);
+      return event;
+    },
+    /**
+      * Fire an event asynchronously.
+      * @method asyncFire
+      * @param {string} type An event name.
+      * @param detail
+      * @param {Node} toNode Target node.
+      */
+    asyncFire: function(/*inType, inDetail*/) {
+      this.async("fire", arguments);
+    },
+    /**
+      * Remove class from old, add class to anew, if they exist
+      * @param classFollows
+      * @param anew A node.
+      * @param old A node
+      * @param className
+      */
+    classFollows: function(anew, old, className) {
+      if (old) {
+        old.classList.remove(className);
+      }
+      if (anew) {
+        anew.classList.add(className);
+      }
+    }
+  };
+
+  // no-operation function for handy stubs
+  var nop = function() {};
+
+  // null-object for handy stubs
+  var nob = {};
+
+  // deprecated
+
+  utils.asyncMethod = utils.async;
+
+  // exports
+
+  scope.api.instance.utils = utils;
+  scope.nop = nop;
+  scope.nob = nob;
+
+})(Polymer);
+
+/*
+ * 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) {
+
+  // imports
+
+  var log = window.logFlags || {};
+  var EVENT_PREFIX = 'on-';
+
+  // instance events api
+  var events = {
+    // read-only
+    EVENT_PREFIX: EVENT_PREFIX,
+    // event listeners on host
+    addHostListeners: function() {
+      var events = this.eventDelegates;
+      log.events && (Object.keys(events).length > 0) && console.log('[%s] addHostListeners:', this.localName, events);
+      // NOTE: host events look like bindings but really are not;
+      // (1) we don't want the attribute to be set and (2) we want to support
+      // multiple event listeners ('host' and 'instance') and Node.bind
+      // by default supports 1 thing being bound.
+      // We do, however, leverage the event hookup code in PolymerExpressions
+      // so that we have a common code path for handling declarative events.
+      var self = this, bindable, eventName;
+      for (var n in events) {
+        eventName = EVENT_PREFIX + n;
+        bindable = PolymerExpressions.prepareEventBinding(
+          Path.get(events[n]),
+          eventName, 
+          {
+            resolveEventHandler: function(model, path, node) {
+              var fn = path.getValueFrom(self);
+              if (fn) {
+                return fn.bind(self);
+              }
+            }
+          }
+        );
+        bindable(this, this, false);
+      }
+    },
+    // call 'method' or function method on 'obj' with 'args', if the method exists
+    dispatchMethod: function(obj, method, args) {
+      if (obj) {
+        log.events && console.group('[%s] dispatch [%s]', obj.localName, method);
+        var fn = typeof method === 'function' ? method : obj[method];
+        if (fn) {
+          fn[args ? 'apply' : 'call'](obj, args);
+        }
+        log.events && console.groupEnd();
+        Platform.flush();
+      }
+    }
+  };
+
+  // exports
+
+  scope.api.instance.events = events;
+
+})(Polymer);
+
+/*

+ * 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) {

+

+  // instance api for attributes

+

+  var attributes = {

+    copyInstanceAttributes: function () {

+      var a$ = this._instanceAttributes;

+      for (var k in a$) {

+        if (!this.hasAttribute(k)) {

+          this.setAttribute(k, a$[k]);

+        }

+      }

+    },

+    // for each attribute on this, deserialize value to property as needed

+    takeAttributes: function() {

+      // if we have no publish lookup table, we have no attributes to take

+      // TODO(sjmiles): ad hoc

+      if (this._publishLC) {

+        for (var i=0, a$=this.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {

+          this.attributeToProperty(a.name, a.value);

+        }

+      }

+    },

+    // if attribute 'name' is mapped to a property, deserialize

+    // 'value' into that property

+    attributeToProperty: function(name, value) {

+      // try to match this attribute to a property (attributes are

+      // all lower-case, so this is case-insensitive search)

+      var name = this.propertyForAttribute(name);

+      if (name) {

+        // filter out 'mustached' values, these are to be

+        // replaced with bound-data and are not yet values

+        // themselves

+        if (value && value.search(scope.bindPattern) >= 0) {

+          return;

+        }

+        // get original value

+        var currentValue = this[name];

+        // deserialize Boolean or Number values from attribute

+        var value = this.deserializeValue(value, currentValue);

+        // only act if the value has changed

+        if (value !== currentValue) {

+          // install new value (has side-effects)

+          this[name] = value;

+        }

+      }

+    },

+    // return the published property matching name, or undefined

+    propertyForAttribute: function(name) {

+      var match = this._publishLC && this._publishLC[name];

+      //console.log('propertyForAttribute:', name, 'matches', match);

+      return match;

+    },

+    // convert representation of 'stringValue' based on type of 'currentValue'

+    deserializeValue: function(stringValue, currentValue) {

+      return scope.deserializeValue(stringValue, currentValue);

+    },

+    serializeValue: function(value, inferredType) {

+      if (inferredType === 'boolean') {

+        return value ? '' : undefined;

+      } else if (inferredType !== 'object' && inferredType !== 'function'

+          && value !== undefined) {

+        return value;

+      }

+    },

+    reflectPropertyToAttribute: function(name) {

+      var inferredType = typeof this[name];

+      // try to intelligently serialize property value

+      var serializedValue = this.serializeValue(this[name], inferredType);

+      // boolean properties must reflect as boolean attributes

+      if (serializedValue !== undefined) {

+        this.setAttribute(name, serializedValue);

+        // TODO(sorvell): we should remove attr for all properties

+        // that have undefined serialization; however, we will need to

+        // refine the attr reflection system to achieve this; pica, for example,

+        // relies on having inferredType object properties not removed as

+        // attrs.

+      } else if (inferredType === 'boolean') {

+        this.removeAttribute(name);

+      }

+    }

+  };

+

+  // exports

+

+  scope.api.instance.attributes = attributes;

+

+})(Polymer);

+
+/*
+ * 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) {
+
+  // imports
+
+  var log = window.logFlags || {};
+
+  // magic words
+
+  var OBSERVE_SUFFIX = 'Changed';
+
+  // element api
+
+  var empty = [];
+
+  var properties = {
+    observeProperties: function() {
+      var n$ = this._observeNames, pn$ = this._publishNames;
+      if ((n$ && n$.length) || (pn$ && pn$.length)) {
+        var self = this;
+        var o = this._propertyObserver = new CompoundObserver();
+        // keep track of property observer so we can shut it down
+        this.registerObservers([o]);
+        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
+          o.addPath(this, n);
+          // observer array properties
+          var pd = Object.getOwnPropertyDescriptor(this.__proto__, n);
+          if (pd && pd.value) {
+            this.observeArrayValue(n, pd.value, null);
+          }
+        }
+        for (var i=0, l=pn$.length, n; (i<l) && (n=pn$[i]); i++) {
+          if (!this.observe || (this.observe[n] === undefined)) {
+            o.addPath(this, n);
+          }
+        }
+        o.open(this.notifyPropertyChanges, this);
+      }
+    },
+    notifyPropertyChanges: function(newValues, oldValues, paths) {
+      var name, method, called = {};
+      for (var i in oldValues) {
+        // note: paths is of form [object, path, object, path]
+        name = paths[2 * i + 1];
+        if (this.publish[name] !== undefined) {
+          this.reflectPropertyToAttribute(name);
+        }
+        method = this.observe[name];
+        if (method) {
+          this.observeArrayValue(name, newValues[i], oldValues[i]);
+          if (!called[method]) {
+            called[method] = true;
+            // observes the value if it is an array
+            this.invokeMethod(method, [oldValues[i], newValues[i], arguments]);
+          }
+        }
+      }
+    },
+    observeArrayValue: function(name, value, old) {
+      // we only care if there are registered side-effects
+      var callbackName = this.observe[name];
+      if (callbackName) {
+        // if we are observing the previous value, stop
+        if (Array.isArray(old)) {
+          log.observe && console.log('[%s] observeArrayValue: unregister observer [%s]', this.localName, name);
+          this.closeNamedObserver(name + '__array');
+        }
+        // if the new value is an array, being observing it
+        if (Array.isArray(value)) {
+          log.observe && console.log('[%s] observeArrayValue: register observer [%s]', this.localName, name, value);
+          var observer = new ArrayObserver(value);
+          observer.open(function(value, old) {
+            this.invokeMethod(callbackName, [old]);
+          }, this);
+          this.registerNamedObserver(name + '__array', observer);
+        }
+      }
+    },
+    bindProperty: function(property, observable) {
+      // apply Polymer two-way reference binding
+      return bindProperties(this, property, observable);
+    },
+    invokeMethod: function(method, args) {
+      var fn = this[method] || method;
+      if (typeof fn === 'function') {
+        fn.apply(this, args);
+      }
+    },
+    registerObservers: function(observers) {
+      this._observers.push(observers);
+    },
+    // observer array items are arrays of observers.
+    closeObservers: function() {
+      for (var i=0, l=this._observers.length; i<l; i++) {
+        this.closeObserverArray(this._observers[i]);
+      }
+      this._observers = [];
+    },
+    closeObserverArray: function(observerArray) {
+      for (var i=0, l=observerArray.length, o; i<l; i++) {
+        o = observerArray[i];
+        if (o && o.close) {
+          o.close();
+        }
+      }
+    },
+    // bookkeeping observers for memory management
+    registerNamedObserver: function(name, observer) {
+      var o$ = this._namedObservers || (this._namedObservers = {});
+      o$[name] = observer;
+    },
+    closeNamedObserver: function(name) {
+      var o$ = this._namedObservers;
+      if (o$ && o$[name]) {
+        o$[name].close();
+        o$[name] = null;
+        return true;
+      }
+    },
+    closeNamedObservers: function() {
+      if (this._namedObservers) {
+        var keys=Object.keys(this._namedObservers);
+        for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {
+          o = this._namedObservers[k];
+          o.close();
+        }
+        this._namedObservers = {};
+      }
+    }
+  };
+
+  // property binding
+  // bind a property in A to a path in B by converting A[property] to a
+  // getter/setter pair that accesses B[...path...]
+  function bindProperties(inA, inProperty, observable) {
+    log.bind && console.log(LOG_BIND_PROPS, inB.localName || 'object', inPath, inA.localName, inProperty);
+    // capture A's value if B's value is null or undefined,
+    // otherwise use B's value
+    // TODO(sorvell): need to review, can do with ObserverTransform
+    var v = observable.discardChanges();
+    if (v === null || v === undefined) {
+      observable.setValue(inA[inProperty]);
+    }
+    return Observer.defineComputedProperty(inA, inProperty, observable);
+  }
+
+  // logging
+  var LOG_OBSERVE = '[%s] watching [%s]';
+  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';
+  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';
+  var LOG_BIND_PROPS = "[%s]: bindProperties: [%s] to [%s].[%s]";
+
+  // exports
+
+  scope.api.instance.properties = properties;
+
+})(Polymer);
+
+/*
+ * 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) {
+
+  // imports
+
+  var log = window.logFlags || 0;
+  var events = scope.api.instance.events;
+
+  var syntax = new PolymerExpressions();
+  syntax.resolveEventHandler = function(model, path, node) {
+    var ctlr = findEventController(node);
+    if (ctlr) {
+      var fn = path.getValueFrom(ctlr);
+      if (fn) {
+        return fn.bind(ctlr);
+      }
+    }
+  }
+
+  // An event controller is the host element for the shadowRoot in which 
+  // the node exists, or the first ancestor with a 'lightDomController'
+  // property.
+  function findEventController(node) {
+    while (node.parentNode) {
+      if (node.lightDomController) {
+        return node;
+      }
+      node = node.parentNode;
+    }
+    return node.host;
+  };
+
+  // element api supporting mdv
+
+  var mdv = {
+    syntax: syntax,
+    instanceTemplate: function(template) {
+      var dom = template.createInstance(this, this.syntax);
+      this.registerObservers(dom.bindings_);
+      return dom;
+    },
+    bind: function(name, observable, oneTime) {
+      var property = this.propertyForAttribute(name);
+      if (!property) {
+        // TODO(sjmiles): this mixin method must use the special form
+        // of `super` installed by `mixinMethod` in declaration/prototype.js
+        return this.mixinSuper(arguments);
+      } else {
+        // use n-way Polymer binding
+        var observer = this.bindProperty(property, observable);
+        this.reflectPropertyToAttribute(property);
+        // NOTE: reflecting binding information is typically required only for
+        // tooling. It has a performance cost so it's opt-in in Node.bind.
+        if (Platform.enableBindingsReflection) {
+          observer.path = observable.path_;
+          this.bindings_ = this.bindings_ || {};
+          this.bindings_[name] = observer;
+        }
+        return observer;
+      }
+    },
+    // TODO(sorvell): unbind/unbindAll has been removed, as public api, from
+    // TemplateBinding. We still need to close/dispose of observers but perhaps
+    // we should choose a more explicit name.
+    asyncUnbindAll: function() {
+      if (!this._unbound) {
+        log.unbind && console.log('[%s] asyncUnbindAll', this.localName);
+        this._unbindAllJob = this.job(this._unbindAllJob, this.unbindAll, 0);
+      }
+    },
+    unbindAll: function() {
+      if (!this._unbound) {
+        this.closeObservers();
+        this.closeNamedObservers();
+        this._unbound = true;
+      }
+    },
+    cancelUnbindAll: function() {
+      if (this._unbound) {
+        log.unbind && console.warn('[%s] already unbound, cannot cancel unbindAll', this.localName);
+        return;
+      }
+      log.unbind && console.log('[%s] cancelUnbindAll', this.localName);
+      if (this._unbindAllJob) {
+        this._unbindAllJob = this._unbindAllJob.stop();
+      }
+    }
+  };
+
+  function unbindNodeTree(node) {
+    forNodeTree(node, _nodeUnbindAll);
+  }
+
+  function _nodeUnbindAll(node) {
+    node.unbindAll();
+  }
+
+  function forNodeTree(node, callback) {
+    if (node) {
+      callback(node);
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        forNodeTree(child, callback);
+      }
+    }
+  }
+
+  var mustachePattern = /\{\{([^{}]*)}}/;
+
+  // exports
+
+  scope.bindPattern = mustachePattern;
+  scope.api.instance.mdv = mdv;
+
+})(Polymer);
+
+/*
+ * 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 base = {
+    PolymerBase: true,
+    job: function(job, callback, wait) {
+      if (typeof job === 'string') {
+        var n = '___' + job;
+        this[n] = Polymer.job.call(this, this[n], callback, wait);
+      } else {
+        return Polymer.job.call(this, job, callback, wait);
+      }
+    },
+    super: Polymer.super,
+    // user entry point for element has had its createdCallback called
+    created: function() {
+    },
+    // user entry point for element has shadowRoot and is ready for
+    // api interaction
+    ready: function() {
+    },
+    createdCallback: function() {
+      if (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();
+    },
+    // system entry point, do not override
+    prepareElement: function() {
+      this._elementPrepared = true;
+      // install shadowRoots storage
+      this.shadowRoots = {};
+      // storage for closeable observers.
+      this._observers = [];
+      // install property observers
+      this.observeProperties();
+      // install boilerplate attributes
+      this.copyInstanceAttributes();
+      // process input attributes
+      this.takeAttributes();
+      // add event listeners
+      this.addHostListeners();
+      // process declarative resources
+      this.parseDeclarations(this.__proto__);
+      // TODO(sorvell): CE polyfill uses unresolved attribute to simulate
+      // :unresolved; remove this attribute to be compatible with native
+      // CE.
+      this.removeAttribute('unresolved');
+      // user entry point
+      this.ready();
+    },
+    attachedCallback: function() {
+      this.cancelUnbindAll();
+      // invoke user action
+      if (this.attached) {
+        this.attached();
+      }
+      // TODO(sorvell): bc
+      if (this.enteredView) {
+        this.enteredView();
+      }
+      // NOTE: domReady can be used to access elements in dom (descendants, 
+      // ancestors, siblings) such that the developer is enured to upgrade
+      // ordering. If the element definitions have loaded, domReady
+      // can be used to access upgraded elements.
+      if (!this.hasBeenAttached) {
+        this.hasBeenAttached = true;
+        if (this.domReady) {
+          this.async('domReady');
+        }
+      }
+    },
+    detachedCallback: function() {
+      if (!this.preventDispose) {
+        this.asyncUnbindAll();
+      }
+      // invoke user action
+      if (this.detached) {
+        this.detached();
+      }
+      // TODO(sorvell): bc
+      if (this.leftView) {
+        this.leftView();
+      }
+    },
+    // TODO(sorvell): bc
+    enteredViewCallback: function() {
+      this.attachedCallback();
+    },
+    // TODO(sorvell): bc
+    leftViewCallback: function() {
+      this.detachedCallback();
+    },
+    // TODO(sorvell): bc
+    enteredDocumentCallback: function() {
+      this.attachedCallback();
+    },
+    // TODO(sorvell): bc
+    leftDocumentCallback: function() {
+      this.detachedCallback();
+    },
+    // recursive ancestral <element> initialization, oldest first
+    parseDeclarations: function(p) {
+      if (p && p.element) {
+        this.parseDeclarations(p.__proto__);
+        p.parseDeclaration.call(this, p.element);
+      }
+    },
+    // parse input <element> as needed, override for custom behavior
+    parseDeclaration: function(elementElement) {
+      var template = this.fetchTemplate(elementElement);
+      if (template) {
+        var root = this.shadowFromTemplate(template);
+        this.shadowRoots[elementElement.name] = root;
+      }
+    },
+    // return a shadow-root template (if desired), override for custom behavior
+    fetchTemplate: function(elementElement) {
+      return elementElement.querySelector('template');
+    },
+    // utility function that creates a shadow root from a <template>
+    shadowFromTemplate: function(template) {
+      if (template) {
+        // make a shadow root
+        var root = this.createShadowRoot();
+        // stamp template
+        // which includes parsing and applying MDV bindings before being 
+        // inserted (to avoid {{}} in attribute values)
+        // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
+        var dom = this.instanceTemplate(template);
+        // append to shadow dom
+        root.appendChild(dom);
+        // perform post-construction initialization tasks on shadow root
+        this.shadowRootReady(root, template);
+        // return the created shadow root
+        return root;
+      }
+    },
+    // utility function that stamps a <template> into light-dom
+    lightFromTemplate: function(template, refNode) {
+      if (template) {
+        // TODO(sorvell): mark this element as a lightDOMController so that
+        // event listeners on bound nodes inside it will be called on it.
+        // Note, the expectation here is that events on all descendants 
+        // should be handled by this element.
+        this.lightDomController = true;
+        // stamp template
+        // which includes parsing and applying MDV bindings before being 
+        // inserted (to avoid {{}} in attribute values)
+        // e.g. to prevent <img src="images/{{icon}}"> from generating a 404.
+        var dom = this.instanceTemplate(template);
+        // append to shadow dom
+        if (refNode) {
+          this.insertBefore(dom, refNode);          
+        } else {
+          this.appendChild(dom);
+        }
+        // perform post-construction initialization tasks on ahem, light root
+        this.shadowRootReady(this);
+        // return the created shadow root
+        return dom;
+      }
+    },
+    shadowRootReady: function(root) {
+      // locate nodes with id and store references to them in this.$ hash
+      this.marshalNodeReferences(root);
+      // set up pointer gestures
+      PointerGestures.register(root);
+    },
+    // locate nodes with id and store references to them in this.$ hash
+    marshalNodeReferences: function(root) {
+      // establish $ instance variable
+      var $ = this.$ = this.$ || {};
+      // populate $ from nodes with ID from the LOCAL tree
+      if (root) {
+        var n$ = root.querySelectorAll("[id]");
+        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
+          $[n.id] = n;
+        };
+      }
+    },
+    attributeChangedCallback: function(name, oldValue) {
+      // TODO(sjmiles): adhoc filter
+      if (name !== 'class' && name !== 'style') {
+        this.attributeToProperty(name, this.getAttribute(name));
+      }
+      if (this.attributeChanged) {
+        this.attributeChanged.apply(this, arguments);
+      }
+    },
+    onMutation: function(node, listener) {
+      var observer = new MutationObserver(function(mutations) {
+        listener.call(this, observer, mutations);
+        observer.disconnect();
+      }.bind(this));
+      observer.observe(node, {childList: true, subtree: true});
+    }
+  };
+
+  // true if object has own PolymerBase api
+  function isBase(object) {
+    return object.hasOwnProperty('PolymerBase') 
+  }
+
+  // name a base constructor for dev tools
+
+  function PolymerBase() {};
+  PolymerBase.prototype = base;
+  base.constructor = PolymerBase;
+  
+  // exports
+
+  scope.Base = PolymerBase;
+  scope.isBase = isBase;
+  scope.api.instance.base = base;
+  
+})(Polymer);
+
+/*
+ * 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) {
+
+  // imports
+
+  var log = window.logFlags || {};
+  
+  // magic words
+  
+  var STYLE_SCOPE_ATTRIBUTE = 'element';
+  var STYLE_CONTROLLER_SCOPE = 'controller';
+  
+  var styles = {
+    STYLE_SCOPE_ATTRIBUTE: STYLE_SCOPE_ATTRIBUTE,
+    /**
+     * Installs external stylesheets and <style> elements with the attribute 
+     * polymer-scope='controller' into the scope of element. This is intended
+     * to be a called during custom element construction.
+    */
+    installControllerStyles: function() {
+      // apply controller styles, but only if they are not yet applied
+      var scope = this.findStyleScope();
+      if (scope && !this.scopeHasNamedStyle(scope, this.localName)) {
+        // allow inherited controller styles
+        var proto = getPrototypeOf(this), cssText = '';
+        while (proto && proto.element) {
+          cssText += proto.element.cssTextForScope(STYLE_CONTROLLER_SCOPE);
+          proto = getPrototypeOf(proto);
+        }
+        if (cssText) {
+          this.installScopeCssText(cssText, scope);
+        }
+      }
+    },
+    installScopeStyle: function(style, name, scope) {
+      var scope = scope || this.findStyleScope(), name = name || '';
+      if (scope && !this.scopeHasNamedStyle(scope, this.localName + name)) {
+        var cssText = '';
+        if (style instanceof Array) {
+          for (var i=0, l=style.length, s; (i<l) && (s=style[i]); i++) {
+            cssText += s.textContent + '\n\n';
+          }
+        } else {
+          cssText = style.textContent;
+        }
+        this.installScopeCssText(cssText, scope, name);
+      }
+    },
+    installScopeCssText: function(cssText, scope, name) {
+      scope = scope || this.findStyleScope();
+      name = name || '';
+      if (!scope) {
+        return;
+      }
+      if (window.ShadowDOMPolyfill) {
+        cssText = shimCssText(cssText, scope.host);
+      }
+      var style = this.element.cssTextToScopeStyle(cssText,
+          STYLE_CONTROLLER_SCOPE);
+      Polymer.applyStyleToScope(style, scope);
+      // cache that this style has been applied
+      scope._scopeStyles[this.localName + name] = true;
+    },
+    findStyleScope: function(node) {
+      // find the shadow root that contains this element
+      var n = node || this;
+      while (n.parentNode) {
+        n = n.parentNode;
+      }
+      return n;
+    },
+    scopeHasNamedStyle: function(scope, name) {
+      scope._scopeStyles = scope._scopeStyles || {};
+      return scope._scopeStyles[name];
+    }
+  };
+  
+  // NOTE: use raw prototype traversal so that we ensure correct traversal
+  // on platforms where the protoype chain is simulated via __proto__ (IE10)
+  function getPrototypeOf(prototype) {
+    return prototype.__proto__;
+  }
+
+  function shimCssText(cssText, host) {
+    var name = '', is = false;
+    if (host) {
+      name = host.localName;
+      is = host.hasAttribute('is');
+    }
+    var selector = Platform.ShadowCSS.makeScopeSelector(name, is);
+    return Platform.ShadowCSS.shimCssText(cssText, selector);
+  }
+
+  // exports
+
+  scope.api.instance.styles = styles;
+  
+})(Polymer);
+
+/*
+ * 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) {
+
+  // imports
+
+  var extend = scope.extend;
+  var api = scope.api;
+
+  // imperative implementation: Polymer()
+
+  // specify an 'own' prototype for tag `name`
+  function element(name, prototype) {
+    if (arguments.length === 1 && typeof arguments[0] !== 'string') {
+      prototype = name;
+      var script = document._currentScript;
+      name = script && script.parentNode && script.parentNode.getAttribute ?
+          script.parentNode.getAttribute('name') : '';
+      if (!name) {
+        throw 'Element name could not be inferred.';
+      }
+    }
+    if (getRegisteredPrototype[name]) {
+      throw 'Already registered (Polymer) prototype for element ' + name;
+    }
+    // cache the prototype
+    registerPrototype(name, prototype);
+    // notify the registrar waiting for 'name', if any
+    notifyPrototype(name);
+  }
+
+  // async prototype source
+
+  function waitingForPrototype(name, client) {
+    waitPrototype[name] = client;
+  }
+
+  var waitPrototype = {};
+
+  function notifyPrototype(name) {
+    if (waitPrototype[name]) {
+      waitPrototype[name].registerWhenReady();
+      delete waitPrototype[name];
+    }
+  }
+
+  // utility and bookkeeping
+
+  // maps tag names to prototypes, as registered with
+  // Polymer. Prototypes associated with a tag name
+  // using document.registerElement are available from
+  // HTMLElement.getPrototypeForTag().
+  // If an element was fully registered by Polymer, then
+  // Polymer.getRegisteredPrototype(name) === 
+  //   HTMLElement.getPrototypeForTag(name)
+
+  var prototypesByName = {};
+
+  function registerPrototype(name, prototype) {
+    return prototypesByName[name] = prototype || {};
+  }
+
+  function getRegisteredPrototype(name) {
+    return prototypesByName[name];
+  }
+
+  // exports
+
+  scope.getRegisteredPrototype = getRegisteredPrototype;
+  scope.waitingForPrototype = waitingForPrototype;
+
+  // namespace shenanigans so we can expose our scope on the registration 
+  // function
+
+  // make window.Polymer reference `element()`
+
+  window.Polymer = element;
+
+  // TODO(sjmiles): find a way to do this that is less terrible
+  // copy window.Polymer properties onto `element()`
+
+  extend(Polymer, scope);
+
+  // Under the HTMLImports polyfill, scripts in the main document
+  // do not block on imports; we want to allow calls to Polymer in the main
+  // document. Platform collects those calls until we can process them, which
+  // we do here.
+
+  var declarations = Platform.deliverDeclarations();
+  if (declarations) {
+    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {
+      element.apply(null, d);
+    }
+  }
+
+})(Polymer);
+
+/* 
+ * 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 path = {
+  resolveElementPaths: function(node) {
+    Platform.urlResolver.resolveDom(node);
+  },
+  addResolvePathApi: function() {
+    // let assetpath attribute modify the resolve path
+    var assetPath = this.getAttribute('assetpath') || '';
+    var root = new URL(assetPath, this.ownerDocument.baseURI);
+    this.prototype.resolvePath = function(urlPath, base) {
+      var u = new URL(urlPath, base || root);
+      return u.href;
+    };
+  }
+};
+
+// exports
+scope.api.declaration.path = path;
+
+})(Polymer);
+
+/*
+ * 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) {
+
+  // imports
+
+  var log = window.logFlags || {};
+  var api = scope.api.instance.styles;
+  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;
+
+  // magic words
+
+  var STYLE_SELECTOR = 'style';
+  var STYLE_LOADABLE_MATCH = '@import';
+  var SHEET_SELECTOR = 'link[rel=stylesheet]';
+  var STYLE_GLOBAL_SCOPE = 'global';
+  var SCOPE_ATTR = 'polymer-scope';
+
+  var styles = {
+    // returns true if resources are loading
+    loadStyles: function(callback) {
+      var content = this.templateContent();
+      if (content) {
+        this.convertSheetsToStyles(content);
+      }
+      var styles = this.findLoadableStyles(content);
+      if (styles.length) {
+        Platform.styleResolver.loadStyles(styles, callback);
+      } else if (callback) {
+        callback();
+      }
+    },
+    convertSheetsToStyles: function(root) {
+      var s$ = root.querySelectorAll(SHEET_SELECTOR);
+      for (var i=0, l=s$.length, s, c; (i<l) && (s=s$[i]); i++) {
+        c = createStyleElement(importRuleForSheet(s, this.ownerDocument.baseURI),
+            this.ownerDocument);
+        this.copySheetAttributes(c, s);
+        s.parentNode.replaceChild(c, s);
+      }
+    },
+    copySheetAttributes: function(style, link) {
+      for (var i=0, a$=link.attributes, l=a$.length, a; (a=a$[i]) && i<l; i++) {
+        if (a.name !== 'rel' && a.name !== 'href') {
+          style.setAttribute(a.name, a.value);
+        }
+      }
+    },
+    findLoadableStyles: function(root) {
+      var loadables = [];
+      if (root) {
+        var s$ = root.querySelectorAll(STYLE_SELECTOR);
+        for (var i=0, l=s$.length, s; (i<l) && (s=s$[i]); i++) {
+          if (s.textContent.match(STYLE_LOADABLE_MATCH)) {
+            loadables.push(s);
+          }
+        }
+      }
+      return loadables;
+    },
+    /**
+     * Install external stylesheets loaded in <polymer-element> elements into the 
+     * element's template.
+     * @param elementElement The <element> element to style.
+     */
+    installSheets: function() {
+      this.cacheSheets();
+      this.cacheStyles();
+      this.installLocalSheets();
+      this.installGlobalStyles();
+    },
+    /**
+     * Remove all sheets from element and store for later use.
+     */
+    cacheSheets: function() {
+      this.sheets = this.findNodes(SHEET_SELECTOR);
+      this.sheets.forEach(function(s) {
+        if (s.parentNode) {
+          s.parentNode.removeChild(s);
+        }
+      });
+    },
+    cacheStyles: function() {
+      this.styles = this.findNodes(STYLE_SELECTOR + '[' + SCOPE_ATTR + ']');
+      this.styles.forEach(function(s) {
+        if (s.parentNode) {
+          s.parentNode.removeChild(s);
+        }
+      });
+    },
+    /**
+     * Takes external stylesheets loaded in an <element> element and moves
+     * their content into a <style> element inside the <element>'s template.
+     * The sheet is then removed from the <element>. This is done only so 
+     * that if the element is loaded in the main document, the sheet does
+     * not become active.
+     * Note, ignores sheets with the attribute 'polymer-scope'.
+     * @param elementElement The <element> element to style.
+     */
+    installLocalSheets: function () {
+      var sheets = this.sheets.filter(function(s) {
+        return !s.hasAttribute(SCOPE_ATTR);
+      });
+      var content = this.templateContent();
+      if (content) {
+        var cssText = '';
+        sheets.forEach(function(sheet) {
+          cssText += cssTextFromSheet(sheet) + '\n';
+        });
+        if (cssText) {
+          var style = createStyleElement(cssText, this.ownerDocument);
+          content.insertBefore(style, content.firstChild);
+        }
+      }
+    },
+    findNodes: function(selector, matcher) {
+      var nodes = this.querySelectorAll(selector).array();
+      var content = this.templateContent();
+      if (content) {
+        var templateNodes = content.querySelectorAll(selector).array();
+        nodes = nodes.concat(templateNodes);
+      }
+      return matcher ? nodes.filter(matcher) : nodes;
+    },
+    templateContent: function() {
+      var template = this.querySelector('template');
+      return template && templateContent(template);
+    },
+    /**
+     * Promotes external stylesheets and <style> elements with the attribute 
+     * polymer-scope='global' into global scope.
+     * This is particularly useful for defining @keyframe rules which 
+     * currently do not function in scoped or shadow style elements.
+     * (See wkb.ug/72462)
+     * @param elementElement The <element> element to style.
+    */
+    // TODO(sorvell): remove when wkb.ug/72462 is addressed.
+    installGlobalStyles: function() {
+      var style = this.styleForScope(STYLE_GLOBAL_SCOPE);
+      applyStyleToScope(style, document.head);
+    },
+    cssTextForScope: function(scopeDescriptor) {
+      var cssText = '';
+      // handle stylesheets
+      var selector = '[' + SCOPE_ATTR + '=' + scopeDescriptor + ']';
+      var matcher = function(s) {
+        return matchesSelector(s, selector);
+      };
+      var sheets = this.sheets.filter(matcher);
+      sheets.forEach(function(sheet) {
+        cssText += cssTextFromSheet(sheet) + '\n\n';
+      });
+      // handle cached style elements
+      var styles = this.styles.filter(matcher);
+      styles.forEach(function(style) {
+        cssText += style.textContent + '\n\n';
+      });
+      return cssText;
+    },
+    styleForScope: function(scopeDescriptor) {
+      var cssText = this.cssTextForScope(scopeDescriptor);
+      return this.cssTextToScopeStyle(cssText, scopeDescriptor);
+    },
+    cssTextToScopeStyle: function(cssText, scopeDescriptor) {
+      if (cssText) {
+        var style = createStyleElement(cssText);
+        style.setAttribute(STYLE_SCOPE_ATTRIBUTE, this.getAttribute('name') +
+            '-' + scopeDescriptor);
+        return style;
+      }
+    }
+  };
+
+  function importRuleForSheet(sheet, baseUrl) {
+    var href = new URL(sheet.getAttribute('href'), baseUrl).href;
+    return '@import \'' + href + '\';';
+  }
+
+  function applyStyleToScope(style, scope) {
+    if (style) {
+      if (scope === document) {
+        scope = document.head;
+      }
+      if (window.ShadowDOMPolyfill) {
+        scope = document.head;
+      }
+      // TODO(sorvell): necessary for IE
+      // see https://connect.microsoft.com/IE/feedback/details/790212/
+      // cloning-a-style-element-and-adding-to-document-produces
+      // -unexpected-result#details
+      // var clone = style.cloneNode(true);
+      var clone = createStyleElement(style.textContent);
+      var attr = style.getAttribute(STYLE_SCOPE_ATTRIBUTE);
+      if (attr) {
+        clone.setAttribute(STYLE_SCOPE_ATTRIBUTE, attr);
+      }
+      // TODO(sorvell): probably too brittle; try to figure out 
+      // where to put the element.
+      var refNode = scope.firstElementChild;
+      if (scope === document.head) {
+        var selector = 'style[' + STYLE_SCOPE_ATTRIBUTE + ']';
+        var s$ = document.head.querySelectorAll(selector);
+        if (s$.length) {
+          refNode = s$[s$.length-1].nextElementSibling;
+        }
+      }
+      scope.insertBefore(clone, refNode);
+    }
+  }
+
+  function createStyleElement(cssText, scope) {
+    scope = scope || document;
+    scope = scope.createElement ? scope : scope.ownerDocument;
+    var style = scope.createElement('style');
+    style.textContent = cssText;
+    return style;
+  }
+
+  function cssTextFromSheet(sheet) {
+    return (sheet && sheet.__resource) || '';
+  }
+
+  function matchesSelector(node, inSelector) {
+    if (matches) {
+      return matches.call(node, inSelector);
+    }
+  }
+  var p = HTMLElement.prototype;
+  var matches = p.matches || p.matchesSelector || p.webkitMatchesSelector 
+      || p.mozMatchesSelector;
+  
+  // exports
+
+  scope.api.declaration.styles = styles;
+  scope.applyStyleToScope = applyStyleToScope;
+  
+})(Polymer);
+
+/*
+ * 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) {
+
+  // imports
+
+  var log = window.logFlags || {};
+  var api = scope.api.instance.events;
+  var EVENT_PREFIX = api.EVENT_PREFIX;
+  // polymer-element declarative api: events feature
+
+  var events = { 
+    parseHostEvents: function() {
+      // our delegates map
+      var delegates = this.prototype.eventDelegates;
+      // extract data from attributes into delegates
+      this.addAttributeDelegates(delegates);
+    },
+    addAttributeDelegates: function(delegates) {
+      // for each attribute
+      for (var i=0, a; a=this.attributes[i]; i++) {
+        // does it have magic marker identifying it as an event delegate?
+        if (this.hasEventPrefix(a.name)) {
+          // if so, add the info to delegates
+          delegates[this.removeEventPrefix(a.name)] = a.value.replace('{{', '')
+              .replace('}}', '').trim();
+        }
+      }
+    },
+    // starts with 'on-'
+    hasEventPrefix: function (n) {
+      return n && (n[0] === 'o') && (n[1] === 'n') && (n[2] === '-');
+    },
+    removeEventPrefix: function(n) {
+      return n.slice(prefixLength);
+    }
+  };
+
+  var prefixLength = EVENT_PREFIX.length;
+
+  // exports
+  scope.api.declaration.events = events;
+
+})(Polymer);
+/*

+ * 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) {

+

+  // element api

+

+  var properties = {

+    inferObservers: function(prototype) {

+      // called before prototype.observe is chained to inherited object

+      var observe = prototype.observe, property;

+      for (var n in prototype) {

+        if (n.slice(-7) === 'Changed') {

+          if (!observe) {

+            observe  = (prototype.observe = {});

+          }

+          property = n.slice(0, -7)

+          observe[property] = observe[property] || n;

+        }

+      }

+    },

+    explodeObservers: function(prototype) {

+      // called before prototype.observe is chained to inherited object

+      var o = prototype.observe;

+      if (o) {

+        var exploded = {};

+        for (var n in o) {

+          var names = n.split(' ');

+          for (var i=0, ni; ni=names[i]; i++) {

+            exploded[ni] = o[n];

+          }

+        }

+        prototype.observe = exploded;

+      }

+    },

+    optimizePropertyMaps: function(prototype) {

+      if (prototype.observe) {

+        // construct name list

+        var a = prototype._observeNames = [];

+        for (var n in prototype.observe) {

+          var names = n.split(' ');

+          for (var i=0, ni; ni=names[i]; i++) {

+            a.push(ni);

+          }

+        }

+      }

+      if (prototype.publish) {

+        // construct name list

+        var a = prototype._publishNames = [];

+        for (var n in prototype.publish) {

+          a.push(n);

+        }

+      }

+    },

+    publishProperties: function(prototype, base) {

+      // if we have any properties to publish

+      var publish = prototype.publish;

+      if (publish) {

+        // transcribe `publish` entries onto own prototype

+        this.requireProperties(publish, prototype, base);

+        // construct map of lower-cased property names

+        prototype._publishLC = this.lowerCaseMap(publish);

+      }

+    },

+    requireProperties: function(properties, prototype, base) {

+      // ensure a prototype value for each property

+      for (var n in properties) {

+        if (prototype[n] === undefined && base[n] === undefined) {

+          prototype[n] = properties[n];

+        }

+      }

+    },

+    lowerCaseMap: function(properties) {

+      var map = {};

+      for (var n in properties) {

+        map[n.toLowerCase()] = n;

+      }

+      return map;

+    }

+  };

+

+  // exports

+

+  scope.api.declaration.properties = properties;

+

+})(Polymer);

+
+/*
+ * 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) {
+
+  // magic words
+
+  var ATTRIBUTES_ATTRIBUTE = 'attributes';
+  var ATTRIBUTES_REGEX = /\s|,/;
+
+  // attributes api
+
+  var attributes = {
+    inheritAttributesObjects: function(prototype) {
+      // chain our lower-cased publish map to the inherited version
+      this.inheritObject(prototype, 'publishLC');
+      // chain our instance attributes map to the inherited version
+      this.inheritObject(prototype, '_instanceAttributes');
+    },
+    publishAttributes: function(prototype, base) {
+      // merge names from 'attributes' attribute
+      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);
+      if (attributes) {
+        // get properties to publish
+        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();
+          // do not override explicit entries
+          if (n && publish[n] === undefined && base[n] === undefined) {
+            publish[n] = null;
+          }
+        }
+      }
+    },
+    // record clonable attributes from <element>
+    accumulateInstanceAttributes: function() {
+      // inherit instance attributes
+      var clonable = this.prototype._instanceAttributes;
+      // merge attributes from element
+      var a$ = this.attributes;
+      for (var i=0, l=a$.length, a; (i<l) && (a=a$[i]); i++) {  
+        if (this.isInstanceAttribute(a.name)) {
+          clonable[a.name] = a.value;
+        }
+      }
+    },
+    isInstanceAttribute: function(name) {
+      return !this.blackList[name] && name.slice(0,3) !== 'on-';
+    },
+    // do not clone these attributes onto instances
+    blackList: {
+      name: 1,
+      'extends': 1,
+      constructor: 1,
+      noscript: 1,
+      assetpath: 1,
+      'cache-csstext': 1
+    }
+  };
+
+  // add ATTRIBUTES_ATTRIBUTE to the blacklist
+  attributes.blackList[ATTRIBUTES_ATTRIBUTE] = 1;
+
+  // exports
+
+  scope.api.declaration.attributes = attributes;
+
+})(Polymer);
+
+/*
+ * 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) {
+
+  // imports
+  
+  var api = scope.api;
+  var isBase = scope.isBase;
+  var extend = scope.extend;
+
+  // prototype api
+
+  var prototype = {
+
+    register: function(name, extendeeName) {
+      // build prototype combining extendee, Polymer base, and named api
+      this.buildPrototype(name, extendeeName);
+      // register our custom element with the platform
+      this.registerPrototype(name, extendeeName);
+      // reference constructor in a global named by 'constructor' attribute
+      this.publishConstructor();
+    },
+
+    buildPrototype: function(name, extendeeName) {
+      // get our custom prototype (before chaining)
+      var extension = scope.getRegisteredPrototype(name);
+      // get basal prototype
+      var base = this.generateBasePrototype(extendeeName);
+      // implement declarative features
+      this.desugarBeforeChaining(extension, base);
+      // join prototypes
+      this.prototype = this.chainPrototypes(extension, base);
+      // more declarative features
+      this.desugarAfterChaining(name, extendeeName);
+    },
+
+    desugarBeforeChaining: function(prototype, base) {
+      // back reference declaration element
+      // TODO(sjmiles): replace `element` with `elementElement` or `declaration`
+      prototype.element = this;
+      // transcribe `attributes` declarations onto own prototype's `publish`
+      this.publishAttributes(prototype, base);
+      // `publish` properties to the prototype and to attribute watch
+      this.publishProperties(prototype, base);
+      // infer observers for `observe` list based on method names
+      this.inferObservers(prototype);
+      // desugar compound observer syntax, e.g. 'a b c' 
+      this.explodeObservers(prototype);
+    },
+
+    chainPrototypes: function(prototype, base) {
+      // chain various meta-data objects to inherited versions
+      this.inheritMetaData(prototype, base);
+      // chain custom api to inherited
+      var chained = this.chainObject(prototype, base);
+      // x-platform fixup
+      ensurePrototypeTraversal(chained);
+      return chained;
+    },
+
+    inheritMetaData: function(prototype, base) {
+      // chain observe object to inherited
+      this.inheritObject('observe', prototype, base);
+      // chain publish object to inherited
+      this.inheritObject('publish', prototype, base);
+      // chain our lower-cased publish map to the inherited version
+      this.inheritObject('_publishLC', prototype, base);
+      // chain our instance attributes map to the inherited version
+      this.inheritObject('_instanceAttributes', prototype, base);
+      // chain our event delegates map to the inherited version
+      this.inheritObject('eventDelegates', prototype, base);
+    },
+
+    // implement various declarative features
+    desugarAfterChaining: function(name, extendee) {
+      // build side-chained lists to optimize iterations
+      this.optimizePropertyMaps(this.prototype);
+      // install external stylesheets as if they are inline
+      this.installSheets();
+      // adjust any paths in dom from imports
+      this.resolveElementPaths(this);
+      // compile list of attributes to copy to instances
+      this.accumulateInstanceAttributes();
+      // parse on-* delegates declared on `this` element
+      this.parseHostEvents();
+      //
+      // install a helper method this.resolvePath to aid in 
+      // setting resource urls. e.g.
+      // this.$.image.src = this.resolvePath('images/foo.png')
+      this.addResolvePathApi();
+      // under ShadowDOMPolyfill, transforms to approximate missing CSS features
+      if (window.ShadowDOMPolyfill) {
+        Platform.ShadowCSS.shimStyling(this.templateContent(), name, extendee);
+      }
+      // allow custom element access to the declarative context
+      if (this.prototype.registerCallback) {
+        this.prototype.registerCallback(this);
+      }
+    },
+
+    // if a named constructor is requested in element, map a reference
+    // to the constructor to the given symbol
+    publishConstructor: function() {
+      var symbol = this.getAttribute('constructor');
+      if (symbol) {
+        window[symbol] = this.ctor;
+      }
+    },
+
+    // build prototype combining extendee, Polymer base, and named api
+    generateBasePrototype: function(extnds) {
+      var prototype = this.findBasePrototype(extnds);
+      if (!prototype) {
+        // create a prototype based on tag-name extension
+        var prototype = HTMLElement.getPrototypeForTag(extnds);
+        // insert base api in inheritance chain (if needed)
+        prototype = this.ensureBaseApi(prototype);
+        // memoize this base
+        memoizedBases[extnds] = prototype;
+      }
+      return prototype;
+    },
+
+    findBasePrototype: function(name) {
+      return memoizedBases[name];
+    },
+
+    // install Polymer instance api into prototype chain, as needed 
+    ensureBaseApi: function(prototype) {
+      if (prototype.PolymerBase) {
+        return prototype;
+      }
+      var extended = Object.create(prototype);
+      // we need a unique copy of base api for each base prototype
+      // therefore we 'extend' here instead of simply chaining
+      api.publish(api.instance, extended);
+      // TODO(sjmiles): sharing methods across prototype chains is
+      // not supported by 'super' implementation which optimizes
+      // by memoizing prototype relationships.
+      // Probably we should have a version of 'extend' that is 
+      // share-aware: it could study the text of each function,
+      // look for usage of 'super', and wrap those functions in
+      // closures.
+      // As of now, there is only one problematic method, so 
+      // we just patch it manually.
+      // To avoid re-entrancy problems, the special super method
+      // installed is called `mixinSuper` and the mixin method
+      // must use this method instead of the default `super`.
+      this.mixinMethod(extended, prototype, api.instance.mdv, 'bind');
+      // return buffed-up prototype
+      return extended;
+    },
+
+    mixinMethod: function(extended, prototype, api, name) {
+      var $super = function(args) {
+        return prototype[name].apply(this, args);
+      };
+      extended[name] = function() {
+        this.mixinSuper = $super;
+        return api[name].apply(this, arguments);
+      }
+    },
+
+    // ensure prototype[name] inherits from a prototype.prototype[name]
+    inheritObject: function(name, prototype, base) {
+      // require an object
+      var source = prototype[name] || {};
+      // chain inherited properties onto a new object
+      prototype[name] = this.chainObject(source, base[name]);
+    },
+
+    // register 'prototype' to custom element 'name', store constructor 
+    registerPrototype: function(name, extendee) { 
+      var info = {
+        prototype: this.prototype
+      }
+      // native element must be specified in extends
+      var typeExtension = this.findTypeExtension(extendee);
+      if (typeExtension) {
+        info.extends = typeExtension;
+      }
+      // register the prototype with HTMLElement for name lookup
+      HTMLElement.register(name, this.prototype);
+      // register the custom type
+      this.ctor = document.registerElement(name, info);
+    },
+
+    findTypeExtension: function(name) {
+      if (name && name.indexOf('-') < 0) {
+        return name;
+      } else {
+        var p = this.findBasePrototype(name);
+        if (p.element) {
+          return this.findTypeExtension(p.element.extends);
+        }
+      }
+    }
+
+  };
+
+  // memoize base prototypes
+  var memoizedBases = {};
+
+  // implementation of 'chainObject' depends on support for __proto__
+  if (Object.__proto__) {
+    prototype.chainObject = function(object, inherited) {
+      if (object && inherited && object !== inherited) {
+        object.__proto__ = inherited;
+      }
+      return object;
+    }
+  } else {
+    prototype.chainObject = function(object, inherited) {
+      if (object && inherited && object !== inherited) {
+        var chained = Object.create(inherited);
+        object = extend(chained, object);
+      }
+      return object;
+    }
+  }
+
+  // On platforms that do not support __proto__ (versions of IE), the prototype
+  // chain of a custom element is simulated via installation of __proto__.
+  // Although custom elements manages this, we install it here so it's
+  // available during desugaring.
+  function ensurePrototypeTraversal(prototype) {
+    if (!Object.__proto__) {
+      var ancestor = Object.getPrototypeOf(prototype);
+      prototype.__proto__ = ancestor;
+      if (isBase(ancestor)) {
+        ancestor.__proto__ = Object.getPrototypeOf(ancestor);
+      }
+    }
+  }
+
+  // exports
+
+  api.declaration.prototype = prototype;
+
+})(Polymer);
+
+/*
+ * 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 queue = {
+    // tell the queue to wait for an element to be ready
+    wait: function(element, check, go) {
+      if (this.indexOf(element) === -1) {
+        this.add(element);
+        element.__check = check;
+        element.__go = go;
+      }
+      return (this.indexOf(element) !== 0);
+    },
+    add: function(element) {
+      //console.log('queueing', element.name);
+      queueForElement(element).push(element);
+    },
+    indexOf: function(element) {
+      var i = queueForElement(element).indexOf(element);
+      if (i >= 0 && document.contains(element)) {
+        i += (HTMLImports.useNative || HTMLImports.ready) ? 
+          importQueue.length : 1e9;
+      }
+      return i;  
+    },
+    // tell the queue an element is ready to be registered
+    go: function(element) {
+      var readied = this.remove(element);
+      if (readied) {
+        readied.__go.call(readied);
+        readied.__check = readied.__go = null;
+        this.check();
+      }
+    },
+    remove: function(element) {
+      var i = this.indexOf(element);
+      if (i !== 0) {
+        //console.warn('queue order wrong', i);
+        return;
+      }
+      return queueForElement(element).shift();
+    },
+    check: function() {
+      // next
+      var element = this.nextElement();
+      if (element) {
+        element.__check.call(element);
+      }
+      if (this.canReady()) {
+        this.ready();
+        return true;
+      }
+    },
+    nextElement: function() {
+      return nextQueued();
+    },
+    canReady: function() {
+      return !this.waitToReady && this.isEmpty();
+    },
+    isEmpty: function() {
+      return !importQueue.length && !mainQueue.length;
+    },
+    ready: function() {
+      // TODO(sorvell): As an optimization, turn off CE polyfill upgrading
+      // while registering. This way we avoid having to upgrade each document
+      // piecemeal per registration and can instead register all elements
+      // and upgrade once in a batch. Without this optimization, upgrade time
+      // degrades significantly when SD polyfill is used. This is mainly because
+      // querying the document tree for elements is slow under the SD polyfill.
+      if (CustomElements.ready === false) {
+        CustomElements.upgradeDocumentTree(document);
+        CustomElements.ready = true;
+      }
+      if (readyCallbacks) {
+        var fn;
+        while (readyCallbacks.length) {
+          fn = readyCallbacks.shift();
+          fn();
+        }
+      }
+    },
+    addReadyCallback: function(callback) {
+      if (callback) {
+        readyCallbacks.push(callback);
+      }
+    },
+    waitToReady: true
+  };
+
+  var importQueue = [];
+  var mainQueue = [];
+  var readyCallbacks = [];
+
+  function queueForElement(element) {
+    return document.contains(element) ? mainQueue : importQueue;
+  }
+
+  function nextQueued() {
+    return importQueue.length ? importQueue[0] : mainQueue[0];
+  }
+
+  var polymerReadied = false; 
+
+  document.addEventListener('WebComponentsReady', function() {
+    CustomElements.ready = false;
+  });
+  
+  function whenPolymerReady(callback) {
+    queue.waitToReady = true;
+    CustomElements.ready = false;
+    HTMLImports.whenImportsReady(function() {
+      queue.addReadyCallback(callback);
+      queue.waitToReady = false;
+      queue.check();
+    });
+  }
+
+  // exports
+  scope.queue = queue;
+  scope.whenPolymerReady = whenPolymerReady;
+})(Polymer);
+
+/*
+ * 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 whenPolymerReady = scope.whenPolymerReady;
+
+  function importElements(elementOrFragment, callback) {
+    if (elementOrFragment) {
+      document.head.appendChild(elementOrFragment);
+      whenPolymerReady(callback);
+    } else if (callback) {
+      callback();
+    }
+  }
+
+  function importUrls(urls, callback) {
+    if (urls && urls.length) {
+        var frag = document.createDocumentFragment();
+        for (var i=0, l=urls.length, url, link; (i<l) && (url=urls[i]); i++) {
+          link = document.createElement('link');
+          link.rel = 'import';
+          link.href = url;
+          frag.appendChild(link);
+        }
+        importElements(frag, callback);
+    } else if (callback) {
+      callback();
+    }
+  }
+
+  // exports
+  scope.import = importUrls;
+  scope.importElements = importElements;
+
+})(Polymer);
+
+/*
+ * 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) {
+
+  // imports
+
+  var extend = scope.extend;
+  var api = scope.api;
+  var queue = scope.queue;
+  var whenPolymerReady = scope.whenPolymerReady;
+  var getRegisteredPrototype = scope.getRegisteredPrototype;
+  var waitingForPrototype = scope.waitingForPrototype;
+
+  // declarative implementation: <polymer-element>
+
+  var prototype = extend(Object.create(HTMLElement.prototype), {
+
+    createdCallback: function() {
+      if (this.getAttribute('name')) {
+        this.init();
+      }
+    },
+
+    init: function() {
+      // fetch declared values
+      this.name = this.getAttribute('name');
+      this.extends = this.getAttribute('extends');
+      // initiate any async resource fetches
+      this.loadResources();
+      // register when all constraints are met
+      this.registerWhenReady();
+    },
+
+    registerWhenReady: function() {
+     if (this.registered
+       || this.waitingForPrototype(this.name)
+       || this.waitingForQueue()
+       || this.waitingForResources()) {
+          return;
+      }
+      // TODO(sorvell): ends up calling '_register' by virtue
+      // of `waitingForQueue` (see below)
+      queue.go(this);
+    },
+
+    // TODO(sorvell): refactor, this method is private-ish, but it's being
+    // called by the queue object.
+    _register: function() {
+      //console.log('registering', this.name);
+      //console.group('registering', this.name);
+      // warn if extending from a custom element not registered via Polymer
+      if (isCustomTag(this.extends) && !isRegistered(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 = true;
+      //console.groupEnd();
+    },
+
+    waitingForPrototype: function(name) {
+      if (!getRegisteredPrototype(name)) {
+        // then wait for a prototype
+        waitingForPrototype(name, this);
+        // emulate script if user is not supplying one
+        this.handleNoScript(name);
+        // prototype not ready yet
+        return true;
+      }
+    },
+
+    handleNoScript: function(name) {
+      // if explicitly marked as 'noscript'
+      if (this.hasAttribute('noscript') && !this.noscript) {
+        this.noscript = true;
+        // TODO(sorvell): CustomElements polyfill awareness:
+        // noscript elements should upgrade in logical order
+        // script injection ensures this under native custom elements;
+        // under imports + ce polyfills, scripts run before upgrades.
+        // dependencies should be ready at upgrade time so register
+        // prototype at this time.
+        if (window.CustomElements && !CustomElements.useNative) {
+          Polymer(name);
+        } else {
+          var script = document.createElement('script');
+          script.textContent = 'Polymer(\'' + name + '\');';
+          this.appendChild(script);
+        }
+      }
+    },
+
+    waitingForResources: function() {
+      return this._needsResources;
+    },
+
+    // NOTE: Elements must be queued in proper order for inheritance/composition
+    // dependency resolution. Previously this was enforced for inheritance,
+    // and by rule for composition. It's now entirely by rule.
+    waitingForQueue: function() {
+      return queue.wait(this, this.registerWhenReady, this._register);
+    },
+
+    loadResources: function() {
+      this._needsResources = true;
+      this.loadStyles(function() {
+        this._needsResources = false;
+        this.registerWhenReady();
+      }.bind(this));
+    }
+
+  });
+
+  // semi-pluggable APIs 
+
+  // TODO(sjmiles): should be fully pluggable (aka decoupled, currently
+  // the various plugins are allowed to depend on each other directly)
+  api.publish(api.declaration, prototype);
+
+  // utility and bookkeeping
+
+  function isRegistered(name) {
+    return Boolean(HTMLElement.getPrototypeForTag(name));
+  }
+
+  function isCustomTag(name) {
+    return (name && name.indexOf('-') >= 0);
+  }
+
+  // exports
+
+  scope.getRegisteredPrototype = getRegisteredPrototype;
+  
+  // boot tasks
+
+  whenPolymerReady(function() {
+    document.body.removeAttribute('unresolved');
+    document.dispatchEvent(
+      new CustomEvent('polymer-ready', {bubbles: true})
+    );
+  });
+
+  // register polymer-element with document
+
+  document.registerElement('polymer-element', {prototype: prototype});
+
+})(Polymer);
+
+//# sourceMappingURL=polymer.concat.js.map
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js.map b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js.map
new file mode 100644
index 0000000..eed265f
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js.map
@@ -0,0 +1,60 @@
+{
+  "version": 3,
+  "file": "polymer.concat.js",
+  "sources": [
+    "src/polymer.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/prototype.js",
+    "src/declaration/queue.js",
+    "src/declaration/import.js",
+    "src/declaration/polymer-element.js"
+  ],
+  "names": [],
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,Y;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
+  "sourcesContent": [
+    "/*\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 */\nPolymer = {};\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// 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 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  // 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 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  // 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 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  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",
+    "/*\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    // super\n\n    // `arrayOfArgs` is an optional array of args like one might pass\n    // to `Function.apply`\n\n    // TODO(sjmiles):\n    //    $super must be installed on an instance or prototype chain\n    //    as `super`, and invoked via `this`, e.g.\n    //      `this.super();`\n\n    //    will not work if function objects are not unique, for example,\n    //    when using mixins.\n    //    The memoization strategy assumes each function exists on only one \n    //    prototype chain i.e. we use the function object for memoizing)\n    //    perhaps we can bookkeep on the prototype itself instead\n    function $super(arrayOfArgs) {\n      // since we are thunking a method call, performance is important here: \n      // memoize all lookups, once memoized the fast path calls no other \n      // functions\n      //\n      // find the caller (cannot be `strict` because of 'caller')\n      var caller = $super.caller;\n      // memoized 'name of method' \n      var nom = caller.nom;\n      // memoized next implementation prototype\n      var _super = caller._super;\n      if (!_super) {\n        if (!nom) {\n          nom = caller.nom = nameInThis.call(this, caller);\n        }\n        if (!nom) {\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\n        }\n        // super prototype is either cached or we have to find it\n        // by searching __proto__ (at the 'top')\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\n      }\n      if (!_super) {\n        // if _super is falsey, there is no super implementation\n        //console.warn('called $super(' + nom + ') where there is no super implementation');\n      } else {\n        // our super function\n        var fn = _super[nom];\n        // memoize information so 'fn' can call 'super'\n        if (!fn._super) {\n          memoizeSuper(fn, nom, _super);\n        }\n        // invoke the inherited method\n        // if 'fn' is not function valued, this will throw\n        return fn.apply(this, arrayOfArgs || []);\n      }\n    }\n\n    function nextSuper(proto, name, caller) {\n      // look for an inherited prototype that implements name\n      while (proto) {\n        if ((proto[name] !== caller) && proto[name]) {\n          return proto;\n        }\n        proto = getPrototypeOf(proto);\n      }\n    }\n\n    function memoizeSuper(method, name, proto) {\n      // find and cache next prototype containing `name`\n      // we need the prototype so we can do another lookup\n      // from here\n      method._super = nextSuper(proto, name, method);\n      if (method._super) {\n        // _super is a prototype, the actual method is _super[name]\n        // tag super method with it's name for further lookups\n        method._super[name].nom = name;\n      }\n      return method._super;\n    }\n\n    function nameInThis(value) {\n      var p = this.__proto__;\n      while (p && p !== HTMLElement.prototype) {\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\n        var n$ = Object.getOwnPropertyNames(p);\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\n          var d = Object.getOwnPropertyDescriptor(p, n);\n          if (typeof d.value === 'function' && d.value === value) {\n            return n;\n          }\n        }\n        p = p.__proto__;\n      }\n    }\n\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \n    // __proto__. Therefore, always get prototype via __proto__ instead of\n    // the more standard Object.getPrototypeOf.\n    function getPrototypeOf(prototype) {\n      return prototype.__proto__;\n    }\n\n    // utility function to precompute name tags for functions\n    // in a (unchained) prototype\n    function hintSuper(prototype) {\n      // tag functions with their prototype name to optimize\n      // super call invocations\n      for (var n in prototype) {\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\n        if (pd && typeof pd.value === 'function') {\n          pd.value.nom = n;\n        }\n      }\n    }\n\n    // exports\n\n    scope.super = $super;\n\n})(Polymer);\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  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 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  // 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 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  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\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 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\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      // We do, however, leverage the event hookup code in PolymerExpressions\n      // so that we have a common code path for handling declarative events.\n      var self = this, bindable, eventName;\n      for (var n in events) {\n        eventName = EVENT_PREFIX + n;\n        bindable = PolymerExpressions.prepareEventBinding(\n          Path.get(events[n]),\n          eventName, \n          {\n            resolveEventHandler: function(model, path, node) {\n              var fn = path.getValueFrom(self);\n              if (fn) {\n                return fn.bind(self);\n              }\n            }\n          }\n        );\n        bindable(this, this, false);\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 2013 The Polymer Authors. All rights reserved.\r\n * Use of this source code is governed by a BSD-style\r\n * license that can be found in the LICENSE file.\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 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  // 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 properties = {\n    observeProperties: function() {\n      var n$ = this._observeNames, pn$ = this._publishNames;\n      if ((n$ && n$.length) || (pn$ && pn$.length)) {\n        var self = this;\n        var o = this._propertyObserver = new CompoundObserver();\n        // keep track of property observer so we can shut it down\n        this.registerObservers([o]);\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          // observer array properties\n          var pd = Object.getOwnPropertyDescriptor(this.__proto__, n);\n          if (pd && pd.value) {\n            this.observeArrayValue(n, pd.value, null);\n          }\n        }\n        for (var i=0, l=pn$.length, n; (i<l) && (n=pn$[i]); i++) {\n          if (!this.observe || (this.observe[n] === undefined)) {\n            o.addPath(this, n);\n          }\n        }\n        o.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        if (this.publish[name] !== undefined) {\n          this.reflectPropertyToAttribute(name);\n        }\n        method = this.observe[name];\n        if (method) {\n          this.observeArrayValue(name, newValues[i], oldValues[i]);\n          if (!called[method]) {\n            called[method] = true;\n            // observes the value if it is an array\n            this.invokeMethod(method, [oldValues[i], newValues[i], arguments]);\n          }\n        }\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    bindProperty: function(property, observable) {\n      // apply Polymer two-way reference binding\n      return bindProperties(this, property, observable);\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    registerObservers: function(observers) {\n      this._observers.push(observers);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      for (var i=0, l=this._observers.length; i<l; i++) {\n        this.closeObserverArray(this._observers[i]);\n      }\n      this._observers = [];\n    },\n    closeObserverArray: function(observerArray) {\n      for (var i=0, l=observerArray.length, o; i<l; i++) {\n        o = observerArray[i];\n        if (o && o.close) {\n          o.close();\n        }\n      }\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        var keys=Object.keys(this._namedObservers);\n        for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {\n          o = this._namedObservers[k];\n          o.close();\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // property binding\n  // bind a property in A to a path in B by converting A[property] to a\n  // getter/setter pair that accesses B[...path...]\n  function bindProperties(inA, inProperty, observable) {\n    log.bind && console.log(LOG_BIND_PROPS, inB.localName || 'object', inPath, inA.localName, inProperty);\n    // capture A's value if B's value is null or undefined,\n    // otherwise use B's value\n    // TODO(sorvell): need to review, can do with ObserverTransform\n    var v = observable.discardChanges();\n    if (v === null || v === undefined) {\n      observable.setValue(inA[inProperty]);\n    }\n    return Observer.defineComputedProperty(inA, inProperty, observable);\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  var LOG_BIND_PROPS = \"[%s]: bindProperties: [%s] to [%s].[%s]\";\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\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(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n  var events = scope.api.instance.events;\n\n  var syntax = new PolymerExpressions();\n  syntax.resolveEventHandler = function(model, path, node) {\n    var ctlr = findEventController(node);\n    if (ctlr) {\n      var fn = path.getValueFrom(ctlr);\n      if (fn) {\n        return fn.bind(ctlr);\n      }\n    }\n  }\n\n  // An event controller is the host element for the shadowRoot in which \n  // the node exists, or the first ancestor with a 'lightDomController'\n  // property.\n  function findEventController(node) {\n    while (node.parentNode) {\n      if (node.lightDomController) {\n        return node;\n      }\n      node = node.parentNode;\n    }\n    return node.host;\n  };\n\n  // element api supporting mdv\n\n  var mdv = {\n    syntax: syntax,\n    instanceTemplate: function(template) {\n      var dom = template.createInstance(this, this.syntax);\n      this.registerObservers(dom.bindings_);\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);\n        this.reflectPropertyToAttribute(property);\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) {\n          observer.path = observable.path_;\n          this.bindings_ = this.bindings_ || {};\n          this.bindings_[name] = observer;\n        }\n        return observer;\n      }\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 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  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    },\n    // system entry point, do not override\n    prepareElement: function() {\n      this._elementPrepared = true;\n      // install shadowRoots storage\n      this.shadowRoots = {};\n      // storage for closeable observers.\n      this._observers = [];\n      // install property observers\n      this.observeProperties();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\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 a lightDOMController 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.lightDomController = true;\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 pointer gestures\n      PointerGestures.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 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  // 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      scope._scopeStyles[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      scope._scopeStyles = scope._scopeStyles || {};\n      return scope._scopeStyles[name];\n    }\n  };\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 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  // 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 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 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 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  // 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 content = this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n      }\n      var styles = this.findLoadableStyles(content);\n      if (styles.length) {\n        Platform.styleResolver.loadStyles(styles, callback);\n      } else 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    templateContent: function() {\n      var template = this.querySelector('template');\n      return template && templateContent(template);\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 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\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 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  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);",
+    "/*\r\n * Copyright 2013 The Polymer Authors. All rights reserved.\r\n * Use of this source code is governed by a BSD-style\r\n * license that can be found in the LICENSE file.\r\n */\r\n(function(scope) {\r\n\r\n  // element api\r\n\r\n  var properties = {\r\n    inferObservers: function(prototype) {\r\n      // called before prototype.observe is chained to inherited object\r\n      var observe = prototype.observe, property;\r\n      for (var n in prototype) {\r\n        if (n.slice(-7) === 'Changed') {\r\n          if (!observe) {\r\n            observe  = (prototype.observe = {});\r\n          }\r\n          property = n.slice(0, -7)\r\n          observe[property] = observe[property] || n;\r\n        }\r\n      }\r\n    },\r\n    explodeObservers: function(prototype) {\r\n      // called before prototype.observe is chained to inherited object\r\n      var o = prototype.observe;\r\n      if (o) {\r\n        var exploded = {};\r\n        for (var n in o) {\r\n          var names = n.split(' ');\r\n          for (var i=0, ni; ni=names[i]; i++) {\r\n            exploded[ni] = o[n];\r\n          }\r\n        }\r\n        prototype.observe = exploded;\r\n      }\r\n    },\r\n    optimizePropertyMaps: function(prototype) {\r\n      if (prototype.observe) {\r\n        // construct name list\r\n        var a = prototype._observeNames = [];\r\n        for (var n in prototype.observe) {\r\n          var names = n.split(' ');\r\n          for (var i=0, ni; ni=names[i]; i++) {\r\n            a.push(ni);\r\n          }\r\n        }\r\n      }\r\n      if (prototype.publish) {\r\n        // construct name list\r\n        var a = prototype._publishNames = [];\r\n        for (var n in prototype.publish) {\r\n          a.push(n);\r\n        }\r\n      }\r\n    },\r\n    publishProperties: function(prototype, base) {\r\n      // if we have any properties to publish\r\n      var publish = prototype.publish;\r\n      if (publish) {\r\n        // transcribe `publish` entries onto own prototype\r\n        this.requireProperties(publish, prototype, base);\r\n        // construct map of lower-cased property names\r\n        prototype._publishLC = this.lowerCaseMap(publish);\r\n      }\r\n    },\r\n    requireProperties: function(properties, prototype, base) {\r\n      // ensure a prototype value for each property\r\n      for (var n in properties) {\r\n        if (prototype[n] === undefined && base[n] === undefined) {\r\n          prototype[n] = properties[n];\r\n        }\r\n      }\r\n    },\r\n    lowerCaseMap: function(properties) {\r\n      var map = {};\r\n      for (var n in properties) {\r\n        map[n.toLowerCase()] = n;\r\n      }\r\n      return map;\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.declaration.properties = properties;\r\n\r\n})(Polymer);\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(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    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    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          // do not override explicit entries\n          if (n && publish[n] === undefined && base[n] === undefined) {\n            publish[n] = null;\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    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\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  // 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 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  // 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 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      // 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 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  var queue = {\n    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      if (this.indexOf(element) === -1) {\n        this.add(element);\n        element.__check = check;\n        element.__go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n    add: function(element) {\n      //console.log('queueing', element.name);\n      queueForElement(element).push(element);\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    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        readied.__go.call(readied);\n        readied.__check = readied.__go = null;\n        this.check();\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    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n    nextElement: function() {\n      return nextQueued();\n    },\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n    isEmpty: function() {\n      return !importQueue.length && !mainQueue.length;\n    },\n    ready: function() {\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      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n    waitToReady: true\n  };\n\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.queue = queue;\n  scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\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(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 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  // 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      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      // TODO(sorvell): ends up calling '_register' by virtue\n      // of `waitingForQueue` (see below)\n      queue.go(this);\n    },\n\n    // TODO(sorvell): refactor, this method is private-ish, but it's being\n    // called by the queue object.\n    _register: function() {\n      //console.log('registering', this.name);\n      //console.group('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      //console.groupEnd();\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        // TODO(sorvell): CustomElements polyfill awareness:\n        // noscript elements should upgrade in logical order\n        // script injection ensures this under native custom elements;\n        // under imports + ce polyfills, scripts run before upgrades.\n        // dependencies should be ready at upgrade time so register\n        // prototype at this time.\n        if (window.CustomElements && !CustomElements.useNative) {\n          Polymer(name);\n        } else {\n          var script = document.createElement('script');\n          script.textContent = 'Polymer(\\'' + name + '\\');';\n          this.appendChild(script);\n        }\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.wait(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  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\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"
+  ]
+}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.html b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.html
new file mode 100644
index 0000000..ae23866
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.html
@@ -0,0 +1,8 @@
+<!--
+ 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.
+-->
+<script src="polymer.js"></script>
+<!-- <link rel="import" href="../polymer-dev/polymer.html"> -->
+<link rel="import" href="polymer-body.html">
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.js b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.js
new file mode 100644
index 0000000..170c124
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.js
@@ -0,0 +1,33 @@
+/**
+ * @license
+ * Copyright (c) 2012-2014 The Polymer 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.
+ */
+// @version: 0.2.2-40bde06
+Polymer={},"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 c=b.caller,g=c.nom,h=c._super;if(h||(g||(g=c.nom=e.call(this,c)),g||console.warn("called super() on a method not installed declaratively (has no .nom property)"),h=d(c,g,f(this))),h){var i=h[g];return i._super||d(i,g,h),i.apply(this,a||[])}}function c(a,b,c){for(;a;){if(a[b]!==c&&a[b])return a;a=f(a)}}function d(a,b,d){return a._super=c(d,b,a),a._super&&(a._super[b].nom=b),a._super}function e(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 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)}},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);var d,e,f=this;for(var g in a)e=c+g,(d=PolymerExpressions.prepareEventBinding(Path.get(a[g]),e,{resolveEventHandler:function(a,b){var c=b.getValueFrom(f);return c?c.bind(f):void 0}}))(this,this,!1)},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,d){c.bind&&console.log(e,inB.localName||"object",inPath,a.localName,b);var f=d.discardChanges();return(null===f||void 0===f)&&d.setValue(a[b]),Observer.defineComputedProperty(a,b,d)}var c=window.logFlags||{},d={observeProperties:function(){var a=this._observeNames,b=this._publishNames;if(a&&a.length||b&&b.length){var c=this._propertyObserver=new CompoundObserver;this.registerObservers([c]);for(var d,e=0,f=a.length;f>e&&(d=a[e]);e++){c.addPath(this,d);var g=Object.getOwnPropertyDescriptor(this.__proto__,d);g&&g.value&&this.observeArrayValue(d,g.value,null)}for(var d,e=0,f=b.length;f>e&&(d=b[e]);e++)this.observe&&void 0!==this.observe[d]||c.addPath(this,d);c.open(this.notifyPropertyChanges,this)}},notifyPropertyChanges:function(a,b,c){var d,e,f={};for(var g in b)d=c[2*g+1],void 0!==this.publish[d]&&this.reflectPropertyToAttribute(d),e=this.observe[d],e&&(this.observeArrayValue(d,a[g],b[g]),f[e]||(f[e]=!0,this.invokeMethod(e,[b[g],a[g],arguments])))},observeArrayValue:function(a,b,d){var e=this.observe[a];if(e&&(Array.isArray(d)&&(c.observe&&console.log("[%s] observeArrayValue: unregister observer [%s]",this.localName,a),this.closeNamedObserver(a+"__array")),Array.isArray(b))){c.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)}},bindProperty:function(a,c){return b(this,a,c)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObservers:function(a){this._observers.push(a)},closeObservers:function(){for(var a=0,b=this._observers.length;b>a;a++)this.closeObserverArray(this._observers[a]);this._observers=[]},closeObserverArray:function(a){for(var b,c=0,d=a.length;d>c;c++)b=a[c],b&&b.close&&b.close()},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,b,c=Object.keys(this._namedObservers),d=0,e=c.length;e>d&&(a=c[d]);d++)b=this._namedObservers[a],b.close();this._namedObservers={}}}},e="[%s]: bindProperties: [%s] to [%s].[%s]";a.api.instance.properties=d}(Polymer),function(a){function b(a){for(;a.parentNode;){if(a.lightDomController)return a;a=a.parentNode}return a.host}var c=window.logFlags||0,d=(a.api.instance.events,new PolymerExpressions);d.resolveEventHandler=function(a,c,d){var e=b(d);if(e){var f=c.getValueFrom(e);if(f)return f.bind(e)}};var e={syntax:d,instanceTemplate:function(a){var b=a.createInstance(this,this.syntax);return this.registerObservers(b.bindings_),b},bind:function(a,b){var c=this.propertyForAttribute(a);if(c){var d=this.bindProperty(c,b);return this.reflectPropertyToAttribute(c),Platform.enableBindingsReflection&&(d.path=b.path_,this.bindings_=this.bindings_||{},this.bindings_[a]=d),d}return this.mixinSuper(arguments)},asyncUnbindAll:function(){this._unbound||(c.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(c.unbind&&console.warn("[%s] already unbound, cannot cancel unbindAll",this.localName)):(c.unbind&&console.log("[%s] cancelUnbindAll",this.localName),void(this._unbindAllJob&&(this._unbindAllJob=this._unbindAllJob.stop())))}},f=/\{\{([^{}]*)}}/;a.bindPattern=f,a.api.instance.mdv=e}(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()},prepareElement:function(){this._elementPrepared=!0,this.shadowRoots={},this._observers=[],this.observeProperties(),this.copyInstanceAttributes(),this.takeAttributes(),this.addHostListeners(),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.lightDomController=!0;var c=this.instanceTemplate(a);return b?this.insertBefore(c,b):this.appendChild(c),this.shadowRootReady(this),c}},shadowRootReady:function(a){this.marshalNodeReferences(a),PointerGestures.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),b._scopeStyles[this.localName+d]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){return a._scopeStyles=a._scopeStyles||{},a._scopeStyles[b]}};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.templateContent();b&&this.convertSheetsToStyles(b);var c=this.findLoadableStyles(b);c.length?Platform.styleResolver.loadStyles(c,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},templateContent:function(){var a=this.querySelector("template");return a&&templateContent(a)},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={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(e)}},e=c.length;a.api.declaration.events=d}(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)}},publishProperties:function(a,b){var c=a.publish;c&&(this.requireProperties(c,a,b),a._publishLC=this.lowerCaseMap(c))},requireProperties:function(a,b,c){for(var d in a)void 0===b[d]&&void 0===c[d]&&(b[d]=a[d])},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b}};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++)f=h[i].trim(),f&&void 0===g[f]&&void 0===d[f]&&(g[f]=null)},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){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("_publishLC",a,b),this.inheritObject("_instanceAttributes",a,b),this.inheritObject("eventDelegates",a,b)},desugarAfterChaining:function(a,b){this.optimizePropertyMaps(this.prototype),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)?g:f}function c(){return f.length?f[0]:g[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,b,c){return-1===this.indexOf(a)&&(this.add(a),a.__check=b,a.__go=c),0!==this.indexOf(a)},add:function(a){b(a).push(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?f.length:1e9),c},go:function(a){var b=this.remove(a);b&&(b.__go.call(b),b.__check=b.__go=null,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.__check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){return!f.length&&!g.length},ready:function(){if(CustomElements.ready===!1&&(CustomElements.upgradeDocumentTree(document),CustomElements.ready=!0),h)for(var a;h.length;)(a=h.shift())()},addReadyCallback:function(a){a&&h.push(a)},waitToReady:!0},f=[],g=[],h=[];document.addEventListener("WebComponentsReady",function(){CustomElements.ready=!1}),a.queue=e,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"),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){if(this.hasAttribute("noscript")&&!this.noscript)if(this.noscript=!0,window.CustomElements&&!CustomElements.useNative)Polymer(a);else{var b=document.createElement("script");b.textContent="Polymer('"+a+"');",this.appendChild(b)}},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.wait(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),a.getRegisteredPrototype=h,g(function(){document.body.removeAttribute("unresolved"),document.dispatchEvent(new CustomEvent("polymer-ready",{bubbles:!0}))}),document.registerElement("polymer-element",{prototype:j})}(Polymer);
+//# sourceMappingURL=polymer.js.map
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.js.map b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.js.map
new file mode 100644
index 0000000..81a7e7a
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"polymer.js","sources":["../src/polymer.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/prototype.js","../src/declaration/queue.js","../src/declaration/import.js","../src/declaration/polymer-element.js"],"names":["Polymer","window","scope","extend","prototype","api","Object","getOwnPropertyNames","forEach","n","pd","getOwnPropertyDescriptor","defineProperty","value","nom","job","callback","wait","stop","Job","this","go","inContext","context","boundComplete","complete","bind","h","setTimeout","handle","clearTimeout","requestAnimationFrame","cancelAnimationFrame","call","registry","HTMLElement","register","tag","getPrototypeForTag","getPrototypeOf","document","createElement","originalStopPropagation","Event","stopPropagation","cancelBubble","apply","arguments","$super","arrayOfArgs","caller","_super","nameInThis","console","warn","memoizeSuper","fn","nextSuper","proto","name","method","p","__proto__","n$","i","l","length","d","super","deserializeValue","currentValue","inferredType","Date","typeHandlers","string","date","parse","now","boolean","number","parseFloat","parseInt","isNaN","object","JSON","replace","e","function","declaration","instance","publish","apis","utils","async","args","timeout","Platform","flush","cancelAsync","fire","type","detail","onNode","bubbles","cancelable","node","event","CustomEvent","undefined","dispatchEvent","asyncFire","classFollows","anew","old","className","classList","remove","add","nop","nob","asyncMethod","log","logFlags","EVENT_PREFIX","events","addHostListeners","eventDelegates","keys","localName","bindable","eventName","self","PolymerExpressions","prepareEventBinding","Path","get","resolveEventHandler","model","path","getValueFrom","dispatchMethod","obj","group","groupEnd","attributes","copyInstanceAttributes","a$","_instanceAttributes","k","hasAttribute","setAttribute","takeAttributes","_publishLC","a","attributeToProperty","propertyForAttribute","search","bindPattern","match","stringValue","serializeValue","reflectPropertyToAttribute","serializedValue","removeAttribute","bindProperties","inA","inProperty","observable","LOG_BIND_PROPS","inB","inPath","v","discardChanges","setValue","Observer","defineComputedProperty","properties","observeProperties","_observeNames","pn$","_publishNames","o","_propertyObserver","CompoundObserver","registerObservers","addPath","observeArrayValue","observe","open","notifyPropertyChanges","newValues","oldValues","paths","called","invokeMethod","callbackName","Array","isArray","closeNamedObserver","observer","ArrayObserver","registerNamedObserver","bindProperty","property","observers","_observers","push","closeObservers","closeObserverArray","observerArray","close","o$","_namedObservers","closeNamedObservers","findEventController","parentNode","lightDomController","host","syntax","ctlr","mdv","instanceTemplate","template","dom","createInstance","bindings_","enableBindingsReflection","path_","mixinSuper","asyncUnbindAll","_unbound","unbind","_unbindAllJob","unbindAll","cancelUnbindAll","mustachePattern","isBase","hasOwnProperty","PolymerBase","base","created","ready","createdCallback","templateInstance","prepareElement","_elementPrepared","shadowRoots","parseDeclarations","attachedCallback","attached","enteredView","hasBeenAttached","domReady","detachedCallback","preventDispose","detached","leftView","enteredViewCallback","leftViewCallback","enteredDocumentCallback","leftDocumentCallback","element","parseDeclaration","elementElement","fetchTemplate","root","shadowFromTemplate","querySelector","createShadowRoot","appendChild","shadowRootReady","lightFromTemplate","refNode","insertBefore","marshalNodeReferences","PointerGestures","$","querySelectorAll","id","attributeChangedCallback","getAttribute","attributeChanged","onMutation","listener","MutationObserver","mutations","disconnect","childList","subtree","constructor","Base","shimCssText","cssText","is","selector","ShadowCSS","makeScopeSelector","STYLE_SCOPE_ATTRIBUTE","STYLE_CONTROLLER_SCOPE","styles","installControllerStyles","findStyleScope","scopeHasNamedStyle","cssTextForScope","installScopeCssText","installScopeStyle","style","s","textContent","ShadowDOMPolyfill","cssTextToScopeStyle","applyStyleToScope","_scopeStyles","script","_currentScript","getRegisteredPrototype","registerPrototype","notifyPrototype","waitingForPrototype","client","waitPrototype","registerWhenReady","prototypesByName","declarations","deliverDeclarations","resolveElementPaths","urlResolver","resolveDom","addResolvePathApi","assetPath","URL","ownerDocument","baseURI","resolvePath","urlPath","u","href","importRuleForSheet","sheet","baseUrl","head","clone","createStyleElement","attr","firstElementChild","s$","nextElementSibling","cssTextFromSheet","__resource","matchesSelector","inSelector","matches","STYLE_SELECTOR","STYLE_LOADABLE_MATCH","SHEET_SELECTOR","STYLE_GLOBAL_SCOPE","SCOPE_ATTR","loadStyles","content","templateContent","convertSheetsToStyles","findLoadableStyles","styleResolver","c","copySheetAttributes","replaceChild","link","loadables","installSheets","cacheSheets","cacheStyles","installLocalSheets","installGlobalStyles","sheets","findNodes","removeChild","filter","firstChild","matcher","nodes","array","templateNodes","concat","styleForScope","scopeDescriptor","webkitMatchesSelector","mozMatchesSelector","parseHostEvents","delegates","addAttributeDelegates","hasEventPrefix","removeEventPrefix","trim","slice","prefixLength","inferObservers","explodeObservers","exploded","ni","names","split","optimizePropertyMaps","publishProperties","requireProperties","lowerCaseMap","map","toLowerCase","ATTRIBUTES_ATTRIBUTE","ATTRIBUTES_REGEX","inheritAttributesObjects","inheritObject","publishAttributes","accumulateInstanceAttributes","clonable","isInstanceAttribute","blackList","extends","noscript","assetpath","cache-csstext","ensurePrototypeTraversal","ancestor","extendeeName","buildPrototype","publishConstructor","extension","generateBasePrototype","desugarBeforeChaining","chainPrototypes","desugarAfterChaining","inheritMetaData","chained","chainObject","extendee","shimStyling","registerCallback","symbol","ctor","extnds","findBasePrototype","ensureBaseApi","memoizedBases","extended","create","mixinMethod","source","info","typeExtension","findTypeExtension","registerElement","indexOf","inherited","queueForElement","contains","mainQueue","importQueue","nextQueued","whenPolymerReady","queue","waitToReady","CustomElements","HTMLImports","whenImportsReady","addReadyCallback","check","__check","__go","useNative","readied","shift","nextElement","canReady","isEmpty","upgradeDocumentTree","readyCallbacks","addEventListener","importElements","elementOrFragment","importUrls","urls","url","frag","createDocumentFragment","rel","import","isRegistered","Boolean","isCustomTag","init","loadResources","registered","waitingForQueue","waitingForResources","_register","handleNoScript","_needsResources","body"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKAA,WCI8B,kBAAnBC,QAAOD,UAChBA,YCLF,SAAUE,GAGR,QAASC,GAAOC,EAAWC,GAiBzB,MAhBID,IAAaC,GAEfC,OAAOC,oBAAoBF,GAAKG,QAAQ,SAASC,GAE/C,GAAIC,GAAKJ,OAAOK,yBAAyBN,EAAKI,EAC1CC,KAEFJ,OAAOM,eAAeR,EAAWK,EAAGC,GAEb,kBAAZA,GAAGG,QAEZH,EAAGG,MAAMC,IAAML,MAKhBL,EAKTF,EAAMC,OAASA,GAEdH,SC1BH,SAAUE,GA6CR,QAASa,GAAIA,EAAKC,EAAUC,GAO1B,MANIF,GACFA,EAAIG,OAEJH,EAAM,GAAII,GAAIC,MAEhBL,EAAIM,GAAGL,EAAUC,GACVF,EAzCT,GAAII,GAAM,SAASG,GACjBF,KAAKG,QAAUD,EACfF,KAAKI,cAAgBJ,KAAKK,SAASC,KAAKN,MAE1CD,GAAIf,WACFiB,GAAI,SAASL,EAAUC,GACrBG,KAAKJ,SAAWA,CAChB,IAAIW,EACCV,IAMHU,EAAIC,WAAWR,KAAKI,cAAeP,GACnCG,KAAKS,OAAS,WACZC,aAAaH,MAPfA,EAAII,sBAAsBX,KAAKI,eAC/BJ,KAAKS,OAAS,WACZG,qBAAqBL,MAS3BT,KAAM,WACAE,KAAKS,SACPT,KAAKS,SACLT,KAAKS,OAAS,OAGlBJ,SAAU,WACJL,KAAKS,SACPT,KAAKF,OACLE,KAAKJ,SAASiB,KAAKb,KAAKG,YAiB9BrB,EAAMa,IAAMA,GAEXf,SC5DH,WAEE,GAAIkC,KAEJC,aAAYC,SAAW,SAASC,EAAKjC,GACnC8B,EAASG,GAAOjC,GAIlB+B,YAAYG,mBAAqB,SAASD,GACxC,GAAIjC,GAAaiC,EAA8BH,EAASG,GAAjCF,YAAY/B,SAEnC,OAAOA,IAAaE,OAAOiC,eAAeC,SAASC,cAAcJ,IAInE,IAAIK,GAA0BC,MAAMvC,UAAUwC,eAC9CD,OAAMvC,UAAUwC,gBAAkB,WAChCxB,KAAKyB,cAAe,EACpBH,EAAwBI,MAAM1B,KAAM2B,aASrC/C,SC5BF,SAAUE,GAgBP,QAAS8C,GAAOC,GAMd,GAAIC,GAASF,EAAOE,OAEhBpC,EAAMoC,EAAOpC,IAEbqC,EAASD,EAAOC,MAYpB,IAXKA,IACErC,IACHA,EAAMoC,EAAOpC,IAAMsC,EAAWnB,KAAKb,KAAM8B,IAEtCpC,GACHuC,QAAQC,KAAK,iFAIfH,EAASI,EAAaL,EAAQpC,EAAKyB,EAAenB,QAE/C+B,EAGE,CAEL,GAAIK,GAAKL,EAAOrC,EAOhB,OALK0C,GAAGL,QACNI,EAAaC,EAAI1C,EAAKqC,GAIjBK,EAAGV,MAAM1B,KAAM6B,QAI1B,QAASQ,GAAUC,EAAOC,EAAMT,GAE9B,KAAOQ,GAAO,CACZ,GAAKA,EAAMC,KAAUT,GAAWQ,EAAMC,GACpC,MAAOD,EAETA,GAAQnB,EAAemB,IAI3B,QAASH,GAAaK,EAAQD,EAAMD,GAUlC,MANAE,GAAOT,OAASM,EAAUC,EAAOC,EAAMC,GACnCA,EAAOT,SAGTS,EAAOT,OAAOQ,GAAM7C,IAAM6C,GAErBC,EAAOT,OAGhB,QAASC,GAAWvC,GAElB,IADA,GAAIgD,GAAIzC,KAAK0C,UACND,GAAKA,IAAM1B,YAAY/B,WAAW,CAGvC,IAAK,GAAsBK,GADvBsD,EAAKzD,OAAOC,oBAAoBsD,GAC3BG,EAAE,EAAGC,EAAEF,EAAGG,OAAaD,EAAFD,IAAQvD,EAAEsD,EAAGC,IAAKA,IAAK,CACnD,GAAIG,GAAI7D,OAAOK,yBAAyBkD,EAAGpD,EAC3C,IAAuB,kBAAZ0D,GAAEtD,OAAwBsD,EAAEtD,QAAUA,EAC/C,MAAOJ,GAGXoD,EAAIA,EAAEC,WAOV,QAASvB,GAAenC,GACtB,MAAOA,GAAU0D,UAkBnB5D,EAAMkE,MAAQpB,GAEfhD,SCnHH,SAAUE,GA8CR,QAASmE,GAAiBxD,EAAOyD,GAE/B,GAAIC,SAAsBD,EAM1B,OAJIA,aAAwBE,QAC1BD,EAAe,QAGVE,EAAaF,GAAc1D,EAAOyD,GApD3C,GAAIG,IACFC,OAAQ,SAAS7D,GACf,MAAOA,IAET8D,KAAM,SAAS9D,GACb,MAAO,IAAI2D,MAAKA,KAAKI,MAAM/D,IAAU2D,KAAKK,QAE5CC,UAAS,SAASjE,GAChB,MAAc,KAAVA,GACK,EAEQ,UAAVA,GAAoB,IAAUA,GAEvCkE,OAAQ,SAASlE,GACf,GAAIJ,GAAIuE,WAAWnE,EAKnB,OAHU,KAANJ,IACFA,EAAIwE,SAASpE,IAERqE,MAAMzE,GAAKI,EAAQJ,GAK5B0E,OAAQ,SAAStE,EAAOyD,GACtB,GAAqB,OAAjBA,EACF,MAAOzD,EAET,KAIE,MAAOuE,MAAKR,MAAM/D,EAAMwE,QAAQ,KAAM,MACtC,MAAMC,GAEN,MAAOzE,KAIX0E,WAAY,SAAS1E,EAAOyD,GAC1B,MAAOA,IAiBXpE,GAAMmE,iBAAmBA,GAExBrE,SC9DH,SAAUE,GAIR,GAAIC,GAASD,EAAMC,OAIfE,IAEJA,GAAImF,eACJnF,EAAIoF,YAEJpF,EAAIqF,QAAU,SAASC,EAAMvF,GAC3B,IAAK,GAAIK,KAAKkF,GACZxF,EAAOC,EAAWuF,EAAKlF,KAM3BP,EAAMG,IAAMA,GAEXL,SCvBH,SAAUE,GAER,GAAI0F,IASFC,MAAO,SAASjC,EAAQkC,EAAMC,GAG5BC,SAASC,QAETH,EAAQA,GAAQA,EAAK5B,OAAU4B,GAAQA,EAEvC,IAAItC,GAAK,YACNpC,KAAKwC,IAAWA,GAAQd,MAAM1B,KAAM0E,IACrCpE,KAAKN,MAEHS,EAASkE,EAAUnE,WAAW4B,EAAIuC,GAClChE,sBAAsByB,EAE1B,OAAOuC,GAAUlE,GAAUA,GAE7BqE,YAAa,SAASrE,GACP,EAATA,EACFG,sBAAsBH,GAEtBC,aAAaD,IAWjBsE,KAAM,SAASC,EAAMC,EAAQC,EAAQC,EAASC,GAC5C,GAAIC,GAAOH,GAAUlF,KACjBiF,EAASA,MACTK,EAAQ,GAAIC,aAAYP,GAC1BG,QAAsBK,SAAZL,EAAwBA,GAAU,EAC5CC,WAA4BI,SAAfJ,EAA2BA,GAAa,EACrDH,OAAQA,GAGV,OADAI,GAAKI,cAAcH,GACZA,GASTI,UAAW,WACT1F,KAAKyE,MAAM,OAAQ9C,YASrBgE,aAAc,SAASC,EAAMC,EAAKC,GAC5BD,GACFA,EAAIE,UAAUC,OAAOF,GAEnBF,GACFA,EAAKG,UAAUE,IAAIH,KAMrBI,EAAM,aAGNC,IAIJ3B,GAAM4B,YAAc5B,EAAMC,MAI1B3F,EAAMG,IAAIoF,SAASG,MAAQA,EAC3B1F,EAAMoH,IAAMA,EACZpH,EAAMqH,IAAMA,GAEXvH,SC/FH,SAAUE,GAIR,GAAIuH,GAAMxH,OAAOyH,aACbC,EAAe,MAGfC,GAEFD,aAAcA,EAEdE,iBAAkB,WAChB,GAAID,GAASxG,KAAK0G,cAClBL,GAAIG,QAAWtH,OAAOyH,KAAKH,GAAQ1D,OAAS,GAAMb,QAAQoE,IAAI,yBAA0BrG,KAAK4G,UAAWJ,EAOxG,IAAiBK,GAAUC,EAAvBC,EAAO/G,IACX,KAAK,GAAIX,KAAKmH,GACZM,EAAYP,EAAelH,GAC3BwH,EAAWG,mBAAmBC,oBAC5BC,KAAKC,IAAIX,EAAOnH,IAChByH,GAEEM,oBAAqB,SAASC,EAAOC,GACnC,GAAIlF,GAAKkF,EAAKC,aAAaR,EAC3B,OAAI3E,GACKA,EAAG9B,KAAKyG,GADjB,WAMG/G,KAAMA,MAAM,IAIzBwH,eAAgB,SAASC,EAAKjF,EAAQkC,GACpC,GAAI+C,EAAK,CACPpB,EAAIG,QAAUvE,QAAQyF,MAAM,qBAAsBD,EAAIb,UAAWpE,EACjE,IAAIJ,GAAuB,kBAAXI,GAAwBA,EAASiF,EAAIjF,EACjDJ,IACFA,EAAGsC,EAAO,QAAU,QAAQ+C,EAAK/C,GAEnC2B,EAAIG,QAAUvE,QAAQ0F,WACtB/C,SAASC,UAOf/F,GAAMG,IAAIoF,SAASmC,OAASA,GAE3B5H,SC1DH,SAAUE,GAIR,GAAI8I,IACFC,uBAAwB,WACtB,GAAIC,GAAK9H,KAAK+H,mBACd,KAAK,GAAIC,KAAKF,GACP9H,KAAKiI,aAAaD,IACrBhI,KAAKkI,aAAaF,EAAGF,EAAGE,KAK9BG,eAAgB,WAGd,GAAInI,KAAKoI,WACP,IAAK,GAA0CC,GAAtCzF,EAAE,EAAGkF,EAAG9H,KAAK4H,WAAY/E,EAAEiF,EAAGhF,QAAYuF,EAAEP,EAAGlF,KAASC,EAAFD,EAAKA,IAClE5C,KAAKsI,oBAAoBD,EAAE9F,KAAM8F,EAAE5I,QAMzC6I,oBAAqB,SAAS/F,EAAM9C,GAGlC,GAAI8C,GAAOvC,KAAKuI,qBAAqBhG,EACrC,IAAIA,EAAM,CAIR,GAAI9C,GAASA,EAAM+I,OAAO1J,EAAM2J,cAAgB,EAC9C,MAGF,IAAIvF,GAAelD,KAAKuC,GAEpB9C,EAAQO,KAAKiD,iBAAiBxD,EAAOyD,EAErCzD,KAAUyD,IAEZlD,KAAKuC,GAAQ9C,KAKnB8I,qBAAsB,SAAShG,GAC7B,GAAImG,GAAQ1I,KAAKoI,YAAcpI,KAAKoI,WAAW7F,EAE/C,OAAOmG,IAGTzF,iBAAkB,SAAS0F,EAAazF,GACtC,MAAOpE,GAAMmE,iBAAiB0F,EAAazF,IAE7C0F,eAAgB,SAASnJ,EAAO0D,GAC9B,MAAqB,YAAjBA,EACK1D,EAAQ,GAAK+F,OACM,WAAjBrC,GAA8C,aAAjBA,GACvBqC,SAAV/F,EACEA,EAFF,QAKToJ,2BAA4B,SAAStG,GACnC,GAAIY,SAAsBnD,MAAKuC,GAE3BuG,EAAkB9I,KAAK4I,eAAe5I,KAAKuC,GAAOY,EAE9BqC,UAApBsD,EACF9I,KAAKkI,aAAa3F,EAAMuG,GAME,YAAjB3F,GACTnD,KAAK+I,gBAAgBxG,IAO3BzD,GAAMG,IAAIoF,SAASuD,WAAaA,GAE/BhJ,SCvFH,SAAUE,GAqIR,QAASkK,GAAeC,EAAKC,EAAYC,GACvC9C,EAAI/F,MAAQ2B,QAAQoE,IAAI+C,EAAgBC,IAAIzC,WAAa,SAAU0C,OAAQL,EAAIrC,UAAWsC,EAI1F,IAAIK,GAAIJ,EAAWK,gBAInB,QAHU,OAAND,GAAoB/D,SAAN+D,IAChBJ,EAAWM,SAASR,EAAIC,IAEnBQ,SAASC,uBAAuBV,EAAKC,EAAYC,GA1I1D,GAAI9C,GAAMxH,OAAOyH,aAUbsD,GACFC,kBAAmB,WACjB,GAAIlH,GAAK3C,KAAK8J,cAAeC,EAAM/J,KAAKgK,aACxC,IAAKrH,GAAMA,EAAGG,QAAYiH,GAAOA,EAAIjH,OAAS,CAC5C,GACImH,GAAIjK,KAAKkK,kBAAoB,GAAIC,iBAErCnK,MAAKoK,mBAAmBH,GACxB,KAAK,GAAsB5K,GAAlBuD,EAAE,EAAGC,EAAEF,EAAGG,OAAcD,EAAFD,IAASvD,EAAEsD,EAAGC,IAAKA,IAAK,CACrDqH,EAAEI,QAAQrK,KAAMX,EAEhB,IAAIC,GAAKJ,OAAOK,yBAAyBS,KAAK0C,UAAWrD,EACrDC,IAAMA,EAAGG,OACXO,KAAKsK,kBAAkBjL,EAAGC,EAAGG,MAAO,MAGxC,IAAK,GAAuBJ,GAAnBuD,EAAE,EAAGC,EAAEkH,EAAIjH,OAAcD,EAAFD,IAASvD,EAAE0K,EAAInH,IAAKA,IAC7C5C,KAAKuK,SAAgC/E,SAApBxF,KAAKuK,QAAQlL,IACjC4K,EAAEI,QAAQrK,KAAMX,EAGpB4K,GAAEO,KAAKxK,KAAKyK,sBAAuBzK,QAGvCyK,sBAAuB,SAASC,EAAWC,EAAWC,GACpD,GAAIrI,GAAMC,EAAQqI,IAClB,KAAK,GAAIjI,KAAK+H,GAEZpI,EAAOqI,EAAM,EAAIhI,EAAI,GACM4C,SAAvBxF,KAAKsE,QAAQ/B,IACfvC,KAAK6I,2BAA2BtG,GAElCC,EAASxC,KAAKuK,QAAQhI,GAClBC,IACFxC,KAAKsK,kBAAkB/H,EAAMmI,EAAU9H,GAAI+H,EAAU/H,IAChDiI,EAAOrI,KACVqI,EAAOrI,IAAU,EAEjBxC,KAAK8K,aAAatI,GAASmI,EAAU/H,GAAI8H,EAAU9H,GAAIjB,eAK/D2I,kBAAmB,SAAS/H,EAAM9C,EAAOoG,GAEvC,GAAIkF,GAAe/K,KAAKuK,QAAQhI,EAChC,IAAIwI,IAEEC,MAAMC,QAAQpF,KAChBQ,EAAIkE,SAAWtI,QAAQoE,IAAI,mDAAoDrG,KAAK4G,UAAWrE,GAC/FvC,KAAKkL,mBAAmB3I,EAAO,YAG7ByI,MAAMC,QAAQxL,IAAQ,CACxB4G,EAAIkE,SAAWtI,QAAQoE,IAAI,iDAAkDrG,KAAK4G,UAAWrE,EAAM9C,EACnG,IAAI0L,GAAW,GAAIC,eAAc3L,EACjC0L,GAASX,KAAK,SAAS/K,EAAOoG,GAC5B7F,KAAK8K,aAAaC,GAAelF,KAChC7F,MACHA,KAAKqL,sBAAsB9I,EAAO,UAAW4I,KAInDG,aAAc,SAASC,EAAUpC,GAE/B,MAAOH,GAAehJ,KAAMuL,EAAUpC,IAExC2B,aAAc,SAAStI,EAAQkC,GAC7B,GAAItC,GAAKpC,KAAKwC,IAAWA,CACP,mBAAPJ,IACTA,EAAGV,MAAM1B,KAAM0E,IAGnB0F,kBAAmB,SAASoB,GAC1BxL,KAAKyL,WAAWC,KAAKF,IAGvBG,eAAgB,WACd,IAAK,GAAI/I,GAAE,EAAGC,EAAE7C,KAAKyL,WAAW3I,OAAUD,EAAFD,EAAKA,IAC3C5C,KAAK4L,mBAAmB5L,KAAKyL,WAAW7I,GAE1C5C,MAAKyL,eAEPG,mBAAoB,SAASC,GAC3B,IAAK,GAAiC5B,GAA7BrH,EAAE,EAAGC,EAAEgJ,EAAc/I,OAAaD,EAAFD,EAAKA,IAC5CqH,EAAI4B,EAAcjJ,GACdqH,GAAKA,EAAE6B,OACT7B,EAAE6B,SAKRT,sBAAuB,SAAS9I,EAAM4I,GACpC,GAAIY,GAAK/L,KAAKgM,kBAAoBhM,KAAKgM,mBACvCD,GAAGxJ,GAAQ4I,GAEbD,mBAAoB,SAAS3I,GAC3B,GAAIwJ,GAAK/L,KAAKgM,eACd,OAAID,IAAMA,EAAGxJ,IACXwJ,EAAGxJ,GAAMuJ,QACTC,EAAGxJ,GAAQ,MACJ,GAHT,QAMF0J,oBAAqB,WACnB,GAAIjM,KAAKgM,gBAAiB,CAExB,IAAK,GAAwBhE,GAAGiC,EAD5BtD,EAAKzH,OAAOyH,KAAK3G,KAAKgM,iBACjBpJ,EAAE,EAAGC,EAAE8D,EAAK7D,OAAmBD,EAAJD,IAAWoF,EAAErB,EAAK/D,IAAKA,IACzDqH,EAAIjK,KAAKgM,gBAAgBhE,GACzBiC,EAAE6B,OAEJ9L,MAAKgM,sBAwBP5C,EAAiB,yCAIrBtK,GAAMG,IAAIoF,SAASuF,WAAaA,GAE/BhL,SC3JH,SAAUE,GAqBR,QAASoN,GAAoB7G,GAC3B,KAAOA,EAAK8G,YAAY,CACtB,GAAI9G,EAAK+G,mBACP,MAAO/G,EAETA,GAAOA,EAAK8G,WAEd,MAAO9G,GAAKgH,KAxBd,GAAIhG,GAAMxH,OAAOyH,UAAY,EAGzBgG,GAFSxN,EAAMG,IAAIoF,SAASmC,OAEnB,GAAIQ,oBACjBsF,GAAOlF,oBAAsB,SAASC,EAAOC,EAAMjC,GACjD,GAAIkH,GAAOL,EAAoB7G,EAC/B,IAAIkH,EAAM,CACR,GAAInK,GAAKkF,EAAKC,aAAagF,EAC3B,IAAInK,EACF,MAAOA,GAAG9B,KAAKiM,IAoBrB,IAAIC,IACFF,OAAQA,EACRG,iBAAkB,SAASC,GACzB,GAAIC,GAAMD,EAASE,eAAe5M,KAAMA,KAAKsM,OAE7C,OADAtM,MAAKoK,kBAAkBuC,EAAIE,WACpBF,GAETrM,KAAM,SAASiC,EAAM4G,GACnB,GAAIoC,GAAWvL,KAAKuI,qBAAqBhG,EACzC,IAAKgJ,EAIE,CAEL,GAAIJ,GAAWnL,KAAKsL,aAAaC,EAAUpC,EAS3C,OARAnJ,MAAK6I,2BAA2B0C,GAG5B3G,SAASkI,2BACX3B,EAAS7D,KAAO6B,EAAW4D,MAC3B/M,KAAK6M,UAAY7M,KAAK6M,cACtB7M,KAAK6M,UAAUtK,GAAQ4I,GAElBA,EAZP,MAAOnL,MAAKgN,WAAWrL,YAkB3BsL,eAAgB,WACTjN,KAAKkN,WACR7G,EAAI8G,QAAUlL,QAAQoE,IAAI,sBAAuBrG,KAAK4G,WACtD5G,KAAKoN,cAAgBpN,KAAKL,IAAIK,KAAKoN,cAAepN,KAAKqN,UAAW,KAGtEA,UAAW,WACJrN,KAAKkN,WACRlN,KAAK2L,iBACL3L,KAAKiM,sBACLjM,KAAKkN,UAAW,IAGpBI,gBAAiB,WACf,MAAItN,MAAKkN,cACP7G,EAAI8G,QAAUlL,QAAQC,KAAK,gDAAiDlC,KAAK4G,aAGnFP,EAAI8G,QAAUlL,QAAQoE,IAAI,uBAAwBrG,KAAK4G,gBACnD5G,KAAKoN,gBACPpN,KAAKoN,cAAgBpN,KAAKoN,cAActN,YAsB1CyN,EAAkB,gBAItBzO,GAAM2J,YAAc8E,EACpBzO,EAAMG,IAAIoF,SAASmI,IAAMA,GAExB5N,SChHH,SAAUE,GA0MR,QAAS0O,GAAOzJ,GACd,MAAOA,GAAO0J,eAAe,eAK/B,QAASC,MA9MT,GAAIC,IACFD,aAAa,EACb/N,IAAK,SAASA,EAAKC,EAAUC,GAC3B,GAAmB,gBAARF,GAIT,MAAOf,SAAQe,IAAIkB,KAAKb,KAAML,EAAKC,EAAUC,EAH7C,IAAIR,GAAI,MAAQM,CAChBK,MAAKX,GAAKT,QAAQe,IAAIkB,KAAKb,KAAMA,KAAKX,GAAIO,EAAUC,IAKxDmD,QAAOpE,QAAQoE,MAEf4K,QAAS,aAITC,MAAO,aAEPC,gBAAiB,WACX9N,KAAK+N,kBAAoB/N,KAAK+N,iBAAiB1G,OACjDpF,QAAQC,KAAK,iBAAmBlC,KAAK4G,UAAY,wGAInD5G,KAAK4N,UACL5N,KAAKgO,kBAGPA,eAAgB,WACdhO,KAAKiO,kBAAmB,EAExBjO,KAAKkO,eAELlO,KAAKyL,cAELzL,KAAK6J,oBAEL7J,KAAK6H,yBAEL7H,KAAKmI,iBAELnI,KAAKyG,mBAELzG,KAAKmO,kBAAkBnO,KAAK0C,WAI5B1C,KAAK+I,gBAAgB,cAErB/I,KAAK6N,SAEPO,iBAAkB,WAChBpO,KAAKsN,kBAEDtN,KAAKqO,UACPrO,KAAKqO,WAGHrO,KAAKsO,aACPtO,KAAKsO,cAMFtO,KAAKuO,kBACRvO,KAAKuO,iBAAkB,EACnBvO,KAAKwO,UACPxO,KAAKyE,MAAM,cAIjBgK,iBAAkB,WACXzO,KAAK0O,gBACR1O,KAAKiN,iBAGHjN,KAAK2O,UACP3O,KAAK2O,WAGH3O,KAAK4O,UACP5O,KAAK4O,YAITC,oBAAqB,WACnB7O,KAAKoO,oBAGPU,iBAAkB,WAChB9O,KAAKyO,oBAGPM,wBAAyB,WACvB/O,KAAKoO,oBAGPY,qBAAsB,WACpBhP,KAAKyO,oBAGPN,kBAAmB,SAAS1L,GACtBA,GAAKA,EAAEwM,UACTjP,KAAKmO,kBAAkB1L,EAAEC,WACzBD,EAAEyM,iBAAiBrO,KAAKb,KAAMyC,EAAEwM,WAIpCC,iBAAkB,SAASC,GACzB,GAAIzC,GAAW1M,KAAKoP,cAAcD,EAClC,IAAIzC,EAAU,CACZ,GAAI2C,GAAOrP,KAAKsP,mBAAmB5C,EACnC1M,MAAKkO,YAAYiB,EAAe5M,MAAQ8M,IAI5CD,cAAe,SAASD,GACtB,MAAOA,GAAeI,cAAc,aAGtCD,mBAAoB,SAAS5C,GAC3B,GAAIA,EAAU,CAEZ,GAAI2C,GAAOrP,KAAKwP,mBAKZ7C,EAAM3M,KAAKyM,iBAAiBC,EAMhC,OAJA2C,GAAKI,YAAY9C,GAEjB3M,KAAK0P,gBAAgBL,EAAM3C,GAEpB2C,IAIXM,kBAAmB,SAASjD,EAAUkD,GACpC,GAAIlD,EAAU,CAKZ1M,KAAKoM,oBAAqB,CAK1B,IAAIO,GAAM3M,KAAKyM,iBAAiBC,EAUhC,OARIkD,GACF5P,KAAK6P,aAAalD,EAAKiD,GAEvB5P,KAAKyP,YAAY9C,GAGnB3M,KAAK0P,gBAAgB1P,MAEd2M,IAGX+C,gBAAiB,SAASL,GAExBrP,KAAK8P,sBAAsBT,GAE3BU,gBAAgB/O,SAASqO,IAG3BS,sBAAuB,SAAST,GAE9B,GAAIW,GAAIhQ,KAAKgQ,EAAIhQ,KAAKgQ,KAEtB,IAAIX,EAEF,IAAK,GAAsBhQ,GADvBsD,EAAK0M,EAAKY,iBAAiB,QACtBrN,EAAE,EAAGC,EAAEF,EAAGG,OAAcD,EAAFD,IAASvD,EAAEsD,EAAGC,IAAKA,IAChDoN,EAAE3Q,EAAE6Q,IAAM7Q,GAIhB8Q,yBAA0B,SAAS5N,GAEpB,UAATA,GAA6B,UAATA,GACtBvC,KAAKsI,oBAAoB/F,EAAMvC,KAAKoQ,aAAa7N,IAE/CvC,KAAKqQ,kBACPrQ,KAAKqQ,iBAAiB3O,MAAM1B,KAAM2B,YAGtC2O,WAAY,SAASjL,EAAMkL,GACzB,GAAIpF,GAAW,GAAIqF,kBAAiB,SAASC,GAC3CF,EAAS1P,KAAKb,KAAMmL,EAAUsF,GAC9BtF,EAASuF,cACTpQ,KAAKN,MACPmL,GAASZ,QAAQlF,GAAOsL,WAAW,EAAMC,SAAS,KAYtDlD,GAAY1O,UAAY2O,EACxBA,EAAKkD,YAAcnD,EAInB5O,EAAMgS,KAAOpD,EACb5O,EAAM0O,OAASA,EACf1O,EAAMG,IAAIoF,SAASsJ,KAAOA,GAEzB/O,SC1NH,SAAUE,GA8ER,QAASqC,GAAenC,GACtB,MAAOA,GAAU0D,UAGnB,QAASqO,GAAYC,EAAS3E,GAC5B,GAAI9J,GAAO,GAAI0O,GAAK,CAChB5E,KACF9J,EAAO8J,EAAKzF,UACZqK,EAAK5E,EAAKpE,aAAa,MAEzB,IAAIiJ,GAAWtM,SAASuM,UAAUC,kBAAkB7O,EAAM0O,EAC1D,OAAOrM,UAASuM,UAAUJ,YAAYC,EAASE,GArFjD,GAIIG,IAJMxS,OAAOyH,aAIW,WACxBgL,EAAyB,aAEzBC,GACFF,sBAAuBA,EAMvBG,wBAAyB,WAEvB,GAAI1S,GAAQkB,KAAKyR,gBACjB,IAAI3S,IAAUkB,KAAK0R,mBAAmB5S,EAAOkB,KAAK4G,WAAY,CAG5D,IADA,GAAItE,GAAQnB,EAAenB,MAAOgR,EAAU,GACrC1O,GAASA,EAAM2M,SACpB+B,GAAW1O,EAAM2M,QAAQ0C,gBAAgBL,GACzChP,EAAQnB,EAAemB,EAErB0O,IACFhR,KAAK4R,oBAAoBZ,EAASlS,KAIxC+S,kBAAmB,SAASC,EAAOvP,EAAMzD,GACvC,GAAIA,GAAQA,GAASkB,KAAKyR,iBAAkBlP,EAAOA,GAAQ,EAC3D,IAAIzD,IAAUkB,KAAK0R,mBAAmB5S,EAAOkB,KAAK4G,UAAYrE,GAAO,CACnE,GAAIyO,GAAU,EACd,IAAIc,YAAiB9G,OACnB,IAAK,GAAyB+G,GAArBnP,EAAE,EAAGC,EAAEiP,EAAMhP,OAAcD,EAAFD,IAASmP,EAAED,EAAMlP,IAAKA,IACtDoO,GAAWe,EAAEC,YAAc,WAG7BhB,GAAUc,EAAME,WAElBhS,MAAK4R,oBAAoBZ,EAASlS,EAAOyD,KAG7CqP,oBAAqB,SAASZ,EAASlS,EAAOyD,GAG5C,GAFAzD,EAAQA,GAASkB,KAAKyR,iBACtBlP,EAAOA,GAAQ,GACVzD,EAAL,CAGID,OAAOoT,oBACTjB,EAAUD,EAAYC,EAASlS,EAAMuN,MAEvC,IAAIyF,GAAQ9R,KAAKiP,QAAQiD,oBAAoBlB,EACzCM,EACJ1S,SAAQuT,kBAAkBL,EAAOhT,GAEjCA,EAAMsT,aAAapS,KAAK4G,UAAYrE,IAAQ,IAE9CkP,eAAgB,SAASpM,GAGvB,IADA,GAAIhG,GAAIgG,GAAQrF,KACTX,EAAE8M,YACP9M,EAAIA,EAAE8M,UAER,OAAO9M,IAETqS,mBAAoB,SAAS5S,EAAOyD,GAElC,MADAzD,GAAMsT,aAAetT,EAAMsT,iBACpBtT,EAAMsT,aAAa7P,IAsB9BzD,GAAMG,IAAIoF,SAASkN,OAASA,GAE3B3S,SChGH,SAAUE,GAUR,QAASmQ,GAAQ1M,EAAMvD,GACrB,GAAyB,IAArB2C,UAAUmB,QAAwC,gBAAjBnB,WAAU,GAAiB,CAC9D3C,EAAYuD,CACZ,IAAI8P,GAASjR,SAASkR,cAGtB,IAFA/P,EAAO8P,GAAUA,EAAOlG,YAAckG,EAAOlG,WAAWiE,aACpDiC,EAAOlG,WAAWiE,aAAa,QAAU,IACxC7N,EACH,KAAM,sCAGV,GAAIgQ,EAAuBhQ,GACzB,KAAM,sDAAwDA,CAGhEiQ,GAAkBjQ,EAAMvD,GAExByT,EAAgBlQ,GAKlB,QAASmQ,GAAoBnQ,EAAMoQ,GACjCC,EAAcrQ,GAAQoQ,EAKxB,QAASF,GAAgBlQ,GACnBqQ,EAAcrQ,KAChBqQ,EAAcrQ,GAAMsQ,0BACbD,GAAcrQ,IAgBzB,QAASiQ,GAAkBjQ,EAAMvD,GAC/B,MAAO8T,GAAiBvQ,GAAQvD,MAGlC,QAASuT,GAAuBhQ,GAC9B,MAAOuQ,GAAiBvQ,GAzD1B,GAAIxD,GAASD,EAAMC,OA+Bf6T,GA9BM9T,EAAMG,QAiDZ6T,IAYJhU,GAAMyT,uBAAyBA,EAC/BzT,EAAM4T,oBAAsBA,EAO5B7T,OAAOD,QAAUqQ,EAKjBlQ,EAAOH,QAASE,EAOhB,IAAIiU,GAAenO,SAASoO,qBAC5B,IAAID,EACF,IAAK,GAAgChQ,GAA5BH,EAAE,EAAGC,EAAEkQ,EAAajQ,OAAcD,EAAFD,IAASG,EAAEgQ,EAAanQ,IAAKA,IACpEqM,EAAQvN,MAAM,KAAMqB,IAIvBnE,SC5FH,SAAUE,GAEV,GAAIwI,IACF2L,oBAAqB,SAAS5N,GAC5BT,SAASsO,YAAYC,WAAW9N,IAElC+N,kBAAmB,WAEjB,GAAIC,GAAYrT,KAAKoQ,aAAa,cAAgB,GAC9Cf,EAAO,GAAIiE,KAAID,EAAWrT,KAAKuT,cAAcC,QACjDxT,MAAKhB,UAAUyU,YAAc,SAASC,EAAS/F,GAC7C,GAAIgG,GAAI,GAAIL,KAAII,EAAS/F,GAAQ0B,EACjC,OAAOsE,GAAEC,OAMf9U,GAAMG,IAAImF,YAAYkD,KAAOA,GAE1B1I,SCrBH,SAAUE,GA2KR,QAAS+U,GAAmBC,EAAOC,GACjC,GAAIH,GAAO,GAAIN,KAAIQ,EAAM1D,aAAa,QAAS2D,GAASH,IACxD,OAAO,YAAeA,EAAO,KAG/B,QAASzB,GAAkBL,EAAOhT,GAChC,GAAIgT,EAAO,CACLhT,IAAUsC,WACZtC,EAAQsC,SAAS4S,MAEfnV,OAAOoT,oBACTnT,EAAQsC,SAAS4S,KAOnB,IAAIC,GAAQC,EAAmBpC,EAAME,aACjCmC,EAAOrC,EAAM1B,aAAaiB,EAC1B8C,IACFF,EAAM/L,aAAamJ,EAAuB8C,EAI5C,IAAIvE,GAAU9Q,EAAMsV,iBACpB,IAAItV,IAAUsC,SAAS4S,KAAM,CAC3B,GAAI9C,GAAW,SAAWG,EAAwB,IAC9CgD,EAAKjT,SAAS4S,KAAK/D,iBAAiBiB,EACpCmD,GAAGvR,SACL8M,EAAUyE,EAAGA,EAAGvR,OAAO,GAAGwR,oBAG9BxV,EAAM+Q,aAAaoE,EAAOrE,IAI9B,QAASsE,GAAmBlD,EAASlS,GACnCA,EAAQA,GAASsC,SACjBtC,EAAQA,EAAMuC,cAAgBvC,EAAQA,EAAMyU,aAC5C,IAAIzB,GAAQhT,EAAMuC,cAAc,QAEhC,OADAyQ,GAAME,YAAchB,EACbc,EAGT,QAASyC,GAAiBT,GACxB,MAAQA,IAASA,EAAMU,YAAe,GAGxC,QAASC,GAAgBpP,EAAMqP,GAC7B,MAAIC,GACKA,EAAQ9T,KAAKwE,EAAMqP,GAD5B,OAzNF,GACIzV,IADMJ,OAAOyH,aACPxH,EAAMG,IAAIoF,SAASkN,QACzBF,EAAwBpS,EAAIoS,sBAI5BuD,EAAiB,QACjBC,EAAuB,UACvBC,EAAiB,uBACjBC,EAAqB,SACrBC,EAAa,gBAEbzD,GAEF0D,WAAY,SAASrV,GACnB,GAAIsV,GAAUlV,KAAKmV,iBACfD,IACFlV,KAAKoV,sBAAsBF,EAE7B,IAAI3D,GAASvR,KAAKqV,mBAAmBH,EACjC3D,GAAOzO,OACT8B,SAAS0Q,cAAcL,WAAW1D,EAAQ3R,GACjCA,GACTA,KAGJwV,sBAAuB,SAAS/F,GAE9B,IAAK,GAAsB0C,GAAGwD,EAD1BlB,EAAKhF,EAAKY,iBAAiB6E,GACtBlS,EAAE,EAAGC,EAAEwR,EAAGvR,OAAiBD,EAAFD,IAASmP,EAAEsC,EAAGzR,IAAKA,IACnD2S,EAAIrB,EAAmBL,EAAmB9B,EAAG/R,KAAKuT,cAAcC,SAC5DxT,KAAKuT,eACTvT,KAAKwV,oBAAoBD,EAAGxD,GAC5BA,EAAE5F,WAAWsJ,aAAaF,EAAGxD,IAGjCyD,oBAAqB,SAAS1D,EAAO4D,GACnC,IAAK,GAA0CrN,GAAtCzF,EAAE,EAAGkF,EAAG4N,EAAK9N,WAAY/E,EAAEiF,EAAGhF,QAAYuF,EAAEP,EAAGlF,KAASC,EAAFD,EAAKA,IACnD,QAAXyF,EAAE9F,MAA6B,SAAX8F,EAAE9F,MACxBuP,EAAM5J,aAAaG,EAAE9F,KAAM8F,EAAE5I,QAInC4V,mBAAoB,SAAShG,GAC3B,GAAIsG,KACJ,IAAItG,EAEF,IAAK,GAAsB0C,GADvBsC,EAAKhF,EAAKY,iBAAiB2E,GACtBhS,EAAE,EAAGC,EAAEwR,EAAGvR,OAAcD,EAAFD,IAASmP,EAAEsC,EAAGzR,IAAKA,IAC5CmP,EAAEC,YAAYtJ,MAAMmM,IACtBc,EAAUjK,KAAKqG,EAIrB,OAAO4D,IAOTC,cAAe,WACb5V,KAAK6V,cACL7V,KAAK8V,cACL9V,KAAK+V,qBACL/V,KAAKgW,uBAKPH,YAAa,WACX7V,KAAKiW,OAASjW,KAAKkW,UAAUpB,GAC7B9U,KAAKiW,OAAO7W,QAAQ,SAAS2S,GACvBA,EAAE5F,YACJ4F,EAAE5F,WAAWgK,YAAYpE,MAI/B+D,YAAa,WACX9V,KAAKuR,OAASvR,KAAKkW,UAAUtB,EAAiB,IAAMI,EAAa,KACjEhV,KAAKuR,OAAOnS,QAAQ,SAAS2S,GACvBA,EAAE5F,YACJ4F,EAAE5F,WAAWgK,YAAYpE,MAa/BgE,mBAAoB,WAClB,GAAIE,GAASjW,KAAKiW,OAAOG,OAAO,SAASrE,GACvC,OAAQA,EAAE9J,aAAa+M,KAErBE,EAAUlV,KAAKmV,iBACnB,IAAID,EAAS,CACX,GAAIlE,GAAU,EAId,IAHAiF,EAAO7W,QAAQ,SAAS0U,GACtB9C,GAAWuD,EAAiBT,GAAS,OAEnC9C,EAAS,CACX,GAAIc,GAAQoC,EAAmBlD,EAAShR,KAAKuT,cAC7C2B,GAAQrF,aAAaiC,EAAOoD,EAAQmB,eAI1CH,UAAW,SAAShF,EAAUoF,GAC5B,GAAIC,GAAQvW,KAAKiQ,iBAAiBiB,GAAUsF,QACxCtB,EAAUlV,KAAKmV,iBACnB,IAAID,EAAS,CACX,GAAIuB,GAAgBvB,EAAQjF,iBAAiBiB,GAAUsF,OACvDD,GAAQA,EAAMG,OAAOD,GAEvB,MAAOH,GAAUC,EAAMH,OAAOE,GAAWC,GAE3CpB,gBAAiB,WACf,GAAIzI,GAAW1M,KAAKuP,cAAc,WAClC,OAAO7C,IAAYyI,gBAAgBzI,IAWrCsJ,oBAAqB,WACnB,GAAIlE,GAAQ9R,KAAK2W,cAAc5B,EAC/B5C,GAAkBL,EAAO1Q,SAAS4S,OAEpCrC,gBAAiB,SAASiF,GACxB,GAAI5F,GAAU,GAEVE,EAAW,IAAM8D,EAAa,IAAM4B,EAAkB,IACtDN,EAAU,SAASvE,GACrB,MAAO0C,GAAgB1C,EAAGb,IAExB+E,EAASjW,KAAKiW,OAAOG,OAAOE,EAChCL,GAAO7W,QAAQ,SAAS0U,GACtB9C,GAAWuD,EAAiBT,GAAS,QAGvC,IAAIvC,GAASvR,KAAKuR,OAAO6E,OAAOE,EAIhC,OAHA/E,GAAOnS,QAAQ,SAAS0S,GACtBd,GAAWc,EAAME,YAAc,SAE1BhB,GAET2F,cAAe,SAASC,GACtB,GAAI5F,GAAUhR,KAAK2R,gBAAgBiF,EACnC,OAAO5W,MAAKkS,oBAAoBlB,EAAS4F,IAE3C1E,oBAAqB,SAASlB,EAAS4F,GACrC,GAAI5F,EAAS,CACX,GAAIc,GAAQoC,EAAmBlD,EAG/B,OAFAc,GAAM5J,aAAamJ,EAAuBrR,KAAKoQ,aAAa,QACxD,IAAMwG,GACH9E,KA2DTrP,EAAI1B,YAAY/B,UAChB2V,EAAUlS,EAAEkS,SAAWlS,EAAEgS,iBAAmBhS,EAAEoU,uBAC3CpU,EAAEqU,kBAIThY,GAAMG,IAAImF,YAAYmN,OAASA,EAC/BzS,EAAMqT,kBAAoBA,GAEzBvT,SCzOH,SAAUE,GAIR,GACIG,IADMJ,OAAOyH,aACPxH,EAAMG,IAAIoF,SAASmC,QACzBD,EAAetH,EAAIsH,aAGnBC,GACFuQ,gBAAiB,WAEf,GAAIC,GAAYhX,KAAKhB,UAAU0H,cAE/B1G,MAAKiX,sBAAsBD,IAE7BC,sBAAuB,SAASD,GAE9B,IAAK,GAAS3O,GAALzF,EAAE,EAAMyF,EAAErI,KAAK4H,WAAWhF,GAAIA,IAEjC5C,KAAKkX,eAAe7O,EAAE9F,QAExByU,EAAUhX,KAAKmX,kBAAkB9O,EAAE9F,OAAS8F,EAAE5I,MAAMwE,QAAQ,KAAM,IAC7DA,QAAQ,KAAM,IAAImT,SAK7BF,eAAgB,SAAU7X,GACxB,MAAOA,IAAe,MAATA,EAAE,IAAyB,MAATA,EAAE,IAAyB,MAATA,EAAE,IAErD8X,kBAAmB,SAAS9X,GAC1B,MAAOA,GAAEgY,MAAMC,KAIfA,EAAe/Q,EAAazD,MAGhChE,GAAMG,IAAImF,YAAYoC,OAASA,GAE9B5H,SC1CH,SAAUE,GAIR,GAAI8K,IACF2N,eAAgB,SAASvY,GAEvB,GAAiCuM,GAA7BhB,EAAUvL,EAAUuL,OACxB,KAAK,GAAIlL,KAAKL,GACQ,YAAhBK,EAAEgY,MAAM,MACL9M,IACHA,EAAYvL,EAAUuL,YAExBgB,EAAWlM,EAAEgY,MAAM,EAAG,IACtB9M,EAAQgB,GAAYhB,EAAQgB,IAAalM,IAI/CmY,iBAAkB,SAASxY,GAEzB,GAAIiL,GAAIjL,EAAUuL,OAClB,IAAIN,EAAG,CACL,GAAIwN,KACJ,KAAK,GAAIpY,KAAK4K,GAEZ,IAAK,GAASyN,GADVC,EAAQtY,EAAEuY,MAAM,KACXhV,EAAE,EAAO8U,EAAGC,EAAM/U,GAAIA,IAC7B6U,EAASC,GAAMzN,EAAE5K,EAGrBL,GAAUuL,QAAUkN,IAGxBI,qBAAsB,SAAS7Y,GAC7B,GAAIA,EAAUuL,QAAS,CAErB,GAAIlC,GAAIrJ,EAAU8K,gBAClB,KAAK,GAAIzK,KAAKL,GAAUuL,QAEtB,IAAK,GAASmN,GADVC,EAAQtY,EAAEuY,MAAM,KACXhV,EAAE,EAAO8U,EAAGC,EAAM/U,GAAIA,IAC7ByF,EAAEqD,KAAKgM,GAIb,GAAI1Y,EAAUsF,QAAS,CAErB,GAAI+D,GAAIrJ,EAAUgL,gBAClB,KAAK,GAAI3K,KAAKL,GAAUsF,QACtB+D,EAAEqD,KAAKrM,KAIbyY,kBAAmB,SAAS9Y,EAAW2O,GAErC,GAAIrJ,GAAUtF,EAAUsF,OACpBA,KAEFtE,KAAK+X,kBAAkBzT,EAAStF,EAAW2O,GAE3C3O,EAAUoJ,WAAapI,KAAKgY,aAAa1T,KAG7CyT,kBAAmB,SAASnO,EAAY5K,EAAW2O,GAEjD,IAAK,GAAItO,KAAKuK,GACSpE,SAAjBxG,EAAUK,IAAgCmG,SAAZmI,EAAKtO,KACrCL,EAAUK,GAAKuK,EAAWvK,KAIhC2Y,aAAc,SAASpO,GACrB,GAAIqO,KACJ,KAAK,GAAI5Y,KAAKuK,GACZqO,EAAI5Y,EAAE6Y,eAAiB7Y,CAEzB,OAAO4Y,IAMXnZ,GAAMG,IAAImF,YAAYwF,WAAaA,GAElChL,SClFH,SAAUE,GAIR,GAAIqZ,GAAuB,aACvBC,EAAmB,OAInBxQ,GACFyQ,yBAA0B,SAASrZ,GAEjCgB,KAAKsY,cAActZ,EAAW,aAE9BgB,KAAKsY,cAActZ,EAAW,wBAEhCuZ,kBAAmB,SAASvZ,EAAW2O,GAErC,GAAI/F,GAAa5H,KAAKoQ,aAAa+H,EACnC,IAAIvQ,EAMF,IAAK,GAAyBvI,GAJ1BiF,EAAUtF,EAAUsF,UAAYtF,EAAUsF,YAE1CqT,EAAQ/P,EAAWgQ,MAAMQ,GAEpBxV,EAAE,EAAGC,EAAE8U,EAAM7U,OAAaD,EAAFD,EAAKA,IAEpCvD,EAAIsY,EAAM/U,GAAGwU,OAET/X,GAAoBmG,SAAflB,EAAQjF,IAAgCmG,SAAZmI,EAAKtO,KACxCiF,EAAQjF,GAAK,OAMrBmZ,6BAA8B,WAK5B,IAAK,GAAsBnQ,GAHvBoQ,EAAWzY,KAAKhB,UAAU+I,oBAE1BD,EAAK9H,KAAK4H,WACLhF,EAAE,EAAGC,EAAEiF,EAAGhF,OAAcD,EAAFD,IAASyF,EAAEP,EAAGlF,IAAKA,IAC5C5C,KAAK0Y,oBAAoBrQ,EAAE9F,QAC7BkW,EAASpQ,EAAE9F,MAAQ8F,EAAE5I,QAI3BiZ,oBAAqB,SAASnW,GAC5B,OAAQvC,KAAK2Y,UAAUpW,IAA6B,QAApBA,EAAK8U,MAAM,EAAE,IAG/CsB,WACEpW,KAAM,EACNqW,UAAW,EACX/H,YAAa,EACbgI,SAAU,EACVC,UAAW,EACXC,gBAAiB,GAKrBnR,GAAW+Q,UAAUR,GAAwB,EAI7CrZ,EAAMG,IAAImF,YAAYwD,WAAaA,GAElChJ,SCpEH,SAAUE,GA+NR,QAASka,GAAyBha,GAChC,IAAKE,OAAOwD,UAAW,CACrB,GAAIuW,GAAW/Z,OAAOiC,eAAenC,EACrCA,GAAU0D,UAAYuW,EAClBzL,EAAOyL,KACTA,EAASvW,UAAYxD,OAAOiC,eAAe8X,KAhOjD,GAAIha,GAAMH,EAAMG,IACZuO,EAAS1O,EAAM0O,OACfzO,EAASD,EAAMC,OAIfC,GAEFgC,SAAU,SAASuB,EAAM2W,GAEvBlZ,KAAKmZ,eAAe5W,EAAM2W,GAE1BlZ,KAAKwS,kBAAkBjQ,EAAM2W,GAE7BlZ,KAAKoZ,sBAGPD,eAAgB,SAAS5W,EAAM2W,GAE7B,GAAIG,GAAYva,EAAMyT,uBAAuBhQ,GAEzCoL,EAAO3N,KAAKsZ,sBAAsBJ,EAEtClZ,MAAKuZ,sBAAsBF,EAAW1L,GAEtC3N,KAAKhB,UAAYgB,KAAKwZ,gBAAgBH,EAAW1L,GAEjD3N,KAAKyZ,qBAAqBlX,EAAM2W,IAGlCK,sBAAuB,SAASva,EAAW2O,GAGzC3O,EAAUiQ,QAAUjP,KAEpBA,KAAKuY,kBAAkBvZ,EAAW2O,GAElC3N,KAAK8X,kBAAkB9Y,EAAW2O,GAElC3N,KAAKuX,eAAevY,GAEpBgB,KAAKwX,iBAAiBxY,IAGxBwa,gBAAiB,SAASxa,EAAW2O,GAEnC3N,KAAK0Z,gBAAgB1a,EAAW2O,EAEhC,IAAIgM,GAAU3Z,KAAK4Z,YAAY5a,EAAW2O,EAG1C,OADAqL,GAAyBW,GAClBA,GAGTD,gBAAiB,SAAS1a,EAAW2O,GAEnC3N,KAAKsY,cAAc,UAAWtZ,EAAW2O,GAEzC3N,KAAKsY,cAAc,UAAWtZ,EAAW2O,GAEzC3N,KAAKsY,cAAc,aAActZ,EAAW2O,GAE5C3N,KAAKsY,cAAc,sBAAuBtZ,EAAW2O,GAErD3N,KAAKsY,cAAc,iBAAkBtZ,EAAW2O,IAIlD8L,qBAAsB,SAASlX,EAAMsX,GAEnC7Z,KAAK6X,qBAAqB7X,KAAKhB,WAE/BgB,KAAK4V,gBAEL5V,KAAKiT,oBAAoBjT,MAEzBA,KAAKwY,+BAELxY,KAAK+W,kBAKL/W,KAAKoT,oBAEDvU,OAAOoT,mBACTrN,SAASuM,UAAU2I,YAAY9Z,KAAKmV,kBAAmB5S,EAAMsX,GAG3D7Z,KAAKhB,UAAU+a,kBACjB/Z,KAAKhB,UAAU+a,iBAAiB/Z,OAMpCoZ,mBAAoB,WAClB,GAAIY,GAASha,KAAKoQ,aAAa,cAC3B4J,KACFnb,OAAOmb,GAAUha,KAAKia,OAK1BX,sBAAuB,SAASY,GAC9B,GAAIlb,GAAYgB,KAAKma,kBAAkBD,EACvC,KAAKlb,EAAW,CAEd,GAAIA,GAAY+B,YAAYG,mBAAmBgZ,EAE/Clb,GAAYgB,KAAKoa,cAAcpb,GAE/Bqb,EAAcH,GAAUlb,EAE1B,MAAOA,IAGTmb,kBAAmB,SAAS5X,GAC1B,MAAO8X,GAAc9X,IAIvB6X,cAAe,SAASpb,GACtB,GAAIA,EAAU0O,YACZ,MAAO1O,EAET,IAAIsb,GAAWpb,OAAOqb,OAAOvb,EAkB7B,OAfAC,GAAIqF,QAAQrF,EAAIoF,SAAUiW,GAa1Bta,KAAKwa,YAAYF,EAAUtb,EAAWC,EAAIoF,SAASmI,IAAK,QAEjD8N,GAGTE,YAAa,SAASF,EAAUtb,EAAWC,EAAKsD,GAC9C,GAAIX,GAAS,SAAS8C,GACpB,MAAO1F,GAAUuD,GAAMb,MAAM1B,KAAM0E,GAErC4V,GAAS/X,GAAQ,WAEf,MADAvC,MAAKgN,WAAapL,EACX3C,EAAIsD,GAAMb,MAAM1B,KAAM2B,aAKjC2W,cAAe,SAAS/V,EAAMvD,EAAW2O,GAEvC,GAAI8M,GAASzb,EAAUuD,MAEvBvD,GAAUuD,GAAQvC,KAAK4Z,YAAYa,EAAQ9M,EAAKpL,KAIlDiQ,kBAAmB,SAASjQ,EAAMsX,GAChC,GAAIa,IACF1b,UAAWgB,KAAKhB,WAGd2b,EAAgB3a,KAAK4a,kBAAkBf,EACvCc,KACFD,EAAK9B,QAAU+B,GAGjB5Z,YAAYC,SAASuB,EAAMvC,KAAKhB,WAEhCgB,KAAKia,KAAO7Y,SAASyZ,gBAAgBtY,EAAMmY,IAG7CE,kBAAmB,SAASrY,GAC1B,GAAIA,GAAQA,EAAKuY,QAAQ,KAAO,EAC9B,MAAOvY,EAEP,IAAIE,GAAIzC,KAAKma,kBAAkB5X,EAC/B,OAAIE,GAAEwM,QACGjP,KAAK4a,kBAAkBnY,EAAEwM,QAAQ2J,SAD1C,SASFyB,IAIFrb,GAAU4a,YADR1a,OAAOwD,UACe,SAASqB,EAAQgX,GAIvC,MAHIhX,IAAUgX,GAAahX,IAAWgX,IACpChX,EAAOrB,UAAYqY,GAEdhX,GAGe,SAASA,EAAQgX,GACvC,GAAIhX,GAAUgX,GAAahX,IAAWgX,EAAW,CAC/C,GAAIpB,GAAUza,OAAOqb,OAAOQ,EAC5BhX,GAAShF,EAAO4a,EAAS5V,GAE3B,MAAOA,IAoBX9E,EAAImF,YAAYpF,UAAYA,GAE3BJ,SC7OH,SAAUE,GA4FR,QAASkc,GAAgB/L,GACvB,MAAO7N,UAAS6Z,SAAShM,GAAWiM,EAAYC,EAGlD,QAASC,KACP,MAAOD,GAAYrY,OAASqY,EAAY,GAAKD,EAAU,GASzD,QAASG,GAAiBzb,GACxB0b,EAAMC,aAAc,EACpBC,eAAe3N,OAAQ,EACvB4N,YAAYC,iBAAiB,WAC3BJ,EAAMK,iBAAiB/b,GACvB0b,EAAMC,aAAc,EACpBD,EAAMM,UA9GV,GAAIN,IAEFzb,KAAM,SAASoP,EAAS2M,EAAO3b,GAM7B,MAL8B,KAA1BD,KAAK8a,QAAQ7L,KACfjP,KAAKiG,IAAIgJ,GACTA,EAAQ4M,QAAUD,EAClB3M,EAAQ6M,KAAO7b,GAEiB,IAA1BD,KAAK8a,QAAQ7L,IAEvBhJ,IAAK,SAASgJ,GAEZ+L,EAAgB/L,GAASvD,KAAKuD,IAEhC6L,QAAS,SAAS7L,GAChB,GAAIrM,GAAIoY,EAAgB/L,GAAS6L,QAAQ7L,EAKzC,OAJIrM,IAAK,GAAKxB,SAAS6Z,SAAShM,KAC9BrM,GAAM6Y,YAAYM,WAAaN,YAAY5N,MACzCsN,EAAYrY,OAAS,KAElBF,GAGT3C,GAAI,SAASgP,GACX,GAAI+M,GAAUhc,KAAKgG,OAAOiJ,EACtB+M,KACFA,EAAQF,KAAKjb,KAAKmb,GAClBA,EAAQH,QAAUG,EAAQF,KAAO,KACjC9b,KAAK4b,UAGT5V,OAAQ,SAASiJ,GACf,GAAIrM,GAAI5C,KAAK8a,QAAQ7L,EACrB,IAAU,IAANrM,EAIJ,MAAOoY,GAAgB/L,GAASgN,SAElCL,MAAO,WAEL,GAAI3M,GAAUjP,KAAKkc,aAInB,OAHIjN,IACFA,EAAQ4M,QAAQhb,KAAKoO,GAEnBjP,KAAKmc,YACPnc,KAAK6N,SACE,GAFT,QAKFqO,YAAa,WACX,MAAOd,MAETe,SAAU,WACR,OAAQnc,KAAKub,aAAevb,KAAKoc,WAEnCA,QAAS,WACP,OAAQjB,EAAYrY,SAAWoY,EAAUpY,QAE3C+K,MAAO,WAWL,GAJI2N,eAAe3N,SAAU,IAC3B2N,eAAea,oBAAoBjb,UACnCoa,eAAe3N,OAAQ,GAErByO,EAEF,IADA,GAAIla,GACGka,EAAexZ,SACpBV,EAAKka,EAAeL,YAK1BN,iBAAkB,SAAS/b,GACrBA,GACF0c,EAAe5Q,KAAK9L,IAGxB2b,aAAa,GAGXJ,KACAD,KACAoB,IAYJlb,UAASmb,iBAAiB,qBAAsB,WAC9Cf,eAAe3N,OAAQ,IAczB/O,EAAMwc,MAAQA,EACdxc,EAAMuc,iBAAmBA,GACxBzc,SCvHH,SAAUE,GAIR,QAAS0d,GAAeC,EAAmB7c,GACrC6c,GACFrb,SAAS4S,KAAKvE,YAAYgN,GAC1BpB,EAAiBzb,IACRA,GACTA,IAIJ,QAAS8c,GAAWC,EAAM/c,GACxB,GAAI+c,GAAQA,EAAK7Z,OAAQ,CAErB,IAAK,GAAwB8Z,GAAKlH,EAD9BmH,EAAOzb,SAAS0b,yBACXla,EAAE,EAAGC,EAAE8Z,EAAK7Z,OAAsBD,EAAFD,IAASga,EAAID,EAAK/Z,IAAKA,IAC9D8S,EAAOtU,SAASC,cAAc,QAC9BqU,EAAKqH,IAAM,SACXrH,EAAK9B,KAAOgJ,EACZC,EAAKpN,YAAYiG,EAEnB8G,GAAeK,EAAMjd,OACdA,IACTA,IAtBJ,GAAIyb,GAAmBvc,EAAMuc,gBA2B7Bvc,GAAMke,OAASN,EACf5d,EAAM0d,eAAiBA,GAEtB5d,SChCH,SAAUE,GAuHR,QAASme,GAAa1a,GACpB,MAAO2a,SAAQnc,YAAYG,mBAAmBqB,IAGhD,QAAS4a,GAAY5a,GACnB,MAAQA,IAAQA,EAAKuY,QAAQ,MAAQ,EAxHvC,GAAI/b,GAASD,EAAMC,OACfE,EAAMH,EAAMG,IACZqc,EAAQxc,EAAMwc,MACdD,EAAmBvc,EAAMuc,iBACzB9I,EAAyBzT,EAAMyT,uBAC/BG,EAAsB5T,EAAM4T,oBAI5B1T,EAAYD,EAAOG,OAAOqb,OAAOxZ,YAAY/B,YAE/C8O,gBAAiB,WACX9N,KAAKoQ,aAAa,SACpBpQ,KAAKod,QAITA,KAAM,WAEJpd,KAAKuC,KAAOvC,KAAKoQ,aAAa,QAC9BpQ,KAAK4Y,QAAU5Y,KAAKoQ,aAAa,WAEjCpQ,KAAKqd,gBAELrd,KAAK6S,qBAGPA,kBAAmB,WACd7S,KAAKsd,YACJtd,KAAK0S,oBAAoB1S,KAAKuC,OAC9BvC,KAAKud,mBACLvd,KAAKwd,uBAKTlC,EAAMrb,GAAGD,OAKXyd,UAAW,WAILN,EAAYnd,KAAK4Y,WAAaqE,EAAajd,KAAK4Y,UAClD3W,QAAQC,KAAK,sGACuClC,KAAKuC,KACrDvC,KAAK4Y,SAEX5Y,KAAKgB,SAAShB,KAAKuC,KAAMvC,KAAK4Y,SAC9B5Y,KAAKsd,YAAa,GAIpB5K,oBAAqB,SAASnQ,GAC5B,MAAKgQ,GAAuBhQ,GAA5B,QAEEmQ,EAAoBnQ,EAAMvC,MAE1BA,KAAK0d,eAAenb,IAEb,IAIXmb,eAAgB,SAASnb,GAEvB,GAAIvC,KAAKiI,aAAa,cAAgBjI,KAAK6Y,SAQzC,GAPA7Y,KAAK6Y,UAAW,EAOZha,OAAO2c,iBAAmBA,eAAeO,UAC3Cnd,QAAQ2D,OACH,CACL,GAAI8P,GAASjR,SAASC,cAAc,SACpCgR,GAAOL,YAAc,YAAezP,EAAO,MAC3CvC,KAAKyP,YAAY4C,KAKvBmL,oBAAqB,WACnB,MAAOxd,MAAK2d,iBAMdJ,gBAAiB,WACf,MAAOjC,GAAMzb,KAAKG,KAAMA,KAAK6S,kBAAmB7S,KAAKyd,YAGvDJ,cAAe,WACbrd,KAAK2d,iBAAkB,EACvB3d,KAAKiV,WAAW,WACdjV,KAAK2d,iBAAkB,EACvB3d,KAAK6S,qBACLvS,KAAKN,SASXf,GAAIqF,QAAQrF,EAAImF,YAAapF,GAc7BF,EAAMyT,uBAAyBA,EAI/B8I,EAAiB,WACfja,SAASwc,KAAK7U,gBAAgB,cAC9B3H,SAASqE,cACP,GAAIF,aAAY,iBAAkBJ,SAAS,OAM/C/D,SAASyZ,gBAAgB,mBAAoB7b,UAAWA,KAEvDJ","sourcesContent":["/*\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 */\nPolymer = {};\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// 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 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  // 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 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  // 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 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  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","/*\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    // super\n\n    // `arrayOfArgs` is an optional array of args like one might pass\n    // to `Function.apply`\n\n    // TODO(sjmiles):\n    //    $super must be installed on an instance or prototype chain\n    //    as `super`, and invoked via `this`, e.g.\n    //      `this.super();`\n\n    //    will not work if function objects are not unique, for example,\n    //    when using mixins.\n    //    The memoization strategy assumes each function exists on only one \n    //    prototype chain i.e. we use the function object for memoizing)\n    //    perhaps we can bookkeep on the prototype itself instead\n    function $super(arrayOfArgs) {\n      // since we are thunking a method call, performance is important here: \n      // memoize all lookups, once memoized the fast path calls no other \n      // functions\n      //\n      // find the caller (cannot be `strict` because of 'caller')\n      var caller = $super.caller;\n      // memoized 'name of method' \n      var nom = caller.nom;\n      // memoized next implementation prototype\n      var _super = caller._super;\n      if (!_super) {\n        if (!nom) {\n          nom = caller.nom = nameInThis.call(this, caller);\n        }\n        if (!nom) {\n          console.warn('called super() on a method not installed declaratively (has no .nom property)');\n        }\n        // super prototype is either cached or we have to find it\n        // by searching __proto__ (at the 'top')\n        _super = memoizeSuper(caller, nom, getPrototypeOf(this));\n      }\n      if (!_super) {\n        // if _super is falsey, there is no super implementation\n        //console.warn('called $super(' + nom + ') where there is no super implementation');\n      } else {\n        // our super function\n        var fn = _super[nom];\n        // memoize information so 'fn' can call 'super'\n        if (!fn._super) {\n          memoizeSuper(fn, nom, _super);\n        }\n        // invoke the inherited method\n        // if 'fn' is not function valued, this will throw\n        return fn.apply(this, arrayOfArgs || []);\n      }\n    }\n\n    function nextSuper(proto, name, caller) {\n      // look for an inherited prototype that implements name\n      while (proto) {\n        if ((proto[name] !== caller) && proto[name]) {\n          return proto;\n        }\n        proto = getPrototypeOf(proto);\n      }\n    }\n\n    function memoizeSuper(method, name, proto) {\n      // find and cache next prototype containing `name`\n      // we need the prototype so we can do another lookup\n      // from here\n      method._super = nextSuper(proto, name, method);\n      if (method._super) {\n        // _super is a prototype, the actual method is _super[name]\n        // tag super method with it's name for further lookups\n        method._super[name].nom = name;\n      }\n      return method._super;\n    }\n\n    function nameInThis(value) {\n      var p = this.__proto__;\n      while (p && p !== HTMLElement.prototype) {\n        // TODO(sjmiles): getOwnPropertyNames is absurdly expensive\n        var n$ = Object.getOwnPropertyNames(p);\n        for (var i=0, l=n$.length, n; i<l && (n=n$[i]); i++) {\n          var d = Object.getOwnPropertyDescriptor(p, n);\n          if (typeof d.value === 'function' && d.value === value) {\n            return n;\n          }\n        }\n        p = p.__proto__;\n      }\n    }\n\n    // NOTE: In some platforms (IE10) the prototype chain is faked via \n    // __proto__. Therefore, always get prototype via __proto__ instead of\n    // the more standard Object.getPrototypeOf.\n    function getPrototypeOf(prototype) {\n      return prototype.__proto__;\n    }\n\n    // utility function to precompute name tags for functions\n    // in a (unchained) prototype\n    function hintSuper(prototype) {\n      // tag functions with their prototype name to optimize\n      // super call invocations\n      for (var n in prototype) {\n        var pd = Object.getOwnPropertyDescriptor(prototype, n);\n        if (pd && typeof pd.value === 'function') {\n          pd.value.nom = n;\n        }\n      }\n    }\n\n    // exports\n\n    scope.super = $super;\n\n})(Polymer);\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  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 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  // 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 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  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\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 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\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      // We do, however, leverage the event hookup code in PolymerExpressions\n      // so that we have a common code path for handling declarative events.\n      var self = this, bindable, eventName;\n      for (var n in events) {\n        eventName = EVENT_PREFIX + n;\n        bindable = PolymerExpressions.prepareEventBinding(\n          Path.get(events[n]),\n          eventName, \n          {\n            resolveEventHandler: function(model, path, node) {\n              var fn = path.getValueFrom(self);\n              if (fn) {\n                return fn.bind(self);\n              }\n            }\n          }\n        );\n        bindable(this, this, false);\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 2013 The Polymer Authors. All rights reserved.\r\n * Use of this source code is governed by a BSD-style\r\n * license that can be found in the LICENSE file.\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 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  // 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 properties = {\n    observeProperties: function() {\n      var n$ = this._observeNames, pn$ = this._publishNames;\n      if ((n$ && n$.length) || (pn$ && pn$.length)) {\n        var self = this;\n        var o = this._propertyObserver = new CompoundObserver();\n        // keep track of property observer so we can shut it down\n        this.registerObservers([o]);\n        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {\n          o.addPath(this, n);\n          // observer array properties\n          var pd = Object.getOwnPropertyDescriptor(this.__proto__, n);\n          if (pd && pd.value) {\n            this.observeArrayValue(n, pd.value, null);\n          }\n        }\n        for (var i=0, l=pn$.length, n; (i<l) && (n=pn$[i]); i++) {\n          if (!this.observe || (this.observe[n] === undefined)) {\n            o.addPath(this, n);\n          }\n        }\n        o.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        if (this.publish[name] !== undefined) {\n          this.reflectPropertyToAttribute(name);\n        }\n        method = this.observe[name];\n        if (method) {\n          this.observeArrayValue(name, newValues[i], oldValues[i]);\n          if (!called[method]) {\n            called[method] = true;\n            // observes the value if it is an array\n            this.invokeMethod(method, [oldValues[i], newValues[i], arguments]);\n          }\n        }\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    bindProperty: function(property, observable) {\n      // apply Polymer two-way reference binding\n      return bindProperties(this, property, observable);\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    registerObservers: function(observers) {\n      this._observers.push(observers);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      for (var i=0, l=this._observers.length; i<l; i++) {\n        this.closeObserverArray(this._observers[i]);\n      }\n      this._observers = [];\n    },\n    closeObserverArray: function(observerArray) {\n      for (var i=0, l=observerArray.length, o; i<l; i++) {\n        o = observerArray[i];\n        if (o && o.close) {\n          o.close();\n        }\n      }\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        var keys=Object.keys(this._namedObservers);\n        for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {\n          o = this._namedObservers[k];\n          o.close();\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // property binding\n  // bind a property in A to a path in B by converting A[property] to a\n  // getter/setter pair that accesses B[...path...]\n  function bindProperties(inA, inProperty, observable) {\n    log.bind && console.log(LOG_BIND_PROPS, inB.localName || 'object', inPath, inA.localName, inProperty);\n    // capture A's value if B's value is null or undefined,\n    // otherwise use B's value\n    // TODO(sorvell): need to review, can do with ObserverTransform\n    var v = observable.discardChanges();\n    if (v === null || v === undefined) {\n      observable.setValue(inA[inProperty]);\n    }\n    return Observer.defineComputedProperty(inA, inProperty, observable);\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  var LOG_BIND_PROPS = \"[%s]: bindProperties: [%s] to [%s].[%s]\";\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\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(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n  var events = scope.api.instance.events;\n\n  var syntax = new PolymerExpressions();\n  syntax.resolveEventHandler = function(model, path, node) {\n    var ctlr = findEventController(node);\n    if (ctlr) {\n      var fn = path.getValueFrom(ctlr);\n      if (fn) {\n        return fn.bind(ctlr);\n      }\n    }\n  }\n\n  // An event controller is the host element for the shadowRoot in which \n  // the node exists, or the first ancestor with a 'lightDomController'\n  // property.\n  function findEventController(node) {\n    while (node.parentNode) {\n      if (node.lightDomController) {\n        return node;\n      }\n      node = node.parentNode;\n    }\n    return node.host;\n  };\n\n  // element api supporting mdv\n\n  var mdv = {\n    syntax: syntax,\n    instanceTemplate: function(template) {\n      var dom = template.createInstance(this, this.syntax);\n      this.registerObservers(dom.bindings_);\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);\n        this.reflectPropertyToAttribute(property);\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) {\n          observer.path = observable.path_;\n          this.bindings_ = this.bindings_ || {};\n          this.bindings_[name] = observer;\n        }\n        return observer;\n      }\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 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  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    },\n    // system entry point, do not override\n    prepareElement: function() {\n      this._elementPrepared = true;\n      // install shadowRoots storage\n      this.shadowRoots = {};\n      // storage for closeable observers.\n      this._observers = [];\n      // install property observers\n      this.observeProperties();\n      // install boilerplate attributes\n      this.copyInstanceAttributes();\n      // process input attributes\n      this.takeAttributes();\n      // add event listeners\n      this.addHostListeners();\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 a lightDOMController 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.lightDomController = true;\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 pointer gestures\n      PointerGestures.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 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  // 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      scope._scopeStyles[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      scope._scopeStyles = scope._scopeStyles || {};\n      return scope._scopeStyles[name];\n    }\n  };\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 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  // 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 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 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 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  // 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 content = this.templateContent();\n      if (content) {\n        this.convertSheetsToStyles(content);\n      }\n      var styles = this.findLoadableStyles(content);\n      if (styles.length) {\n        Platform.styleResolver.loadStyles(styles, callback);\n      } else 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    templateContent: function() {\n      var template = this.querySelector('template');\n      return template && templateContent(template);\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 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\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 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  };\n\n  var prefixLength = EVENT_PREFIX.length;\n\n  // exports\n  scope.api.declaration.events = events;\n\n})(Polymer);","/*\r\n * Copyright 2013 The Polymer Authors. All rights reserved.\r\n * Use of this source code is governed by a BSD-style\r\n * license that can be found in the LICENSE file.\r\n */\r\n(function(scope) {\r\n\r\n  // element api\r\n\r\n  var properties = {\r\n    inferObservers: function(prototype) {\r\n      // called before prototype.observe is chained to inherited object\r\n      var observe = prototype.observe, property;\r\n      for (var n in prototype) {\r\n        if (n.slice(-7) === 'Changed') {\r\n          if (!observe) {\r\n            observe  = (prototype.observe = {});\r\n          }\r\n          property = n.slice(0, -7)\r\n          observe[property] = observe[property] || n;\r\n        }\r\n      }\r\n    },\r\n    explodeObservers: function(prototype) {\r\n      // called before prototype.observe is chained to inherited object\r\n      var o = prototype.observe;\r\n      if (o) {\r\n        var exploded = {};\r\n        for (var n in o) {\r\n          var names = n.split(' ');\r\n          for (var i=0, ni; ni=names[i]; i++) {\r\n            exploded[ni] = o[n];\r\n          }\r\n        }\r\n        prototype.observe = exploded;\r\n      }\r\n    },\r\n    optimizePropertyMaps: function(prototype) {\r\n      if (prototype.observe) {\r\n        // construct name list\r\n        var a = prototype._observeNames = [];\r\n        for (var n in prototype.observe) {\r\n          var names = n.split(' ');\r\n          for (var i=0, ni; ni=names[i]; i++) {\r\n            a.push(ni);\r\n          }\r\n        }\r\n      }\r\n      if (prototype.publish) {\r\n        // construct name list\r\n        var a = prototype._publishNames = [];\r\n        for (var n in prototype.publish) {\r\n          a.push(n);\r\n        }\r\n      }\r\n    },\r\n    publishProperties: function(prototype, base) {\r\n      // if we have any properties to publish\r\n      var publish = prototype.publish;\r\n      if (publish) {\r\n        // transcribe `publish` entries onto own prototype\r\n        this.requireProperties(publish, prototype, base);\r\n        // construct map of lower-cased property names\r\n        prototype._publishLC = this.lowerCaseMap(publish);\r\n      }\r\n    },\r\n    requireProperties: function(properties, prototype, base) {\r\n      // ensure a prototype value for each property\r\n      for (var n in properties) {\r\n        if (prototype[n] === undefined && base[n] === undefined) {\r\n          prototype[n] = properties[n];\r\n        }\r\n      }\r\n    },\r\n    lowerCaseMap: function(properties) {\r\n      var map = {};\r\n      for (var n in properties) {\r\n        map[n.toLowerCase()] = n;\r\n      }\r\n      return map;\r\n    }\r\n  };\r\n\r\n  // exports\r\n\r\n  scope.api.declaration.properties = properties;\r\n\r\n})(Polymer);\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(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    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    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          // do not override explicit entries\n          if (n && publish[n] === undefined && base[n] === undefined) {\n            publish[n] = null;\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    isInstanceAttribute: function(name) {\n      return !this.blackList[name] && name.slice(0,3) !== 'on-';\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  // 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 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  // 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 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      // 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 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  var queue = {\n    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      if (this.indexOf(element) === -1) {\n        this.add(element);\n        element.__check = check;\n        element.__go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n    add: function(element) {\n      //console.log('queueing', element.name);\n      queueForElement(element).push(element);\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    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        readied.__go.call(readied);\n        readied.__check = readied.__go = null;\n        this.check();\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    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n    nextElement: function() {\n      return nextQueued();\n    },\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n    isEmpty: function() {\n      return !importQueue.length && !mainQueue.length;\n    },\n    ready: function() {\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      if (readyCallbacks) {\n        var fn;\n        while (readyCallbacks.length) {\n          fn = readyCallbacks.shift();\n          fn();\n        }\n      }\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\n      }\n    },\n    waitToReady: true\n  };\n\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.queue = queue;\n  scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\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(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 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  // 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      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      // TODO(sorvell): ends up calling '_register' by virtue\n      // of `waitingForQueue` (see below)\n      queue.go(this);\n    },\n\n    // TODO(sorvell): refactor, this method is private-ish, but it's being\n    // called by the queue object.\n    _register: function() {\n      //console.log('registering', this.name);\n      //console.group('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      //console.groupEnd();\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        // TODO(sorvell): CustomElements polyfill awareness:\n        // noscript elements should upgrade in logical order\n        // script injection ensures this under native custom elements;\n        // under imports + ce polyfills, scripts run before upgrades.\n        // dependencies should be ready at upgrade time so register\n        // prototype at this time.\n        if (window.CustomElements && !CustomElements.useNative) {\n          Polymer(name);\n        } else {\n          var script = document.createElement('script');\n          script.textContent = 'Polymer(\\'' + name + '\\');';\n          this.appendChild(script);\n        }\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.wait(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  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\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"]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/use_native_dartium_shadowdom.js b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/use_native_dartium_shadowdom.js
new file mode 100644
index 0000000..7b492b7
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/use_native_dartium_shadowdom.js
@@ -0,0 +1,29 @@
+// Prevent polyfilled JS Shadow DOM in Dartium
+// We need this if we want Dart code to be able to interoperate with Polymer.js
+// code that also uses Shadow DOM.
+// TODO(jmesserly): we can remove this code once platform.js is correctly
+// feature detecting Shadow DOM in Dartium.
+if (navigator.userAgent.indexOf('(Dart)') !== -1) {
+  window.Platform = window.Platform || {};
+  Platform.flags = Platform.flags || {};
+  Platform.flags.shadow = 'native';
+
+  // Note: Dartium 34 hasn't turned on the unprefixed Shadow DOM
+  // (this happens in Chrome 35), so unless "enable experimental platform
+  // features" is enabled, things will break. So we expose them as unprefixed
+  // names instead.
+  var proto = Element.prototype;
+  if (!proto.createShadowRoot) {
+    proto.createShadowRoot = proto.webkitCreateShadowRoot;
+
+    Object.defineProperty(proto, 'shadowRoot', {
+      get: function() {
+        return this.webkitShadowRoot;
+      },
+      set: function(value) {
+        this.webkitShadowRoot = value;
+      },
+      configurable: true
+    });
+  }
+}
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/web_components/build.log b/runtime/bin/vmservice/client/deployed/web/packages/web_components/build.log
new file mode 100644
index 0000000..2dfd8d5
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/web_components/build.log
@@ -0,0 +1,43 @@
+BUILD LOG
+---------
+Build Time: 2014-04-01T15:17:50
+
+NODEJS INFORMATION
+==================
+nodejs: v0.10.26
+chai: 1.9.1
+grunt: 0.4.4
+grunt-audit: 0.0.3
+grunt-concat-sourcemap: 0.4.1
+grunt-contrib-concat: 0.4.0
+grunt-karma: 0.8.2
+grunt-contrib-uglify: 0.3.3
+grunt-contrib-yuidoc: 0.5.2
+karma: 0.12.2
+karma-crbot-reporter: 0.0.4
+karma-firefox-launcher: 0.1.3
+karma-ie-launcher: 0.1.4
+karma-safari-launcher: 0.1.1
+mocha: 1.18.2
+karma-mocha: 0.1.3
+karma-script-launcher: 0.1.0
+Platform: 0.2.2
+
+REPO REVISIONS
+==============
+CustomElements: 9b997ca97533147f5f17bd666c06e5fa1a13219e
+HTMLImports: 5f44b337ef6508271dd594f1ec086fac2be3cb0c
+NodeBind: b040e791f573b04cf06fdbc7d407712d46f4fca6
+PointerEvents: 86c341c7ef946dc295cb93a2b5ebebde69dbdcb7
+PointerGestures: e5ec43dcef5a20d789c7e4c09dd206cdb6664a27
+ShadowDOM: 4fe518f54bfdace322866822f9a5c99f41169a10
+TemplateBinding: 9dc4c42334b00716cec2826cb17dda6044c4aeb4
+WeakMap: a0947a9a0f58f5733f464755c3b86de624b00a5d
+observe-js: 5db3ef588f3fdca7d44cdd24e3bf59b6d547b8c0
+platform: b4641125892409501e82ba3f44add15ab10be274
+polymer-expressions: 1749343a75fc3aa84d691f14c4582a6d1a7f39f1
+platform-dev: ccb7c307ee78d6694b4ca9e2422996f0cbe4a07c
+
+BUILD HASHES
+============
+build/platform.js: 8edd41e9de6172d38ace4a17f2aad8ec0556abd8
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/web_components/dart_support.js b/runtime/bin/vmservice/client/deployed/web/packages/web_components/dart_support.js
new file mode 100644
index 0000000..503faee
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/web_components/dart_support.js
@@ -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.
+
+(function() {
+  var ShadowDOMPolyfill = window.ShadowDOMPolyfill;
+  if (!ShadowDOMPolyfill) return;
+
+  if (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.");
+  }
+
+  var needsConstructorFix = window.constructor === window.Window;
+
+  // TODO(jmesserly): we need to wrap document somehow (a dart:html hook?)
+
+  // dartNativeDispatchHooksTransformer is described on initHooks() in
+  // sdk/lib/_internal/lib/native_helper.dart.
+  if (typeof window.dartNativeDispatchHooksTransformer == 'undefined')
+    window.dartNativeDispatchHooksTransformer = [];
+
+  window.dartNativeDispatchHooksTransformer.push(function(hooks) {
+    var NodeList = ShadowDOMPolyfill.wrappers.NodeList;
+    var ShadowRoot = ShadowDOMPolyfill.wrappers.ShadowRoot;
+    var unwrapIfNeeded = ShadowDOMPolyfill.unwrapIfNeeded;
+    var originalGetTag = hooks.getTag;
+    hooks.getTag = function getTag(obj) {
+      // TODO(jmesserly): do we still need these?
+      if (obj instanceof NodeList) return 'NodeList';
+      if (obj instanceof ShadowRoot) return 'ShadowRoot';
+      if (MutationRecord && (obj instanceof MutationRecord))
+          return 'MutationRecord';
+      if (MutationObserver && (obj instanceof MutationObserver))
+          return 'MutationObserver';
+
+      // TODO(jmesserly): this prevents incorrect interaction between ShadowDOM
+      // and dart:html's <template> polyfill. Essentially, ShadowDOM is
+      // polyfilling native template, but our Dart polyfill fails to detect this
+      // because the unwrapped node is an HTMLUnknownElement, leading it to
+      // think the node has no content.
+      if (obj instanceof HTMLTemplateElement) return 'HTMLTemplateElement';
+
+      var unwrapped = unwrapIfNeeded(obj);
+      if (unwrapped && (needsConstructorFix || obj !== unwrapped)) {
+        // Fix up class names for Firefox, or if using the minified polyfill.
+        // dart2js prefers .constructor.name, but there are all kinds of cases
+        // where this will give the wrong answer.
+        var ctor = obj.constructor
+        if (ctor === unwrapped.constructor) {
+          var name = ctor._ShadowDOMPolyfill$cacheTag_;
+          if (!name) {
+            name = originalGetTag(unwrapped);
+            ctor._ShadowDOMPolyfill$cacheTag_ = name;
+          }
+          return name;
+        }
+
+        obj = unwrapped;
+      }
+      return originalGetTag(obj);
+    }
+  });
+})();
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.concat.js b/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.concat.js
new file mode 100644
index 0000000..9fa19b5
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.concat.js
@@ -0,0 +1,17703 @@
+/*
+ * Copyright 2012 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.
+ */
+
+if (typeof WeakMap === 'undefined') {
+  (function() {
+    var defineProperty = Object.defineProperty;
+    var counter = Date.now() % 1e9;
+
+    var WeakMap = function() {
+      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');
+    };
+
+    WeakMap.prototype = {
+      set: function(key, value) {
+        var entry = key[this.name];
+        if (entry && entry[0] === key)
+          entry[1] = value;
+        else
+          defineProperty(key, this.name, {value: [key, value], writable: true});
+      },
+      get: function(key) {
+        var entry;
+        return (entry = key[this.name]) && entry[0] === key ?
+            entry[1] : undefined;
+      },
+      delete: function(key) {
+        this.set(key, undefined);
+      }
+    };
+
+    window.WeakMap = WeakMap;
+  })();
+}
+
+// Copyright 2012 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(global) {
+  'use strict';
+
+  // Detect and do basic sanity checking on Object/Array.observe.
+  function detectObjectObserve() {
+    if (typeof Object.observe !== 'function' ||
+        typeof Array.observe !== 'function') {
+      return false;
+    }
+
+    var records = [];
+
+    function callback(recs) {
+      records = recs;
+    }
+
+    var test = {};
+    var arr = [];
+    Object.observe(test, callback);
+    Array.observe(arr, callback);
+    test.id = 1;
+    test.id = 2;
+    delete test.id;
+    arr.push(1, 2);
+    arr.length = 0;
+
+    Object.deliverChangeRecords(callback);
+    if (records.length !== 5)
+      return false;
+
+    if (records[0].type != 'add' ||
+        records[1].type != 'update' ||
+        records[2].type != 'delete' ||
+        records[3].type != 'splice' ||
+        records[4].type != 'splice') {
+      return false;
+    }
+
+    Object.unobserve(test, callback);
+    Array.unobserve(arr, callback);
+
+    return true;
+  }
+
+  var hasObserve = detectObjectObserve();
+
+  function detectEval() {
+    // don't test for eval if document has CSP securityPolicy object and we can see that
+    // eval is not supported. This avoids an error message in console even when the exception
+    // is caught
+    if (global.document &&
+        'securityPolicy' in global.document &&
+        !global.document.securityPolicy.allowsEval) {
+      return false;
+    }
+
+    try {
+      var f = new Function('', 'return true;');
+      return f();
+    } catch (ex) {
+      return false;
+    }
+  }
+
+  var hasEval = detectEval();
+
+  function isIndex(s) {
+    return +s === s >>> 0;
+  }
+
+  function toNumber(s) {
+    return +s;
+  }
+
+  function isObject(obj) {
+    return obj === Object(obj);
+  }
+
+  var numberIsNaN = global.Number.isNaN || function isNaN(value) {
+    return typeof value === 'number' && global.isNaN(value);
+  }
+
+  function areSameValue(left, right) {
+    if (left === right)
+      return left !== 0 || 1 / left === 1 / right;
+    if (numberIsNaN(left) && numberIsNaN(right))
+      return true;
+
+    return left !== left && right !== right;
+  }
+
+  var createObject = ('__proto__' in {}) ?
+    function(obj) { return obj; } :
+    function(obj) {
+      var proto = obj.__proto__;
+      if (!proto)
+        return obj;
+      var newObject = Object.create(proto);
+      Object.getOwnPropertyNames(obj).forEach(function(name) {
+        Object.defineProperty(newObject, name,
+                             Object.getOwnPropertyDescriptor(obj, name));
+      });
+      return newObject;
+    };
+
+  var identStart = '[\$_a-zA-Z]';
+  var identPart = '[\$_a-zA-Z0-9]';
+  var ident = identStart + '+' + identPart + '*';
+  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';
+  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';
+  var path = '(?:' + identOrElementIndex + ')(?:\\s*\\.\\s*' + identOrElementIndex + ')*';
+  var pathRegExp = new RegExp('^' + path + '$');
+
+  function isPathValid(s) {
+    if (typeof s != 'string')
+      return false;
+    s = s.trim();
+
+    if (s == '')
+      return true;
+
+    if (s[0] == '.')
+      return false;
+
+    return pathRegExp.test(s);
+  }
+
+  var constructorIsPrivate = {};
+
+  function Path(s, privateToken) {
+    if (privateToken !== constructorIsPrivate)
+      throw Error('Use Path.get to retrieve path objects');
+
+    if (s.trim() == '')
+      return this;
+
+    if (isIndex(s)) {
+      this.push(s);
+      return this;
+    }
+
+    s.split(/\s*\.\s*/).filter(function(part) {
+      return part;
+    }).forEach(function(part) {
+      this.push(part);
+    }, this);
+
+    if (hasEval && this.length) {
+      this.getValueFrom = this.compiledGetValueFromFn();
+    }
+  }
+
+  // TODO(rafaelw): Make simple LRU cache
+  var pathCache = {};
+
+  function getPath(pathString) {
+    if (pathString instanceof Path)
+      return pathString;
+
+    if (pathString == null)
+      pathString = '';
+
+    if (typeof pathString !== 'string')
+      pathString = String(pathString);
+
+    var path = pathCache[pathString];
+    if (path)
+      return path;
+    if (!isPathValid(pathString))
+      return invalidPath;
+    var path = new Path(pathString, constructorIsPrivate);
+    pathCache[pathString] = path;
+    return path;
+  }
+
+  Path.get = getPath;
+
+  Path.prototype = createObject({
+    __proto__: [],
+    valid: true,
+
+    toString: function() {
+      return this.join('.');
+    },
+
+    getValueFrom: function(obj, directObserver) {
+      for (var i = 0; i < this.length; i++) {
+        if (obj == null)
+          return;
+        obj = obj[this[i]];
+      }
+      return obj;
+    },
+
+    iterateObjects: function(obj, observe) {
+      for (var i = 0; i < this.length; i++) {
+        if (i)
+          obj = obj[this[i - 1]];
+        if (!isObject(obj))
+          return;
+        observe(obj);
+      }
+    },
+
+    compiledGetValueFromFn: function() {
+      var accessors = this.map(function(ident) {
+        return isIndex(ident) ? '["' + ident + '"]' : '.' + ident;
+      });
+
+      var str = '';
+      var pathString = 'obj';
+      str += 'if (obj != null';
+      var i = 0;
+      for (; i < (this.length - 1); i++) {
+        var ident = this[i];
+        pathString += accessors[i];
+        str += ' &&\n     ' + pathString + ' != null';
+      }
+      str += ')\n';
+
+      pathString += accessors[i];
+
+      str += '  return ' + pathString + ';\nelse\n  return undefined;';
+      return new Function('obj', str);
+    },
+
+    setValueFrom: function(obj, value) {
+      if (!this.length)
+        return false;
+
+      for (var i = 0; i < this.length - 1; i++) {
+        if (!isObject(obj))
+          return false;
+        obj = obj[this[i]];
+      }
+
+      if (!isObject(obj))
+        return false;
+
+      obj[this[i]] = value;
+      return true;
+    }
+  });
+
+  var invalidPath = new Path('', constructorIsPrivate);
+  invalidPath.valid = false;
+  invalidPath.getValueFrom = invalidPath.setValueFrom = function() {};
+
+  var MAX_DIRTY_CHECK_CYCLES = 1000;
+
+  function dirtyCheck(observer) {
+    var cycles = 0;
+    while (cycles < MAX_DIRTY_CHECK_CYCLES && observer.check_()) {
+      cycles++;
+    }
+    if (global.testingExposeCycleCount)
+      global.dirtyCheckCycleCount = cycles;
+
+    return cycles > 0;
+  }
+
+  function objectIsEmpty(object) {
+    for (var prop in object)
+      return false;
+    return true;
+  }
+
+  function diffIsEmpty(diff) {
+    return objectIsEmpty(diff.added) &&
+           objectIsEmpty(diff.removed) &&
+           objectIsEmpty(diff.changed);
+  }
+
+  function diffObjectFromOldObject(object, oldObject) {
+    var added = {};
+    var removed = {};
+    var changed = {};
+
+    for (var prop in oldObject) {
+      var newValue = object[prop];
+
+      if (newValue !== undefined && newValue === oldObject[prop])
+        continue;
+
+      if (!(prop in object)) {
+        removed[prop] = undefined;
+        continue;
+      }
+
+      if (newValue !== oldObject[prop])
+        changed[prop] = newValue;
+    }
+
+    for (var prop in object) {
+      if (prop in oldObject)
+        continue;
+
+      added[prop] = object[prop];
+    }
+
+    if (Array.isArray(object) && object.length !== oldObject.length)
+      changed.length = object.length;
+
+    return {
+      added: added,
+      removed: removed,
+      changed: changed
+    };
+  }
+
+  var eomTasks = [];
+  function runEOMTasks() {
+    if (!eomTasks.length)
+      return false;
+
+    for (var i = 0; i < eomTasks.length; i++) {
+      eomTasks[i]();
+    }
+    eomTasks.length = 0;
+    return true;
+  }
+
+  var runEOM = hasObserve ? (function(){
+    var eomObj = { pingPong: true };
+    var eomRunScheduled = false;
+
+    Object.observe(eomObj, function() {
+      runEOMTasks();
+      eomRunScheduled = false;
+    });
+
+    return function(fn) {
+      eomTasks.push(fn);
+      if (!eomRunScheduled) {
+        eomRunScheduled = true;
+        eomObj.pingPong = !eomObj.pingPong;
+      }
+    };
+  })() :
+  (function() {
+    return function(fn) {
+      eomTasks.push(fn);
+    };
+  })();
+
+  var observedObjectCache = [];
+
+  function newObservedObject() {
+    var observer;
+    var object;
+    var discardRecords = false;
+    var first = true;
+
+    function callback(records) {
+      if (observer && observer.state_ === OPENED && !discardRecords)
+        observer.check_(records);
+    }
+
+    return {
+      open: function(obs) {
+        if (observer)
+          throw Error('ObservedObject in use');
+
+        if (!first)
+          Object.deliverChangeRecords(callback);
+
+        observer = obs;
+        first = false;
+      },
+      observe: function(obj, arrayObserve) {
+        object = obj;
+        if (arrayObserve)
+          Array.observe(object, callback);
+        else
+          Object.observe(object, callback);
+      },
+      deliver: function(discard) {
+        discardRecords = discard;
+        Object.deliverChangeRecords(callback);
+        discardRecords = false;
+      },
+      close: function() {
+        observer = undefined;
+        Object.unobserve(object, callback);
+        observedObjectCache.push(this);
+      }
+    };
+  }
+
+  function getObservedObject(observer, object, arrayObserve) {
+    var dir = observedObjectCache.pop() || newObservedObject();
+    dir.open(observer);
+    dir.observe(object, arrayObserve);
+    return dir;
+  }
+
+  var emptyArray = [];
+  var observedSetCache = [];
+
+  function newObservedSet() {
+    var observers = [];
+    var observerCount = 0;
+    var objects = [];
+    var toRemove = emptyArray;
+    var resetNeeded = false;
+    var resetScheduled = false;
+
+    function observe(obj) {
+      if (!obj)
+        return;
+
+      var index = toRemove.indexOf(obj);
+      if (index >= 0) {
+        toRemove[index] = undefined;
+        objects.push(obj);
+      } else if (objects.indexOf(obj) < 0) {
+        objects.push(obj);
+        Object.observe(obj, callback);
+      }
+
+      observe(Object.getPrototypeOf(obj));
+    }
+
+    function reset() {
+      var objs = toRemove === emptyArray ? [] : toRemove;
+      toRemove = objects;
+      objects = objs;
+
+      var observer;
+      for (var id in observers) {
+        observer = observers[id];
+        if (!observer || observer.state_ != OPENED)
+          continue;
+
+        observer.iterateObjects_(observe);
+      }
+
+      for (var i = 0; i < toRemove.length; i++) {
+        var obj = toRemove[i];
+        if (obj)
+          Object.unobserve(obj, callback);
+      }
+
+      toRemove.length = 0;
+    }
+
+    function scheduledReset() {
+      resetScheduled = false;
+      if (!resetNeeded)
+        return;
+
+      reset();
+    }
+
+    function scheduleReset() {
+      if (resetScheduled)
+        return;
+
+      resetNeeded = true;
+      resetScheduled = true;
+      runEOM(scheduledReset);
+    }
+
+    function callback() {
+      reset();
+
+      var observer;
+
+      for (var id in observers) {
+        observer = observers[id];
+        if (!observer || observer.state_ != OPENED)
+          continue;
+
+        observer.check_();
+      }
+    }
+
+    var record = {
+      object: undefined,
+      objects: objects,
+      open: function(obs) {
+        observers[obs.id_] = obs;
+        observerCount++;
+        obs.iterateObjects_(observe);
+      },
+      close: function(obs) {
+        var anyLeft = false;
+
+        observers[obs.id_] = undefined;
+        observerCount--;
+
+        if (observerCount) {
+          scheduleReset();
+          return;
+        }
+        resetNeeded = false;
+
+        for (var i = 0; i < objects.length; i++) {
+          Object.unobserve(objects[i], callback);
+          Observer.unobservedCount++;
+        }
+
+        observers.length = 0;
+        objects.length = 0;
+        observedSetCache.push(this);
+      },
+      reset: scheduleReset
+    };
+
+    return record;
+  }
+
+  var lastObservedSet;
+
+  function getObservedSet(observer, obj) {
+    if (!lastObservedSet || lastObservedSet.object !== obj) {
+      lastObservedSet = observedSetCache.pop() || newObservedSet();
+      lastObservedSet.object = obj;
+    }
+    lastObservedSet.open(observer);
+    return lastObservedSet;
+  }
+
+  var UNOPENED = 0;
+  var OPENED = 1;
+  var CLOSED = 2;
+  var RESETTING = 3;
+
+  var nextObserverId = 1;
+
+  function Observer() {
+    this.state_ = UNOPENED;
+    this.callback_ = undefined;
+    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef
+    this.directObserver_ = undefined;
+    this.value_ = undefined;
+    this.id_ = nextObserverId++;
+  }
+
+  Observer.prototype = {
+    open: function(callback, target) {
+      if (this.state_ != UNOPENED)
+        throw Error('Observer has already been opened.');
+
+      addToAll(this);
+      this.callback_ = callback;
+      this.target_ = target;
+      this.state_ = OPENED;
+      this.connect_();
+      return this.value_;
+    },
+
+    close: function() {
+      if (this.state_ != OPENED)
+        return;
+
+      removeFromAll(this);
+      this.state_ = CLOSED;
+      this.disconnect_();
+      this.value_ = undefined;
+      this.callback_ = undefined;
+      this.target_ = undefined;
+    },
+
+    deliver: function() {
+      if (this.state_ != OPENED)
+        return;
+
+      dirtyCheck(this);
+    },
+
+    report_: function(changes) {
+      try {
+        this.callback_.apply(this.target_, changes);
+      } catch (ex) {
+        Observer._errorThrownDuringCallback = true;
+        console.error('Exception caught during observer callback: ' +
+                       (ex.stack || ex));
+      }
+    },
+
+    discardChanges: function() {
+      this.check_(undefined, true);
+      return this.value_;
+    }
+  }
+
+  var collectObservers = !hasObserve;
+  var allObservers;
+  Observer._allObserversCount = 0;
+
+  if (collectObservers) {
+    allObservers = [];
+  }
+
+  function addToAll(observer) {
+    Observer._allObserversCount++;
+    if (!collectObservers)
+      return;
+
+    allObservers.push(observer);
+  }
+
+  function removeFromAll(observer) {
+    Observer._allObserversCount--;
+  }
+
+  var runningMicrotaskCheckpoint = false;
+
+  var hasDebugForceFullDelivery = hasObserve && (function() {
+    try {
+      eval('%RunMicrotasks()');
+      return true;
+    } catch (ex) {
+      return false;
+    }
+  })();
+
+  global.Platform = global.Platform || {};
+
+  global.Platform.performMicrotaskCheckpoint = function() {
+    if (runningMicrotaskCheckpoint)
+      return;
+
+    if (hasDebugForceFullDelivery) {
+      eval('%RunMicrotasks()');
+      return;
+    }
+
+    if (!collectObservers)
+      return;
+
+    runningMicrotaskCheckpoint = true;
+
+    var cycles = 0;
+    var anyChanged, toCheck;
+
+    do {
+      cycles++;
+      toCheck = allObservers;
+      allObservers = [];
+      anyChanged = false;
+
+      for (var i = 0; i < toCheck.length; i++) {
+        var observer = toCheck[i];
+        if (observer.state_ != OPENED)
+          continue;
+
+        if (observer.check_())
+          anyChanged = true;
+
+        allObservers.push(observer);
+      }
+      if (runEOMTasks())
+        anyChanged = true;
+    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);
+
+    if (global.testingExposeCycleCount)
+      global.dirtyCheckCycleCount = cycles;
+
+    runningMicrotaskCheckpoint = false;
+  };
+
+  if (collectObservers) {
+    global.Platform.clearObservers = function() {
+      allObservers = [];
+    };
+  }
+
+  function ObjectObserver(object) {
+    Observer.call(this);
+    this.value_ = object;
+    this.oldObject_ = undefined;
+  }
+
+  ObjectObserver.prototype = createObject({
+    __proto__: Observer.prototype,
+
+    arrayObserve: false,
+
+    connect_: function(callback, target) {
+      if (hasObserve) {
+        this.directObserver_ = getObservedObject(this, this.value_,
+                                                 this.arrayObserve);
+      } else {
+        this.oldObject_ = this.copyObject(this.value_);
+      }
+
+    },
+
+    copyObject: function(object) {
+      var copy = Array.isArray(object) ? [] : {};
+      for (var prop in object) {
+        copy[prop] = object[prop];
+      };
+      if (Array.isArray(object))
+        copy.length = object.length;
+      return copy;
+    },
+
+    check_: function(changeRecords, skipChanges) {
+      var diff;
+      var oldValues;
+      if (hasObserve) {
+        if (!changeRecords)
+          return false;
+
+        oldValues = {};
+        diff = diffObjectFromChangeRecords(this.value_, changeRecords,
+                                           oldValues);
+      } else {
+        oldValues = this.oldObject_;
+        diff = diffObjectFromOldObject(this.value_, this.oldObject_);
+      }
+
+      if (diffIsEmpty(diff))
+        return false;
+
+      if (!hasObserve)
+        this.oldObject_ = this.copyObject(this.value_);
+
+      this.report_([
+        diff.added || {},
+        diff.removed || {},
+        diff.changed || {},
+        function(property) {
+          return oldValues[property];
+        }
+      ]);
+
+      return true;
+    },
+
+    disconnect_: function() {
+      if (hasObserve) {
+        this.directObserver_.close();
+        this.directObserver_ = undefined;
+      } else {
+        this.oldObject_ = undefined;
+      }
+    },
+
+    deliver: function() {
+      if (this.state_ != OPENED)
+        return;
+
+      if (hasObserve)
+        this.directObserver_.deliver(false);
+      else
+        dirtyCheck(this);
+    },
+
+    discardChanges: function() {
+      if (this.directObserver_)
+        this.directObserver_.deliver(true);
+      else
+        this.oldObject_ = this.copyObject(this.value_);
+
+      return this.value_;
+    }
+  });
+
+  function ArrayObserver(array) {
+    if (!Array.isArray(array))
+      throw Error('Provided object is not an Array');
+    ObjectObserver.call(this, array);
+  }
+
+  ArrayObserver.prototype = createObject({
+
+    __proto__: ObjectObserver.prototype,
+
+    arrayObserve: true,
+
+    copyObject: function(arr) {
+      return arr.slice();
+    },
+
+    check_: function(changeRecords) {
+      var splices;
+      if (hasObserve) {
+        if (!changeRecords)
+          return false;
+        splices = projectArraySplices(this.value_, changeRecords);
+      } else {
+        splices = calcSplices(this.value_, 0, this.value_.length,
+                              this.oldObject_, 0, this.oldObject_.length);
+      }
+
+      if (!splices || !splices.length)
+        return false;
+
+      if (!hasObserve)
+        this.oldObject_ = this.copyObject(this.value_);
+
+      this.report_([splices]);
+      return true;
+    }
+  });
+
+  ArrayObserver.applySplices = function(previous, current, splices) {
+    splices.forEach(function(splice) {
+      var spliceArgs = [splice.index, splice.removed.length];
+      var addIndex = splice.index;
+      while (addIndex < splice.index + splice.addedCount) {
+        spliceArgs.push(current[addIndex]);
+        addIndex++;
+      }
+
+      Array.prototype.splice.apply(previous, spliceArgs);
+    });
+  };
+
+  function PathObserver(object, path) {
+    Observer.call(this);
+
+    this.object_ = object;
+    this.path_ = path instanceof Path ? path : getPath(path);
+    this.directObserver_ = undefined;
+  }
+
+  PathObserver.prototype = createObject({
+    __proto__: Observer.prototype,
+
+    connect_: function() {
+      if (hasObserve)
+        this.directObserver_ = getObservedSet(this, this.object_);
+
+      this.check_(undefined, true);
+    },
+
+    disconnect_: function() {
+      this.value_ = undefined;
+
+      if (this.directObserver_) {
+        this.directObserver_.close(this);
+        this.directObserver_ = undefined;
+      }
+    },
+
+    iterateObjects_: function(observe) {
+      this.path_.iterateObjects(this.object_, observe);
+    },
+
+    check_: function(changeRecords, skipChanges) {
+      var oldValue = this.value_;
+      this.value_ = this.path_.getValueFrom(this.object_);
+      if (skipChanges || areSameValue(this.value_, oldValue))
+        return false;
+
+      this.report_([this.value_, oldValue]);
+      return true;
+    },
+
+    setValue: function(newValue) {
+      if (this.path_)
+        this.path_.setValueFrom(this.object_, newValue);
+    }
+  });
+
+  function CompoundObserver() {
+    Observer.call(this);
+
+    this.value_ = [];
+    this.directObserver_ = undefined;
+    this.observed_ = [];
+  }
+
+  var observerSentinel = {};
+
+  CompoundObserver.prototype = createObject({
+    __proto__: Observer.prototype,
+
+    connect_: function() {
+      this.check_(undefined, true);
+
+      if (!hasObserve)
+        return;
+
+      var object;
+      var needsDirectObserver = false;
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        object = this.observed_[i]
+        if (object !== observerSentinel) {
+          needsDirectObserver = true;
+          break;
+        }
+      }
+
+      if (this.directObserver_) {
+        if (needsDirectObserver) {
+          this.directObserver_.reset();
+          return;
+        }
+        this.directObserver_.close();
+        this.directObserver_ = undefined;
+        return;
+      }
+
+      if (needsDirectObserver)
+        this.directObserver_ = getObservedSet(this, object);
+    },
+
+    closeObservers_: function() {
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        if (this.observed_[i] === observerSentinel)
+          this.observed_[i + 1].close();
+      }
+      this.observed_.length = 0;
+    },
+
+    disconnect_: function() {
+      this.value_ = undefined;
+
+      if (this.directObserver_) {
+        this.directObserver_.close(this);
+        this.directObserver_ = undefined;
+      }
+
+      this.closeObservers_();
+    },
+
+    addPath: function(object, path) {
+      if (this.state_ != UNOPENED && this.state_ != RESETTING)
+        throw Error('Cannot add paths once started.');
+
+      this.observed_.push(object, path instanceof Path ? path : getPath(path));
+    },
+
+    addObserver: function(observer) {
+      if (this.state_ != UNOPENED && this.state_ != RESETTING)
+        throw Error('Cannot add observers once started.');
+
+      observer.open(this.deliver, this);
+      this.observed_.push(observerSentinel, observer);
+    },
+
+    startReset: function() {
+      if (this.state_ != OPENED)
+        throw Error('Can only reset while open');
+
+      this.state_ = RESETTING;
+      this.closeObservers_();
+    },
+
+    finishReset: function() {
+      if (this.state_ != RESETTING)
+        throw Error('Can only finishReset after startReset');
+      this.state_ = OPENED;
+      this.connect_();
+
+      return this.value_;
+    },
+
+    iterateObjects_: function(observe) {
+      var object;
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        object = this.observed_[i]
+        if (object !== observerSentinel)
+          this.observed_[i + 1].iterateObjects(object, observe)
+      }
+    },
+
+    check_: function(changeRecords, skipChanges) {
+      var oldValues;
+      for (var i = 0; i < this.observed_.length; i += 2) {
+        var pathOrObserver = this.observed_[i+1];
+        var object = this.observed_[i];
+        var value = object === observerSentinel ?
+            pathOrObserver.discardChanges() :
+            pathOrObserver.getValueFrom(object)
+
+        if (skipChanges) {
+          this.value_[i / 2] = value;
+          continue;
+        }
+
+        if (areSameValue(value, this.value_[i / 2]))
+          continue;
+
+        oldValues = oldValues || [];
+        oldValues[i / 2] = this.value_[i / 2];
+        this.value_[i / 2] = value;
+      }
+
+      if (!oldValues)
+        return false;
+
+      // TODO(rafaelw): Having observed_ as the third callback arg here is
+      // pretty lame API. Fix.
+      this.report_([this.value_, oldValues, this.observed_]);
+      return true;
+    }
+  });
+
+  function identFn(value) { return value; }
+
+  function ObserverTransform(observable, getValueFn, setValueFn,
+                             dontPassThroughSet) {
+    this.callback_ = undefined;
+    this.target_ = undefined;
+    this.value_ = undefined;
+    this.observable_ = observable;
+    this.getValueFn_ = getValueFn || identFn;
+    this.setValueFn_ = setValueFn || identFn;
+    // TODO(rafaelw): This is a temporary hack. PolymerExpressions needs this
+    // at the moment because of a bug in it's dependency tracking.
+    this.dontPassThroughSet_ = dontPassThroughSet;
+  }
+
+  ObserverTransform.prototype = {
+    open: function(callback, target) {
+      this.callback_ = callback;
+      this.target_ = target;
+      this.value_ =
+          this.getValueFn_(this.observable_.open(this.observedCallback_, this));
+      return this.value_;
+    },
+
+    observedCallback_: function(value) {
+      value = this.getValueFn_(value);
+      if (areSameValue(value, this.value_))
+        return;
+      var oldValue = this.value_;
+      this.value_ = value;
+      this.callback_.call(this.target_, this.value_, oldValue);
+    },
+
+    discardChanges: function() {
+      this.value_ = this.getValueFn_(this.observable_.discardChanges());
+      return this.value_;
+    },
+
+    deliver: function() {
+      return this.observable_.deliver();
+    },
+
+    setValue: function(value) {
+      value = this.setValueFn_(value);
+      if (!this.dontPassThroughSet_ && this.observable_.setValue)
+        return this.observable_.setValue(value);
+    },
+
+    close: function() {
+      if (this.observable_)
+        this.observable_.close();
+      this.callback_ = undefined;
+      this.target_ = undefined;
+      this.observable_ = undefined;
+      this.value_ = undefined;
+      this.getValueFn_ = undefined;
+      this.setValueFn_ = undefined;
+    }
+  }
+
+  var expectedRecordTypes = {
+    add: true,
+    update: true,
+    delete: true
+  };
+
+  function notifyFunction(object, name) {
+    if (typeof Object.observe !== 'function')
+      return;
+
+    var notifier = Object.getNotifier(object);
+    return function(type, oldValue) {
+      var changeRecord = {
+        object: object,
+        type: type,
+        name: name
+      };
+      if (arguments.length === 2)
+        changeRecord.oldValue = oldValue;
+      notifier.notify(changeRecord);
+    }
+  }
+
+  Observer.defineComputedProperty = function(target, name, observable) {
+    var notify = notifyFunction(target, name);
+    var value = observable.open(function(newValue, oldValue) {
+      value = newValue;
+      if (notify)
+        notify('update', oldValue);
+    });
+
+    Object.defineProperty(target, name, {
+      get: function() {
+        observable.deliver();
+        return value;
+      },
+      set: function(newValue) {
+        observable.setValue(newValue);
+        return newValue;
+      },
+      configurable: true
+    });
+
+    return {
+      close: function() {
+        observable.close();
+        Object.defineProperty(target, name, {
+          value: value,
+          writable: true,
+          configurable: true
+        });
+      }
+    };
+  }
+
+  function diffObjectFromChangeRecords(object, changeRecords, oldValues) {
+    var added = {};
+    var removed = {};
+
+    for (var i = 0; i < changeRecords.length; i++) {
+      var record = changeRecords[i];
+      if (!expectedRecordTypes[record.type]) {
+        console.error('Unknown changeRecord type: ' + record.type);
+        console.error(record);
+        continue;
+      }
+
+      if (!(record.name in oldValues))
+        oldValues[record.name] = record.oldValue;
+
+      if (record.type == 'update')
+        continue;
+
+      if (record.type == 'add') {
+        if (record.name in removed)
+          delete removed[record.name];
+        else
+          added[record.name] = true;
+
+        continue;
+      }
+
+      // type = 'delete'
+      if (record.name in added) {
+        delete added[record.name];
+        delete oldValues[record.name];
+      } else {
+        removed[record.name] = true;
+      }
+    }
+
+    for (var prop in added)
+      added[prop] = object[prop];
+
+    for (var prop in removed)
+      removed[prop] = undefined;
+
+    var changed = {};
+    for (var prop in oldValues) {
+      if (prop in added || prop in removed)
+        continue;
+
+      var newValue = object[prop];
+      if (oldValues[prop] !== newValue)
+        changed[prop] = newValue;
+    }
+
+    return {
+      added: added,
+      removed: removed,
+      changed: changed
+    };
+  }
+
+  function newSplice(index, removed, addedCount) {
+    return {
+      index: index,
+      removed: removed,
+      addedCount: addedCount
+    };
+  }
+
+  var EDIT_LEAVE = 0;
+  var EDIT_UPDATE = 1;
+  var EDIT_ADD = 2;
+  var EDIT_DELETE = 3;
+
+  function ArraySplice() {}
+
+  ArraySplice.prototype = {
+
+    // Note: This function is *based* on the computation of the Levenshtein
+    // "edit" distance. The one change is that "updates" are treated as two
+    // edits - not one. With Array splices, an update is really a delete
+    // followed by an add. By retaining this, we optimize for "keeping" the
+    // maximum array items in the original array. For example:
+    //
+    //   'xxxx123' -> '123yyyy'
+    //
+    // With 1-edit updates, the shortest path would be just to update all seven
+    // characters. With 2-edit updates, we delete 4, leave 3, and add 4. This
+    // leaves the substring '123' intact.
+    calcEditDistances: function(current, currentStart, currentEnd,
+                                old, oldStart, oldEnd) {
+      // "Deletion" columns
+      var rowCount = oldEnd - oldStart + 1;
+      var columnCount = currentEnd - currentStart + 1;
+      var distances = new Array(rowCount);
+
+      // "Addition" rows. Initialize null column.
+      for (var i = 0; i < rowCount; i++) {
+        distances[i] = new Array(columnCount);
+        distances[i][0] = i;
+      }
+
+      // Initialize null row
+      for (var j = 0; j < columnCount; j++)
+        distances[0][j] = j;
+
+      for (var i = 1; i < rowCount; i++) {
+        for (var j = 1; j < columnCount; j++) {
+          if (this.equals(current[currentStart + j - 1], old[oldStart + i - 1]))
+            distances[i][j] = distances[i - 1][j - 1];
+          else {
+            var north = distances[i - 1][j] + 1;
+            var west = distances[i][j - 1] + 1;
+            distances[i][j] = north < west ? north : west;
+          }
+        }
+      }
+
+      return distances;
+    },
+
+    // This starts at the final weight, and walks "backward" by finding
+    // the minimum previous weight recursively until the origin of the weight
+    // matrix.
+    spliceOperationsFromEditDistances: function(distances) {
+      var i = distances.length - 1;
+      var j = distances[0].length - 1;
+      var current = distances[i][j];
+      var edits = [];
+      while (i > 0 || j > 0) {
+        if (i == 0) {
+          edits.push(EDIT_ADD);
+          j--;
+          continue;
+        }
+        if (j == 0) {
+          edits.push(EDIT_DELETE);
+          i--;
+          continue;
+        }
+        var northWest = distances[i - 1][j - 1];
+        var west = distances[i - 1][j];
+        var north = distances[i][j - 1];
+
+        var min;
+        if (west < north)
+          min = west < northWest ? west : northWest;
+        else
+          min = north < northWest ? north : northWest;
+
+        if (min == northWest) {
+          if (northWest == current) {
+            edits.push(EDIT_LEAVE);
+          } else {
+            edits.push(EDIT_UPDATE);
+            current = northWest;
+          }
+          i--;
+          j--;
+        } else if (min == west) {
+          edits.push(EDIT_DELETE);
+          i--;
+          current = west;
+        } else {
+          edits.push(EDIT_ADD);
+          j--;
+          current = north;
+        }
+      }
+
+      edits.reverse();
+      return edits;
+    },
+
+    /**
+     * Splice Projection functions:
+     *
+     * A splice map is a representation of how a previous array of items
+     * was transformed into a new array of items. Conceptually it is a list of
+     * tuples of
+     *
+     *   <index, removed, addedCount>
+     *
+     * which are kept in ascending index order of. The tuple represents that at
+     * the |index|, |removed| sequence of items were removed, and counting forward
+     * from |index|, |addedCount| items were added.
+     */
+
+    /**
+     * Lacking individual splice mutation information, the minimal set of
+     * splices can be synthesized given the previous state and final state of an
+     * array. The basic approach is to calculate the edit distance matrix and
+     * choose the shortest path through it.
+     *
+     * Complexity: O(l * p)
+     *   l: The length of the current array
+     *   p: The length of the old array
+     */
+    calcSplices: function(current, currentStart, currentEnd,
+                          old, oldStart, oldEnd) {
+      var prefixCount = 0;
+      var suffixCount = 0;
+
+      var minLength = Math.min(currentEnd - currentStart, oldEnd - oldStart);
+      if (currentStart == 0 && oldStart == 0)
+        prefixCount = this.sharedPrefix(current, old, minLength);
+
+      if (currentEnd == current.length && oldEnd == old.length)
+        suffixCount = this.sharedSuffix(current, old, minLength - prefixCount);
+
+      currentStart += prefixCount;
+      oldStart += prefixCount;
+      currentEnd -= suffixCount;
+      oldEnd -= suffixCount;
+
+      if (currentEnd - currentStart == 0 && oldEnd - oldStart == 0)
+        return [];
+
+      if (currentStart == currentEnd) {
+        var splice = newSplice(currentStart, [], 0);
+        while (oldStart < oldEnd)
+          splice.removed.push(old[oldStart++]);
+
+        return [ splice ];
+      } else if (oldStart == oldEnd)
+        return [ newSplice(currentStart, [], currentEnd - currentStart) ];
+
+      var ops = this.spliceOperationsFromEditDistances(
+          this.calcEditDistances(current, currentStart, currentEnd,
+                                 old, oldStart, oldEnd));
+
+      var splice = undefined;
+      var splices = [];
+      var index = currentStart;
+      var oldIndex = oldStart;
+      for (var i = 0; i < ops.length; i++) {
+        switch(ops[i]) {
+          case EDIT_LEAVE:
+            if (splice) {
+              splices.push(splice);
+              splice = undefined;
+            }
+
+            index++;
+            oldIndex++;
+            break;
+          case EDIT_UPDATE:
+            if (!splice)
+              splice = newSplice(index, [], 0);
+
+            splice.addedCount++;
+            index++;
+
+            splice.removed.push(old[oldIndex]);
+            oldIndex++;
+            break;
+          case EDIT_ADD:
+            if (!splice)
+              splice = newSplice(index, [], 0);
+
+            splice.addedCount++;
+            index++;
+            break;
+          case EDIT_DELETE:
+            if (!splice)
+              splice = newSplice(index, [], 0);
+
+            splice.removed.push(old[oldIndex]);
+            oldIndex++;
+            break;
+        }
+      }
+
+      if (splice) {
+        splices.push(splice);
+      }
+      return splices;
+    },
+
+    sharedPrefix: function(current, old, searchLength) {
+      for (var i = 0; i < searchLength; i++)
+        if (!this.equals(current[i], old[i]))
+          return i;
+      return searchLength;
+    },
+
+    sharedSuffix: function(current, old, searchLength) {
+      var index1 = current.length;
+      var index2 = old.length;
+      var count = 0;
+      while (count < searchLength && this.equals(current[--index1], old[--index2]))
+        count++;
+
+      return count;
+    },
+
+    calculateSplices: function(current, previous) {
+      return this.calcSplices(current, 0, current.length, previous, 0,
+                              previous.length);
+    },
+
+    equals: function(currentValue, previousValue) {
+      return currentValue === previousValue;
+    }
+  };
+
+  var arraySplice = new ArraySplice();
+
+  function calcSplices(current, currentStart, currentEnd,
+                       old, oldStart, oldEnd) {
+    return arraySplice.calcSplices(current, currentStart, currentEnd,
+                                   old, oldStart, oldEnd);
+  }
+
+  function intersect(start1, end1, start2, end2) {
+    // Disjoint
+    if (end1 < start2 || end2 < start1)
+      return -1;
+
+    // Adjacent
+    if (end1 == start2 || end2 == start1)
+      return 0;
+
+    // Non-zero intersect, span1 first
+    if (start1 < start2) {
+      if (end1 < end2)
+        return end1 - start2; // Overlap
+      else
+        return end2 - start2; // Contained
+    } else {
+      // Non-zero intersect, span2 first
+      if (end2 < end1)
+        return end2 - start1; // Overlap
+      else
+        return end1 - start1; // Contained
+    }
+  }
+
+  function mergeSplice(splices, index, removed, addedCount) {
+
+    var splice = newSplice(index, removed, addedCount);
+
+    var inserted = false;
+    var insertionOffset = 0;
+
+    for (var i = 0; i < splices.length; i++) {
+      var current = splices[i];
+      current.index += insertionOffset;
+
+      if (inserted)
+        continue;
+
+      var intersectCount = intersect(splice.index,
+                                     splice.index + splice.removed.length,
+                                     current.index,
+                                     current.index + current.addedCount);
+
+      if (intersectCount >= 0) {
+        // Merge the two splices
+
+        splices.splice(i, 1);
+        i--;
+
+        insertionOffset -= current.addedCount - current.removed.length;
+
+        splice.addedCount += current.addedCount - intersectCount;
+        var deleteCount = splice.removed.length +
+                          current.removed.length - intersectCount;
+
+        if (!splice.addedCount && !deleteCount) {
+          // merged splice is a noop. discard.
+          inserted = true;
+        } else {
+          var removed = current.removed;
+
+          if (splice.index < current.index) {
+            // some prefix of splice.removed is prepended to current.removed.
+            var prepend = splice.removed.slice(0, current.index - splice.index);
+            Array.prototype.push.apply(prepend, removed);
+            removed = prepend;
+          }
+
+          if (splice.index + splice.removed.length > current.index + current.addedCount) {
+            // some suffix of splice.removed is appended to current.removed.
+            var append = splice.removed.slice(current.index + current.addedCount - splice.index);
+            Array.prototype.push.apply(removed, append);
+          }
+
+          splice.removed = removed;
+          if (current.index < splice.index) {
+            splice.index = current.index;
+          }
+        }
+      } else if (splice.index < current.index) {
+        // Insert splice here.
+
+        inserted = true;
+
+        splices.splice(i, 0, splice);
+        i++;
+
+        var offset = splice.addedCount - splice.removed.length
+        current.index += offset;
+        insertionOffset += offset;
+      }
+    }
+
+    if (!inserted)
+      splices.push(splice);
+  }
+
+  function createInitialSplices(array, changeRecords) {
+    var splices = [];
+
+    for (var i = 0; i < changeRecords.length; i++) {
+      var record = changeRecords[i];
+      switch(record.type) {
+        case 'splice':
+          mergeSplice(splices, record.index, record.removed.slice(), record.addedCount);
+          break;
+        case 'add':
+        case 'update':
+        case 'delete':
+          if (!isIndex(record.name))
+            continue;
+          var index = toNumber(record.name);
+          if (index < 0)
+            continue;
+          mergeSplice(splices, index, [record.oldValue], 1);
+          break;
+        default:
+          console.error('Unexpected record type: ' + JSON.stringify(record));
+          break;
+      }
+    }
+
+    return splices;
+  }
+
+  function projectArraySplices(array, changeRecords) {
+    var splices = [];
+
+    createInitialSplices(array, changeRecords).forEach(function(splice) {
+      if (splice.addedCount == 1 && splice.removed.length == 1) {
+        if (splice.removed[0] !== array[splice.index])
+          splices.push(splice);
+
+        return
+      };
+
+      splices = splices.concat(calcSplices(array, splice.index, splice.index + splice.addedCount,
+                                           splice.removed, 0, splice.removed.length));
+    });
+
+    return splices;
+  }
+
+  global.Observer = Observer;
+  global.Observer.runEOM_ = runEOM;
+  global.Observer.hasObjectObserve = hasObserve;
+  global.ArrayObserver = ArrayObserver;
+  global.ArrayObserver.calculateSplices = function(current, previous) {
+    return arraySplice.calculateSplices(current, previous);
+  };
+
+  global.ArraySplice = ArraySplice;
+  global.ObjectObserver = ObjectObserver;
+  global.PathObserver = PathObserver;
+  global.CompoundObserver = CompoundObserver;
+  global.Path = Path;
+  global.ObserverTransform = ObserverTransform;
+})(typeof global !== 'undefined' && global && typeof module !== 'undefined' && module ? global : this || window);
+
+// prepoulate window.Platform.flags for default controls

+window.Platform = window.Platform || {};

+// prepopulate window.logFlags if necessary

+window.logFlags = window.logFlags || {};

+// process flags

+(function(scope){

+  // import

+  var flags = scope.flags || {};

+  // populate flags from location

+  location.search.slice(1).split('&').forEach(function(o) {

+    o = o.split('=');

+    o[0] && (flags[o[0]] = o[1] || true);

+  });

+  var entryPoint = document.currentScript ||

+      document.querySelector('script[src*="platform.js"]');

+  if (entryPoint) {

+    var a = entryPoint.attributes;

+    for (var i = 0, n; i < a.length; i++) {

+      n = a[i];

+      if (n.name !== 'src') {

+        flags[n.name] = n.value || true;

+      }

+    }

+  }

+  if (flags.log) {

+    flags.log.split(',').forEach(function(f) {

+      window.logFlags[f] = true;

+    });

+  }

+  // If any of these flags match 'native', then force native ShadowDOM; any

+  // other truthy value, or failure to detect native

+  // ShadowDOM, results in polyfill

+  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;

+  if (flags.shadow === 'native') {

+    flags.shadow = false;

+  } else {

+    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;

+  }

+

+  if (flags.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.');

+  }

+

+  // CustomElements polyfill flag

+  if (flags.register) {

+    window.CustomElements = window.CustomElements || {flags: {}};

+    window.CustomElements.flags.register = flags.register;

+  }

+

+  if (flags.imports) {

+    window.HTMLImports = window.HTMLImports || {flags: {}};

+    window.HTMLImports.flags.imports = flags.imports;

+  }

+

+  // export

+  scope.flags = flags;

+})(Platform);

+

+// 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
+// license that can be found in the LICENSE file.
+
+window.ShadowDOMPolyfill = {};
+
+(function(scope) {
+  'use strict';
+
+  var constructorTable = new WeakMap();
+  var nativePrototypeTable = new WeakMap();
+  var wrappers = Object.create(null);
+
+  // Don't test for eval if document has CSP securityPolicy object and we can
+  // see that eval is not supported. This avoids an error message in console
+  // even when the exception is caught
+  var hasEval = !('securityPolicy' in document) ||
+      document.securityPolicy.allowsEval;
+  if (hasEval) {
+    try {
+      var f = new Function('', 'return true;');
+      hasEval = f();
+    } catch (ex) {
+      hasEval = false;
+    }
+  }
+
+  function assert(b) {
+    if (!b)
+      throw new Error('Assertion failed');
+  };
+
+  var defineProperty = Object.defineProperty;
+  var getOwnPropertyNames = Object.getOwnPropertyNames;
+  var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+
+  function mixin(to, from) {
+    getOwnPropertyNames(from).forEach(function(name) {
+      defineProperty(to, name, getOwnPropertyDescriptor(from, name));
+    });
+    return to;
+  };
+
+  function mixinStatics(to, from) {
+    getOwnPropertyNames(from).forEach(function(name) {
+      switch (name) {
+        case 'arguments':
+        case 'caller':
+        case 'length':
+        case 'name':
+        case 'prototype':
+        case 'toString':
+          return;
+      }
+      defineProperty(to, name, getOwnPropertyDescriptor(from, name));
+    });
+    return to;
+  };
+
+  function oneOf(object, propertyNames) {
+    for (var i = 0; i < propertyNames.length; i++) {
+      if (propertyNames[i] in object)
+        return propertyNames[i];
+    }
+  }
+
+  // Mozilla's old DOM bindings are bretty busted:
+  // https://bugzilla.mozilla.org/show_bug.cgi?id=855844
+  // Make sure they are create before we start modifying things.
+  getOwnPropertyNames(window);
+
+  function getWrapperConstructor(node) {
+    var nativePrototype = node.__proto__ || Object.getPrototypeOf(node);
+    var wrapperConstructor = constructorTable.get(nativePrototype);
+    if (wrapperConstructor)
+      return wrapperConstructor;
+
+    var parentWrapperConstructor = getWrapperConstructor(nativePrototype);
+
+    var GeneratedWrapper = createWrapperConstructor(parentWrapperConstructor);
+    registerInternal(nativePrototype, GeneratedWrapper, node);
+
+    return GeneratedWrapper;
+  }
+
+  function addForwardingProperties(nativePrototype, wrapperPrototype) {
+    installProperty(nativePrototype, wrapperPrototype, true);
+  }
+
+  function registerInstanceProperties(wrapperPrototype, instanceObject) {
+    installProperty(instanceObject, wrapperPrototype, false);
+  }
+
+  var isFirefox = /Firefox/.test(navigator.userAgent);
+
+  // This is used as a fallback when getting the descriptor fails in
+  // installProperty.
+  var dummyDescriptor = {
+    get: function() {},
+    set: function(v) {},
+    configurable: true,
+    enumerable: true
+  };
+
+  function isEventHandlerName(name) {
+    return /^on[a-z]+$/.test(name);
+  }
+
+  function isIdentifierName(name) {
+    return /^\w[a-zA-Z_0-9]*$/.test(name);
+  }
+
+  function getGetter(name) {
+    return hasEval && isIdentifierName(name) ?
+        new Function('return this.impl.' + name) :
+        function() { return this.impl[name]; };
+  }
+
+  function getSetter(name) {
+    return hasEval && isIdentifierName(name) ?
+        new Function('v', 'this.impl.' + name + ' = v') :
+        function(v) { this.impl[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); };
+  }
+
+  function getDescriptor(source, name) {
+    try {
+      return Object.getOwnPropertyDescriptor(source, name);
+    } catch (ex) {
+      // JSC and V8 both use data properties instead of accessors which can
+      // cause getting the property desciptor to throw an exception.
+      // https://bugs.webkit.org/show_bug.cgi?id=49739
+      return dummyDescriptor;
+    }
+  }
+
+  function installProperty(source, target, allowMethod, opt_blacklist) {
+    var names = getOwnPropertyNames(source);
+    for (var i = 0; i < names.length; i++) {
+      var name = names[i];
+      if (name === 'polymerBlackList_')
+        continue;
+
+      if (name in target)
+        continue;
+
+      if (source.polymerBlackList_ && source.polymerBlackList_[name])
+        continue;
+
+      if (isFirefox) {
+        // Tickle Firefox's old bindings.
+        source.__lookupGetter__(name);
+      }
+      var descriptor = getDescriptor(source, name);
+      var getter, setter;
+      if (allowMethod && typeof descriptor.value === 'function') {
+        target[name] = getMethod(name);
+        continue;
+      }
+
+      var isEvent = isEventHandlerName(name);
+      if (isEvent)
+        getter = scope.getEventHandlerGetter(name);
+      else
+        getter = getGetter(name);
+
+      if (descriptor.writable || descriptor.set) {
+        if (isEvent)
+          setter = scope.getEventHandlerSetter(name);
+        else
+          setter = getSetter(name);
+      }
+
+      defineProperty(target, name, {
+        get: getter,
+        set: setter,
+        configurable: descriptor.configurable,
+        enumerable: descriptor.enumerable
+      });
+    }
+  }
+
+  /**
+   * @param {Function} nativeConstructor
+   * @param {Function} wrapperConstructor
+   * @param {Object=} opt_instance If present, this is used to extract
+   *     properties from an instance object.
+   */
+  function register(nativeConstructor, wrapperConstructor, opt_instance) {
+    var nativePrototype = nativeConstructor.prototype;
+    registerInternal(nativePrototype, wrapperConstructor, opt_instance);
+    mixinStatics(wrapperConstructor, nativeConstructor);
+  }
+
+  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {
+    var wrapperPrototype = wrapperConstructor.prototype;
+    assert(constructorTable.get(nativePrototype) === undefined);
+
+    constructorTable.set(nativePrototype, wrapperConstructor);
+    nativePrototypeTable.set(wrapperPrototype, nativePrototype);
+
+    addForwardingProperties(nativePrototype, wrapperPrototype);
+    if (opt_instance)
+      registerInstanceProperties(wrapperPrototype, opt_instance);
+    defineProperty(wrapperPrototype, 'constructor', {
+      value: wrapperConstructor,
+      configurable: true,
+      enumerable: false,
+      writable: true
+    });
+    // Set it again. Some VMs optimizes objects that are used as prototypes.
+    wrapperConstructor.prototype = wrapperPrototype;
+  }
+
+  function isWrapperFor(wrapperConstructor, nativeConstructor) {
+    return constructorTable.get(nativeConstructor.prototype) ===
+        wrapperConstructor;
+  }
+
+  /**
+   * Creates a generic wrapper constructor based on |object| and its
+   * constructor.
+   * @param {Node} object
+   * @return {Function} The generated constructor.
+   */
+  function registerObject(object) {
+    var nativePrototype = Object.getPrototypeOf(object);
+
+    var superWrapperConstructor = getWrapperConstructor(nativePrototype);
+    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);
+    registerInternal(nativePrototype, GeneratedWrapper, object);
+
+    return GeneratedWrapper;
+  }
+
+  function createWrapperConstructor(superWrapperConstructor) {
+    function GeneratedWrapper(node) {
+      superWrapperConstructor.call(this, node);
+    }
+    var p = Object.create(superWrapperConstructor.prototype);
+    p.constructor = GeneratedWrapper;
+    GeneratedWrapper.prototype = p;
+
+    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;
+  }
+
+  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;
+  }
+
+  /**
+   * Wraps a node in a WrapperNode. If there already exists a wrapper for the
+   * |node| that wrapper is returned instead.
+   * @param {Node} node
+   * @return {WrapperNode}
+   */
+  function wrap(impl) {
+    if (impl === null)
+      return null;
+
+    assert(isNative(impl));
+    return impl.polymerWrapper_ ||
+        (impl.polymerWrapper_ = new (getWrapperConstructor(impl))(impl));
+  }
+
+  /**
+   * Unwraps a wrapper and returns the node it is wrapping.
+   * @param {WrapperNode} wrapper
+   * @return {Node}
+   */
+  function unwrap(wrapper) {
+    if (wrapper === null)
+      return null;
+    assert(isWrapper(wrapper));
+    return wrapper.impl;
+  }
+
+  /**
+   * Unwraps object if it is a wrapper.
+   * @param {Object} object
+   * @return {Object} The native implementation object.
+   */
+  function unwrapIfNeeded(object) {
+    return object && isWrapper(object) ? unwrap(object) : object;
+  }
+
+  /**
+   * Wraps object if it is not a wrapper.
+   * @param {Object} object
+   * @return {Object} The wrapper for object.
+   */
+  function wrapIfNeeded(object) {
+    return object && !isWrapper(object) ? wrap(object) : object;
+  }
+
+  /**
+   * Overrides the current wrapper (if any) for node.
+   * @param {Node} node
+   * @param {WrapperNode=} wrapper If left out the wrapper will be created as
+   *     needed next time someone wraps the node.
+   */
+  function rewrap(node, wrapper) {
+    if (wrapper === null)
+      return;
+    assert(isNative(node));
+    assert(wrapper === undefined || isWrapper(wrapper));
+    node.polymerWrapper_ = wrapper;
+  }
+
+  function defineGetter(constructor, name, getter) {
+    defineProperty(constructor.prototype, name, {
+      get: getter,
+      configurable: true,
+      enumerable: true
+    });
+  }
+
+  function defineWrapGetter(constructor, name) {
+    defineGetter(constructor, name, function() {
+      return wrap(this.impl[name]);
+    });
+  }
+
+  /**
+   * Forwards existing methods on the native object to the wrapper methods.
+   * This does not wrap any of the arguments or the return value since the
+   * wrapper implementation already takes care of that.
+   * @param {Array.<Function>} constructors
+   * @parem {Array.<string>} names
+   */
+  function forwardMethodsToWrapper(constructors, names) {
+    constructors.forEach(function(constructor) {
+      names.forEach(function(name) {
+        constructor.prototype[name] = function() {
+          var w = wrapIfNeeded(this);
+          return w[name].apply(w, arguments);
+        };
+      });
+    });
+  }
+
+  scope.assert = assert;
+  scope.constructorTable = constructorTable;
+  scope.defineGetter = defineGetter;
+  scope.defineWrapGetter = defineWrapGetter;
+  scope.forwardMethodsToWrapper = forwardMethodsToWrapper;
+  scope.isWrapper = isWrapper;
+  scope.isWrapperFor = isWrapperFor;
+  scope.mixin = mixin;
+  scope.nativePrototypeTable = nativePrototypeTable;
+  scope.oneOf = oneOf;
+  scope.registerObject = registerObject;
+  scope.registerWrapper = register;
+  scope.rewrap = rewrap;
+  scope.unwrap = unwrap;
+  scope.unwrapIfNeeded = unwrapIfNeeded;
+  scope.wrap = wrap;
+  scope.wrapIfNeeded = wrapIfNeeded;
+  scope.wrappers = wrappers;
+
+})(window.ShadowDOMPolyfill);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(context) {
+  'use strict';
+
+  var OriginalMutationObserver = window.MutationObserver;
+  var callbacks = [];
+  var pending = false;
+  var timerFunc;
+
+  function handle() {
+    pending = false;
+    var copies = callbacks.slice(0);
+    callbacks = [];
+    for (var i = 0; i < copies.length; i++) {
+      (0, copies[i])();
+    }
+  }
+
+  if (OriginalMutationObserver) {
+    var counter = 1;
+    var observer = new OriginalMutationObserver(handle);
+    var textNode = document.createTextNode(counter);
+    observer.observe(textNode, {characterData: true});
+
+    timerFunc = function() {
+      counter = (counter + 1) % 2;
+      textNode.data = counter;
+    };
+
+  } else {
+    timerFunc = window.setImmediate || window.setTimeout;
+  }
+
+  function setEndOfMicrotask(func) {
+    callbacks.push(func);
+    if (pending)
+      return;
+    pending = true;
+    timerFunc(handle, 0);
+  }
+
+  context.setEndOfMicrotask = setEndOfMicrotask;
+
+})(window.ShadowDOMPolyfill);
+
+/*
+ * Copyright 2013 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+  'use strict';
+
+  var setEndOfMicrotask = scope.setEndOfMicrotask
+  var wrapIfNeeded = scope.wrapIfNeeded
+  var wrappers = scope.wrappers;
+
+  var registrationsTable = new WeakMap();
+  var globalMutationObservers = [];
+  var isScheduled = false;
+
+  function scheduleCallback(observer) {
+    if (isScheduled)
+      return;
+    setEndOfMicrotask(notifyObservers);
+    isScheduled = true;
+  }
+
+  // http://dom.spec.whatwg.org/#mutation-observers
+  function notifyObservers() {
+    isScheduled = false;
+
+    do {
+      var notifyList = globalMutationObservers.slice();
+      var anyNonEmpty = false;
+      for (var i = 0; i < notifyList.length; i++) {
+        var mo = notifyList[i];
+        var queue = mo.takeRecords();
+        removeTransientObserversFor(mo);
+        if (queue.length) {
+          mo.callback_(queue, mo);
+          anyNonEmpty = true;
+        }
+      }
+    } while (anyNonEmpty);
+  }
+
+  /**
+   * @param {string} type
+   * @param {Node} target
+   * @constructor
+   */
+  function MutationRecord(type, target) {
+    this.type = type;
+    this.target = target;
+    this.addedNodes = new wrappers.NodeList();
+    this.removedNodes = new wrappers.NodeList();
+    this.previousSibling = null;
+    this.nextSibling = null;
+    this.attributeName = null;
+    this.attributeNamespace = null;
+    this.oldValue = null;
+  }
+
+  /**
+   * Registers transient observers to ancestor and its ancesors for the node
+   * which was removed.
+   * @param {!Node} ancestor
+   * @param {!Node} node
+   */
+  function registerTransientObservers(ancestor, node) {
+    for (; ancestor; ancestor = ancestor.parentNode) {
+      var registrations = registrationsTable.get(ancestor);
+      if (!registrations)
+        continue;
+      for (var i = 0; i < registrations.length; i++) {
+        var registration = registrations[i];
+        if (registration.options.subtree)
+          registration.addTransientObserver(node);
+      }
+    }
+  }
+
+  function removeTransientObserversFor(observer) {
+    for (var i = 0; i < observer.nodes_.length; i++) {
+      var node = observer.nodes_[i];
+      var registrations = registrationsTable.get(node);
+      if (!registrations)
+        return;
+      for (var j = 0; j < registrations.length; j++) {
+        var registration = registrations[j];
+        if (registration.observer === observer)
+          registration.removeTransientObservers();
+      }
+    }
+  }
+
+  // http://dom.spec.whatwg.org/#queue-a-mutation-record
+  function enqueueMutation(target, type, data) {
+    // 1.
+    var interestedObservers = Object.create(null);
+    var associatedStrings = Object.create(null);
+
+    // 2.
+    for (var node = target; node; node = node.parentNode) {
+      // 3.
+      var registrations = registrationsTable.get(node);
+      if (!registrations)
+        continue;
+      for (var j = 0; j < registrations.length; j++) {
+        var registration = registrations[j];
+        var options = registration.options;
+        // 1.
+        if (node !== target && !options.subtree)
+          continue;
+
+        // 2.
+        if (type === 'attributes' && !options.attributes)
+          continue;
+
+        // 3. If type is "attributes", options's attributeFilter is present, and
+        // either options's attributeFilter does not contain name or namespace
+        // is non-null, continue.
+        if (type === 'attributes' && options.attributeFilter &&
+            (data.namespace !== null ||
+             options.attributeFilter.indexOf(data.name) === -1)) {
+          continue;
+        }
+
+        // 4.
+        if (type === 'characterData' && !options.characterData)
+          continue;
+
+        // 5.
+        if (type === 'childList' && !options.childList)
+          continue;
+
+        // 6.
+        var observer = registration.observer;
+        interestedObservers[observer.uid_] = observer;
+
+        // 7. If either type is "attributes" and options's attributeOldValue is
+        // true, or type is "characterData" and options's characterDataOldValue
+        // is true, set the paired string of registered observer's observer in
+        // interested observers to oldValue.
+        if (type === 'attributes' && options.attributeOldValue ||
+            type === 'characterData' && options.characterDataOldValue) {
+          associatedStrings[observer.uid_] = data.oldValue;
+        }
+      }
+    }
+
+    var anyRecordsEnqueued = false;
+
+    // 4.
+    for (var uid in interestedObservers) {
+      var observer = interestedObservers[uid];
+      var record = new MutationRecord(type, target);
+
+      // 2.
+      if ('name' in data && 'namespace' in data) {
+        record.attributeName = data.name;
+        record.attributeNamespace = data.namespace;
+      }
+
+      // 3.
+      if (data.addedNodes)
+        record.addedNodes = data.addedNodes;
+
+      // 4.
+      if (data.removedNodes)
+        record.removedNodes = data.removedNodes;
+
+      // 5.
+      if (data.previousSibling)
+        record.previousSibling = data.previousSibling;
+
+      // 6.
+      if (data.nextSibling)
+        record.nextSibling = data.nextSibling;
+
+      // 7.
+      if (associatedStrings[uid] !== undefined)
+        record.oldValue = associatedStrings[uid];
+
+      // 8.
+      observer.records_.push(record);
+
+      anyRecordsEnqueued = true;
+    }
+
+    if (anyRecordsEnqueued)
+      scheduleCallback();
+  }
+
+  var slice = Array.prototype.slice;
+
+  /**
+   * @param {!Object} options
+   * @constructor
+   */
+  function MutationObserverOptions(options) {
+    this.childList = !!options.childList;
+    this.subtree = !!options.subtree;
+
+    // 1. If either options' attributeOldValue or attributeFilter is present
+    // and options' attributes is omitted, set options' attributes to true.
+    if (!('attributes' in options) &&
+        ('attributeOldValue' in options || 'attributeFilter' in options)) {
+      this.attributes = true;
+    } else {
+      this.attributes = !!options.attributes;
+    }
+
+    // 2. If options' characterDataOldValue is present and options'
+    // characterData is omitted, set options' characterData to true.
+    if ('characterDataOldValue' in options && !('characterData' in options))
+      this.characterData = true;
+    else
+      this.characterData = !!options.characterData;
+
+    // 3. & 4.
+    if (!this.attributes &&
+        (options.attributeOldValue || 'attributeFilter' in options) ||
+        // 5.
+        !this.characterData && options.characterDataOldValue) {
+      throw new TypeError();
+    }
+
+    this.characterData = !!options.characterData;
+    this.attributeOldValue = !!options.attributeOldValue;
+    this.characterDataOldValue = !!options.characterDataOldValue;
+    if ('attributeFilter' in options) {
+      if (options.attributeFilter == null ||
+          typeof options.attributeFilter !== 'object') {
+        throw new TypeError();
+      }
+      this.attributeFilter = slice.call(options.attributeFilter);
+    } else {
+      this.attributeFilter = null;
+    }
+  }
+
+  var uidCounter = 0;
+
+  /**
+   * The class that maps to the DOM MutationObserver interface.
+   * @param {Function} callback.
+   * @constructor
+   */
+  function MutationObserver(callback) {
+    this.callback_ = callback;
+    this.nodes_ = [];
+    this.records_ = [];
+    this.uid_ = ++uidCounter;
+
+    // This will leak. There is no way to implement this without WeakRefs :'(
+    globalMutationObservers.push(this);
+  }
+
+  MutationObserver.prototype = {
+    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe
+    observe: function(target, options) {
+      target = wrapIfNeeded(target);
+
+      var newOptions = new MutationObserverOptions(options);
+
+      // 6.
+      var registration;
+      var registrations = registrationsTable.get(target);
+      if (!registrations)
+        registrationsTable.set(target, registrations = []);
+
+      for (var i = 0; i < registrations.length; i++) {
+        if (registrations[i].observer === this) {
+          registration = registrations[i];
+          // 6.1.
+          registration.removeTransientObservers();
+          // 6.2.
+          registration.options = newOptions;
+        }
+      }
+
+      // 7.
+      if (!registration) {
+        registration = new Registration(this, target, newOptions);
+        registrations.push(registration);
+        this.nodes_.push(target);
+      }
+    },
+
+    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect
+    disconnect: function() {
+      this.nodes_.forEach(function(node) {
+        var registrations = registrationsTable.get(node);
+        for (var i = 0; i < registrations.length; i++) {
+          var registration = registrations[i];
+          if (registration.observer === this) {
+            registrations.splice(i, 1);
+            // Each node can only have one registered observer associated with
+            // this observer.
+            break;
+          }
+        }
+      }, this);
+      this.records_ = [];
+    },
+
+    takeRecords: function() {
+      var copyOfRecords = this.records_;
+      this.records_ = [];
+      return copyOfRecords;
+    }
+  };
+
+  /**
+   * Class used to represent a registered observer.
+   * @param {MutationObserver} observer
+   * @param {Node} target
+   * @param {MutationObserverOptions} options
+   * @constructor
+   */
+  function Registration(observer, target, options) {
+    this.observer = observer;
+    this.target = target;
+    this.options = options;
+    this.transientObservedNodes = [];
+  }
+
+  Registration.prototype = {
+    /**
+     * Adds a transient observer on node. The transient observer gets removed
+     * next time we deliver the change records.
+     * @param {Node} node
+     */
+    addTransientObserver: function(node) {
+      // Don't add transient observers on the target itself. We already have all
+      // the required listeners set up on the target.
+      if (node === this.target)
+        return;
+
+      this.transientObservedNodes.push(node);
+      var registrations = registrationsTable.get(node);
+      if (!registrations)
+        registrationsTable.set(node, registrations = []);
+
+      // We know that registrations does not contain this because we already
+      // checked if node === this.target.
+      registrations.push(this);
+    },
+
+    removeTransientObservers: function() {
+      var transientObservedNodes = this.transientObservedNodes;
+      this.transientObservedNodes = [];
+
+      for (var i = 0; i < transientObservedNodes.length; i++) {
+        var node = transientObservedNodes[i];
+        var registrations = registrationsTable.get(node);
+        for (var j = 0; j < registrations.length; j++) {
+          if (registrations[j] === this) {
+            registrations.splice(j, 1);
+            // Each node can only have one registered observer associated with
+            // this observer.
+            break;
+          }
+        }
+      }
+    }
+  };
+
+  scope.enqueueMutation = enqueueMutation;
+  scope.registerTransientObservers = registerTransientObservers;
+  scope.wrappers.MutationObserver = MutationObserver;
+  scope.wrappers.MutationRecord = MutationRecord;
+
+})(window.ShadowDOMPolyfill);
+
+/**
+ * Copyright 2014 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+  'use strict';
+
+  /**
+   * A tree scope represents the root of a tree. All nodes in a tree point to
+   * the same TreeScope object. The tree scope of a node get set the first time
+   * it is accessed or when a node is added or remove to a tree.
+   * @constructor
+   */
+  function TreeScope(root, parent) {
+    this.root = root;
+    this.parent = parent;
+  }
+
+  TreeScope.prototype = {
+    get renderer() {
+      if (this.root instanceof scope.wrappers.ShadowRoot) {
+        return scope.getRendererForHost(this.root.host);
+      }
+      return null;
+    },
+
+    contains: function(treeScope) {
+      for (; treeScope; treeScope = treeScope.parent) {
+        if (treeScope === this)
+          return true;
+      }
+      return false;
+    }
+  };
+
+  function setTreeScope(node, treeScope) {
+    if (node.treeScope_ !== treeScope) {
+      node.treeScope_ = treeScope;
+      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {
+        sr.treeScope_.parent = treeScope;
+      }
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        setTreeScope(child, treeScope);
+      }
+    }
+  }
+
+  function getTreeScope(node) {
+    if (node.treeScope_)
+      return node.treeScope_;
+    var parent = node.parentNode;
+    var treeScope;
+    if (parent)
+      treeScope = getTreeScope(parent);
+    else
+      treeScope = new TreeScope(node, null);
+    return node.treeScope_ = treeScope;
+  }
+
+  scope.TreeScope = TreeScope;
+  scope.getTreeScope = getTreeScope;
+  scope.setTreeScope = setTreeScope;
+
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
+  var getTreeScope = scope.getTreeScope;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
+  var wrap = scope.wrap;
+  var wrappers = scope.wrappers;
+
+  var wrappedFuns = new WeakMap();
+  var listenersTable = new WeakMap();
+  var handledEventsTable = new WeakMap();
+  var currentlyDispatchingEvents = new WeakMap();
+  var targetTable = new WeakMap();
+  var currentTargetTable = new WeakMap();
+  var relatedTargetTable = new WeakMap();
+  var eventPhaseTable = new WeakMap();
+  var stopPropagationTable = new WeakMap();
+  var stopImmediatePropagationTable = new WeakMap();
+  var eventHandlersTable = new WeakMap();
+  var eventPathTable = new WeakMap();
+
+  function isShadowRoot(node) {
+    return node instanceof wrappers.ShadowRoot;
+  }
+
+  function isInsertionPoint(node) {
+    var localName = node.localName;
+    return localName === 'content' || localName === 'shadow';
+  }
+
+  function isShadowHost(node) {
+    return !!node.shadowRoot;
+  }
+
+  function getEventParent(node) {
+    var dv;
+    return node.parentNode || (dv = node.defaultView) && wrap(dv) || null;
+  }
+
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-parent
+  function calculateParents(node, context, ancestors) {
+    if (ancestors.length)
+      return ancestors.shift();
+
+    // 1.
+    if (isShadowRoot(node))
+      return getInsertionParent(node) || node.host;
+
+    // 2.
+    var eventParents = scope.eventParentsTable.get(node);
+    if (eventParents) {
+      // Copy over the remaining event parents for next iteration.
+      for (var i = 1; i < eventParents.length; i++) {
+        ancestors[i - 1] = eventParents[i];
+      }
+      return eventParents[0];
+    }
+
+    // 3.
+    if (context && isInsertionPoint(node)) {
+      var parentNode = node.parentNode;
+      if (parentNode && isShadowHost(parentNode)) {
+        var trees = scope.getShadowTrees(parentNode);
+        var p = getInsertionParent(context);
+        for (var i = 0; i < trees.length; i++) {
+          if (trees[i].contains(p))
+            return p;
+        }
+      }
+    }
+
+    return getEventParent(node);
+  }
+
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#event-retargeting
+  function retarget(node) {
+    var stack = [];  // 1.
+    var ancestor = node;  // 2.
+    var targets = [];
+    var ancestors = [];
+    while (ancestor) {  // 3.
+      var context = null;  // 3.2.
+      // TODO(arv): Change order of these. If the stack is empty we always end
+      // up pushing ancestor, no matter what.
+      if (isInsertionPoint(ancestor)) {  // 3.1.
+        context = topMostNotInsertionPoint(stack);  // 3.1.1.
+        var top = stack[stack.length - 1] || ancestor;  // 3.1.2.
+        stack.push(top);
+      } else if (!stack.length) {
+        stack.push(ancestor);  // 3.3.
+      }
+      var target = stack[stack.length - 1];  // 3.4.
+      targets.push({target: target, currentTarget: ancestor});  // 3.5.
+      if (isShadowRoot(ancestor))  // 3.6.
+        stack.pop();  // 3.6.1.
+
+      ancestor = calculateParents(ancestor, context, ancestors);  // 3.7.
+    }
+    return targets;
+  }
+
+  function topMostNotInsertionPoint(stack) {
+    for (var i = stack.length - 1; i >= 0; i--) {
+      if (!isInsertionPoint(stack[i]))
+        return stack[i];
+    }
+    return null;
+  }
+
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-related-target
+  function adjustRelatedTarget(target, related) {
+    var ancestors = [];
+    while (target) {  // 3.
+      var stack = [];  // 3.1.
+      var ancestor = related;  // 3.2.
+      var last = undefined;  // 3.3. Needs to be reset every iteration.
+      while (ancestor) {
+        var context = null;
+        if (!stack.length) {
+          stack.push(ancestor);
+        } else {
+          if (isInsertionPoint(ancestor)) {  // 3.4.3.
+            context = topMostNotInsertionPoint(stack);
+            // isDistributed is more general than checking whether last is
+            // assigned into ancestor.
+            if (isDistributed(last)) {  // 3.4.3.2.
+              var head = stack[stack.length - 1];
+              stack.push(head);
+            }
+          }
+        }
+
+        if (inSameTree(ancestor, target))  // 3.4.4.
+          return stack[stack.length - 1];
+
+        if (isShadowRoot(ancestor))  // 3.4.5.
+          stack.pop();
+
+        last = ancestor;  // 3.4.6.
+        ancestor = calculateParents(ancestor, context, ancestors);  // 3.4.7.
+      }
+      if (isShadowRoot(target))  // 3.5.
+        target = target.host;
+      else
+        target = target.parentNode;  // 3.6.
+    }
+  }
+
+  function getInsertionParent(node) {
+    return scope.insertionParentTable.get(node);
+  }
+
+  function isDistributed(node) {
+    return getInsertionParent(node);
+  }
+
+  function inSameTree(a, b) {
+    return getTreeScope(a) === getTreeScope(b);
+  }
+
+  function dispatchOriginalEvent(originalEvent) {
+    // Make sure this event is only dispatched once.
+    if (handledEventsTable.get(originalEvent))
+      return;
+    handledEventsTable.set(originalEvent, true);
+    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));
+  }
+
+  function isLoadLikeEvent(event) {
+    switch (event.type) {
+      case 'beforeunload':
+      case 'load':
+      case 'unload':
+        return true;
+    }
+    return false;
+  }
+
+  function dispatchEvent(event, originalWrapperTarget) {
+    if (currentlyDispatchingEvents.get(event))
+      throw new Error('InvalidStateError')
+    currentlyDispatchingEvents.set(event, true);
+
+    // Render to ensure that the event path is correct.
+    scope.renderAllPending();
+    var eventPath = retarget(originalWrapperTarget);
+
+    // For window "load" events the "load" event is dispatched at the window but
+    // the target is set to the document.
+    //
+    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end
+    //
+    // TODO(arv): Find a less hacky way to do this.
+    if (eventPath.length === 2 &&
+        eventPath[0].target instanceof wrappers.Document &&
+        isLoadLikeEvent(event)) {
+      eventPath.shift();
+    }
+
+    eventPathTable.set(event, eventPath);
+
+    if (dispatchCapturing(event, eventPath)) {
+      if (dispatchAtTarget(event, eventPath)) {
+        dispatchBubbling(event, eventPath);
+      }
+    }
+
+    eventPhaseTable.set(event, Event.NONE);
+    currentTargetTable.delete(event, null);
+    currentlyDispatchingEvents.delete(event);
+
+    return event.defaultPrevented;
+  }
+
+  function dispatchCapturing(event, eventPath) {
+    var phase;
+
+    for (var i = eventPath.length - 1; i > 0; i--) {
+      var target = eventPath[i].target;
+      var currentTarget = eventPath[i].currentTarget;
+      if (target === currentTarget)
+        continue;
+
+      phase = Event.CAPTURING_PHASE;
+      if (!invoke(eventPath[i], event, phase))
+        return false;
+    }
+
+    return true;
+  }
+
+  function dispatchAtTarget(event, eventPath) {
+    var phase = Event.AT_TARGET;
+    return invoke(eventPath[0], event, phase);
+  }
+
+  function dispatchBubbling(event, eventPath) {
+    var bubbles = event.bubbles;
+    var phase;
+
+    for (var i = 1; i < eventPath.length; i++) {
+      var target = eventPath[i].target;
+      var currentTarget = eventPath[i].currentTarget;
+      if (target === currentTarget)
+        phase = Event.AT_TARGET;
+      else if (bubbles && !stopImmediatePropagationTable.get(event))
+        phase = Event.BUBBLING_PHASE;
+      else
+        continue;
+
+      if (!invoke(eventPath[i], event, phase))
+        return;
+    }
+  }
+
+  function invoke(tuple, event, phase) {
+    var target = tuple.target;
+    var currentTarget = tuple.currentTarget;
+
+    var listeners = listenersTable.get(currentTarget);
+    if (!listeners)
+      return true;
+
+    if ('relatedTarget' in event) {
+      var originalEvent = unwrap(event);
+      var unwrappedRelatedTarget = originalEvent.relatedTarget;
+
+      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no
+      // way to have relatedTarget return the adjusted target but worse is that
+      // the originalEvent might not have a relatedTarget so we hit an assert
+      // when we try to wrap it.
+      if (unwrappedRelatedTarget) {
+        // In IE we can get objects that are not EventTargets at this point.
+        // Safari does not have an EventTarget interface so revert to checking
+        // for addEventListener as an approximation.
+        if (unwrappedRelatedTarget instanceof Object &&
+            unwrappedRelatedTarget.addEventListener) {
+          var relatedTarget = wrap(unwrappedRelatedTarget);
+
+          var adjusted = adjustRelatedTarget(currentTarget, relatedTarget);
+          if (adjusted === target)
+            return true;
+        } else {
+          adjusted = null;
+        }
+        relatedTargetTable.set(event, adjusted);
+      }
+    }
+
+    eventPhaseTable.set(event, phase);
+    var type = event.type;
+
+    var anyRemoved = false;
+    targetTable.set(event, target);
+    currentTargetTable.set(event, currentTarget);
+
+    for (var i = 0; i < listeners.length; i++) {
+      var listener = listeners[i];
+      if (listener.removed) {
+        anyRemoved = true;
+        continue;
+      }
+
+      if (listener.type !== type ||
+          !listener.capture && phase === Event.CAPTURING_PHASE ||
+          listener.capture && phase === Event.BUBBLING_PHASE) {
+        continue;
+      }
+
+      try {
+        if (typeof listener.handler === 'function')
+          listener.handler.call(currentTarget, event);
+        else
+          listener.handler.handleEvent(event);
+
+        if (stopImmediatePropagationTable.get(event))
+          return false;
+
+      } catch (ex) {
+        if (window.onerror)
+          window.onerror(ex.message);
+        else
+          console.error(ex, ex.stack);
+      }
+    }
+
+    if (anyRemoved) {
+      var copy = listeners.slice();
+      listeners.length = 0;
+      for (var i = 0; i < copy.length; i++) {
+        if (!copy[i].removed)
+          listeners.push(copy[i]);
+      }
+    }
+
+    return !stopPropagationTable.get(event);
+  }
+
+  function Listener(type, handler, capture) {
+    this.type = type;
+    this.handler = handler;
+    this.capture = Boolean(capture);
+  }
+  Listener.prototype = {
+    equals: function(that) {
+      return this.handler === that.handler && this.type === that.type &&
+          this.capture === that.capture;
+    },
+    get removed() {
+      return this.handler === null;
+    },
+    remove: function() {
+      this.handler = null;
+    }
+  };
+
+  var OriginalEvent = window.Event;
+  OriginalEvent.prototype.polymerBlackList_ = {
+    returnValue: true,
+    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not
+    // support constructable KeyboardEvent so we keep it here for now.
+    keyLocation: true
+  };
+
+  /**
+   * Creates a new Event wrapper or wraps an existin native Event object.
+   * @param {string|Event} type
+   * @param {Object=} options
+   * @constructor
+   */
+  function Event(type, options) {
+    if (type instanceof OriginalEvent) {
+      var impl = type;
+      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')
+        return new BeforeUnloadEvent(impl);
+      this.impl = impl;
+    } else {
+      return wrap(constructEvent(OriginalEvent, 'Event', type, options));
+    }
+  }
+  Event.prototype = {
+    get target() {
+      return targetTable.get(this);
+    },
+    get currentTarget() {
+      return currentTargetTable.get(this);
+    },
+    get eventPhase() {
+      return eventPhaseTable.get(this);
+    },
+    get path() {
+      var nodeList = new wrappers.NodeList();
+      var eventPath = eventPathTable.get(this);
+      if (eventPath) {
+        var index = 0;
+        var lastIndex = eventPath.length - 1;
+        var baseRoot = getTreeScope(currentTargetTable.get(this));
+
+        for (var i = 0; i <= lastIndex; i++) {
+          var currentTarget = eventPath[i].currentTarget;
+          var currentRoot = getTreeScope(currentTarget);
+          if (currentRoot.contains(baseRoot) &&
+              // Make sure we do not add Window to the path.
+              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {
+            nodeList[index++] = currentTarget;
+          }
+        }
+        nodeList.length = index;
+      }
+      return nodeList;
+    },
+    stopPropagation: function() {
+      stopPropagationTable.set(this, true);
+    },
+    stopImmediatePropagation: function() {
+      stopPropagationTable.set(this, true);
+      stopImmediatePropagationTable.set(this, true);
+    }
+  };
+  registerWrapper(OriginalEvent, Event, document.createEvent('Event'));
+
+  function unwrapOptions(options) {
+    if (!options || !options.relatedTarget)
+      return options;
+    return Object.create(options, {
+      relatedTarget: {value: unwrap(options.relatedTarget)}
+    });
+  }
+
+  function registerGenericEvent(name, SuperEvent, prototype) {
+    var OriginalEvent = window[name];
+    var GenericEvent = function(type, options) {
+      if (type instanceof OriginalEvent)
+        this.impl = type;
+      else
+        return wrap(constructEvent(OriginalEvent, name, type, options));
+    };
+    GenericEvent.prototype = Object.create(SuperEvent.prototype);
+    if (prototype)
+      mixin(GenericEvent.prototype, prototype);
+    if (OriginalEvent) {
+      // - Old versions of Safari fails on new FocusEvent (and others?).
+      // - IE does not support event constructors.
+      // - createEvent('FocusEvent') throws in Firefox.
+      // => Try the best practice solution first and fallback to the old way
+      // if needed.
+      try {
+        registerWrapper(OriginalEvent, GenericEvent, new OriginalEvent('temp'));
+      } catch (ex) {
+        registerWrapper(OriginalEvent, GenericEvent,
+                        document.createEvent(name));
+      }
+    }
+    return GenericEvent;
+  }
+
+  var UIEvent = registerGenericEvent('UIEvent', Event);
+  var CustomEvent = registerGenericEvent('CustomEvent', Event);
+
+  var relatedTargetProto = {
+    get relatedTarget() {
+      var relatedTarget = relatedTargetTable.get(this);
+      // relatedTarget can be null.
+      if (relatedTarget !== undefined)
+        return relatedTarget;
+      return wrap(unwrap(this).relatedTarget);
+    }
+  };
+
+  function getInitFunction(name, relatedTargetIndex) {
+    return function() {
+      arguments[relatedTargetIndex] = unwrap(arguments[relatedTargetIndex]);
+      var impl = unwrap(this);
+      impl[name].apply(impl, arguments);
+    };
+  }
+
+  var mouseEventProto = mixin({
+    initMouseEvent: getInitFunction('initMouseEvent', 14)
+  }, relatedTargetProto);
+
+  var focusEventProto = mixin({
+    initFocusEvent: getInitFunction('initFocusEvent', 5)
+  }, relatedTargetProto);
+
+  var MouseEvent = registerGenericEvent('MouseEvent', UIEvent, mouseEventProto);
+  var FocusEvent = registerGenericEvent('FocusEvent', UIEvent, focusEventProto);
+
+  // In case the browser does not support event constructors we polyfill that
+  // by calling `createEvent('Foo')` and `initFooEvent` where the arguments to
+  // `initFooEvent` are derived from the registered default event init dict.
+  var defaultInitDicts = Object.create(null);
+
+  var supportsEventConstructors = (function() {
+    try {
+      new window.FocusEvent('focus');
+    } catch (ex) {
+      return false;
+    }
+    return true;
+  })();
+
+  /**
+   * Constructs a new native event.
+   */
+  function constructEvent(OriginalEvent, name, type, options) {
+    if (supportsEventConstructors)
+      return new OriginalEvent(type, unwrapOptions(options));
+
+    // Create the arguments from the default dictionary.
+    var event = unwrap(document.createEvent(name));
+    var defaultDict = defaultInitDicts[name];
+    var args = [type];
+    Object.keys(defaultDict).forEach(function(key) {
+      var v = options != null && key in options ?
+          options[key] : defaultDict[key];
+      if (key === 'relatedTarget')
+        v = unwrap(v);
+      args.push(v);
+    });
+    event['init' + name].apply(event, args);
+    return event;
+  }
+
+  if (!supportsEventConstructors) {
+    var configureEventConstructor = function(name, initDict, superName) {
+      if (superName) {
+        var superDict = defaultInitDicts[superName];
+        initDict = mixin(mixin({}, superDict), initDict);
+      }
+
+      defaultInitDicts[name] = initDict;
+    };
+
+    // The order of the default event init dictionary keys is important, the
+    // arguments to initFooEvent is derived from that.
+    configureEventConstructor('Event', {bubbles: false, cancelable: false});
+    configureEventConstructor('CustomEvent', {detail: null}, 'Event');
+    configureEventConstructor('UIEvent', {view: null, detail: 0}, 'Event');
+    configureEventConstructor('MouseEvent', {
+      screenX: 0,
+      screenY: 0,
+      clientX: 0,
+      clientY: 0,
+      ctrlKey: false,
+      altKey: false,
+      shiftKey: false,
+      metaKey: false,
+      button: 0,
+      relatedTarget: null
+    }, 'UIEvent');
+    configureEventConstructor('FocusEvent', {relatedTarget: null}, 'UIEvent');
+  }
+
+  // Safari 7 does not yet have BeforeUnloadEvent.
+  // https://bugs.webkit.org/show_bug.cgi?id=120849
+  var OriginalBeforeUnloadEvent = window.BeforeUnloadEvent;
+
+  function BeforeUnloadEvent(impl) {
+    Event.call(this, impl);
+  }
+  BeforeUnloadEvent.prototype = Object.create(Event.prototype);
+  mixin(BeforeUnloadEvent.prototype, {
+    get returnValue() {
+      return this.impl.returnValue;
+    },
+    set returnValue(v) {
+      this.impl.returnValue = v;
+    }
+  });
+
+  if (OriginalBeforeUnloadEvent)
+    registerWrapper(OriginalBeforeUnloadEvent, BeforeUnloadEvent);
+
+  function isValidListener(fun) {
+    if (typeof fun === 'function')
+      return true;
+    return fun && fun.handleEvent;
+  }
+
+  function isMutationEvent(type) {
+    switch (type) {
+      case 'DOMAttrModified':
+      case 'DOMAttributeNameChanged':
+      case 'DOMCharacterDataModified':
+      case 'DOMElementNameChanged':
+      case 'DOMNodeInserted':
+      case 'DOMNodeInsertedIntoDocument':
+      case 'DOMNodeRemoved':
+      case 'DOMNodeRemovedFromDocument':
+      case 'DOMSubtreeModified':
+        return true;
+    }
+    return false;
+  }
+
+  var OriginalEventTarget = window.EventTarget;
+
+  /**
+   * This represents a wrapper for an EventTarget.
+   * @param {!EventTarget} impl The original event target.
+   * @constructor
+   */
+  function EventTarget(impl) {
+    this.impl = impl;
+  }
+
+  // Node and Window have different internal type checks in WebKit so we cannot
+  // use the same method as the original function.
+  var methodNames = [
+    'addEventListener',
+    'removeEventListener',
+    'dispatchEvent'
+  ];
+
+  [Node, Window].forEach(function(constructor) {
+    var p = constructor.prototype;
+    methodNames.forEach(function(name) {
+      Object.defineProperty(p, name + '_', {value: p[name]});
+    });
+  });
+
+  function getTargetToListenAt(wrapper) {
+    if (wrapper instanceof wrappers.ShadowRoot)
+      wrapper = wrapper.host;
+    return unwrap(wrapper);
+  }
+
+  EventTarget.prototype = {
+    addEventListener: function(type, fun, capture) {
+      if (!isValidListener(fun) || isMutationEvent(type))
+        return;
+
+      var listener = new Listener(type, fun, capture);
+      var listeners = listenersTable.get(this);
+      if (!listeners) {
+        listeners = [];
+        listenersTable.set(this, listeners);
+      } else {
+        // Might have a duplicate.
+        for (var i = 0; i < listeners.length; i++) {
+          if (listener.equals(listeners[i]))
+            return;
+        }
+      }
+
+      listeners.push(listener);
+
+      var target = getTargetToListenAt(this);
+      target.addEventListener_(type, dispatchOriginalEvent, true);
+    },
+    removeEventListener: function(type, fun, capture) {
+      capture = Boolean(capture);
+      var listeners = listenersTable.get(this);
+      if (!listeners)
+        return;
+      var count = 0, found = false;
+      for (var i = 0; i < listeners.length; i++) {
+        if (listeners[i].type === type && listeners[i].capture === capture) {
+          count++;
+          if (listeners[i].handler === fun) {
+            found = true;
+            listeners[i].remove();
+          }
+        }
+      }
+
+      if (found && count === 1) {
+        var target = getTargetToListenAt(this);
+        target.removeEventListener_(type, dispatchOriginalEvent, true);
+      }
+    },
+    dispatchEvent: function(event) {
+      // We want to use the native dispatchEvent because it triggers the default
+      // actions (like checking a checkbox). However, if there are no listeners
+      // in the composed tree then there are no events that will trigger and
+      // listeners in the non composed tree that are part of the event path are
+      // not notified.
+      //
+      // If we find out that there are no listeners in the composed tree we add
+      // a temporary listener to the target which makes us get called back even
+      // in that case.
+
+      var nativeEvent = unwrap(event);
+      var eventType = nativeEvent.type;
+
+      // Allow dispatching the same event again. This is safe because if user
+      // code calls this during an existing dispatch of the same event the
+      // native dispatchEvent throws (that is required by the spec).
+      handledEventsTable.set(nativeEvent, false);
+
+      // Force rendering since we prefer native dispatch and that works on the
+      // composed tree.
+      scope.renderAllPending();
+
+      var tempListener;
+      if (!hasListenerInAncestors(this, eventType)) {
+        tempListener = function() {};
+        this.addEventListener(eventType, tempListener, true);
+      }
+
+      try {
+        return unwrap(this).dispatchEvent_(nativeEvent);
+      } finally {
+        if (tempListener)
+          this.removeEventListener(eventType, tempListener, true);
+      }
+    }
+  };
+
+  function hasListener(node, type) {
+    var listeners = listenersTable.get(node);
+    if (listeners) {
+      for (var i = 0; i < listeners.length; i++) {
+        if (!listeners[i].removed && listeners[i].type === type)
+          return true;
+      }
+    }
+    return false;
+  }
+
+  function hasListenerInAncestors(target, type) {
+    for (var node = unwrap(target); node; node = node.parentNode) {
+      if (hasListener(wrap(node), type))
+        return true;
+    }
+    return false;
+  }
+
+  if (OriginalEventTarget)
+    registerWrapper(OriginalEventTarget, EventTarget);
+
+  function wrapEventTargetMethods(constructors) {
+    forwardMethodsToWrapper(constructors, methodNames);
+  }
+
+  var originalElementFromPoint = document.elementFromPoint;
+
+  function elementFromPoint(self, document, x, y) {
+    scope.renderAllPending();
+
+    var element = wrap(originalElementFromPoint.call(document.impl, x, y));
+    var targets = retarget(element, this)
+    for (var i = 0; i < targets.length; i++) {
+      var target = targets[i];
+      if (target.currentTarget === self)
+        return target.target;
+    }
+    return null;
+  }
+
+  /**
+   * Returns a function that is to be used as a getter for `onfoo` properties.
+   * @param {string} name
+   * @return {Function}
+   */
+  function getEventHandlerGetter(name) {
+    return function() {
+      var inlineEventHandlers = eventHandlersTable.get(this);
+      return inlineEventHandlers && inlineEventHandlers[name] &&
+          inlineEventHandlers[name].value || null;
+     };
+  }
+
+  /**
+   * Returns a function that is to be used as a setter for `onfoo` properties.
+   * @param {string} name
+   * @return {Function}
+   */
+  function getEventHandlerSetter(name) {
+    var eventType = name.slice(2);
+    return function(value) {
+      var inlineEventHandlers = eventHandlersTable.get(this);
+      if (!inlineEventHandlers) {
+        inlineEventHandlers = Object.create(null);
+        eventHandlersTable.set(this, inlineEventHandlers);
+      }
+
+      var old = inlineEventHandlers[name];
+      if (old)
+        this.removeEventListener(eventType, old.wrapped, false);
+
+      if (typeof value === 'function') {
+        var wrapped = function(e) {
+          var rv = value.call(this, e);
+          if (rv === false)
+            e.preventDefault();
+          else if (name === 'onbeforeunload' && typeof rv === 'string')
+            e.returnValue = rv;
+          // mouseover uses true for preventDefault but preventDefault for
+          // mouseover is ignored by browsers these day.
+        };
+
+        this.addEventListener(eventType, wrapped, false);
+        inlineEventHandlers[name] = {
+          value: value,
+          wrapped: wrapped
+        };
+      }
+    };
+  }
+
+  scope.adjustRelatedTarget = adjustRelatedTarget;
+  scope.elementFromPoint = elementFromPoint;
+  scope.getEventHandlerGetter = getEventHandlerGetter;
+  scope.getEventHandlerSetter = getEventHandlerSetter;
+  scope.wrapEventTargetMethods = wrapEventTargetMethods;
+  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;
+  scope.wrappers.CustomEvent = CustomEvent;
+  scope.wrappers.Event = Event;
+  scope.wrappers.EventTarget = EventTarget;
+  scope.wrappers.FocusEvent = FocusEvent;
+  scope.wrappers.MouseEvent = MouseEvent;
+  scope.wrappers.UIEvent = UIEvent;
+
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2012 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var wrap = scope.wrap;
+
+  function nonEnum(obj, prop) {
+    Object.defineProperty(obj, prop, {enumerable: false});
+  }
+
+  function NodeList() {
+    this.length = 0;
+    nonEnum(this, 'length');
+  }
+  NodeList.prototype = {
+    item: function(index) {
+      return this[index];
+    }
+  };
+  nonEnum(NodeList.prototype, 'item');
+
+  function wrapNodeList(list) {
+    if (list == null)
+      return list;
+    var wrapperList = new NodeList();
+    for (var i = 0, length = list.length; i < length; i++) {
+      wrapperList[i] = wrap(list[i]);
+    }
+    wrapperList.length = length;
+    return wrapperList;
+  }
+
+  function addWrapNodeListMethod(wrapperConstructor, name) {
+    wrapperConstructor.prototype[name] = function() {
+      return wrapNodeList(this.impl[name].apply(this.impl, arguments));
+    };
+  }
+
+  scope.wrappers.NodeList = NodeList;
+  scope.addWrapNodeListMethod = addWrapNodeListMethod;
+  scope.wrapNodeList = wrapNodeList;
+
+})(window.ShadowDOMPolyfill);
+
+/*
+ * Copyright 2014 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+  'use strict';
+
+  // TODO(arv): Implement.
+
+  scope.wrapHTMLCollection = scope.wrapNodeList;
+  scope.wrappers.HTMLCollection = scope.wrappers.NodeList;
+
+})(window.ShadowDOMPolyfill);
+
+/**
+ * Copyright 2012 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+  'use strict';
+
+  var EventTarget = scope.wrappers.EventTarget;
+  var NodeList = scope.wrappers.NodeList;
+  var TreeScope = scope.TreeScope;
+  var assert = scope.assert;
+  var defineWrapGetter = scope.defineWrapGetter;
+  var enqueueMutation = scope.enqueueMutation;
+  var getTreeScope = scope.getTreeScope;
+  var isWrapper = scope.isWrapper;
+  var mixin = scope.mixin;
+  var registerTransientObservers = scope.registerTransientObservers;
+  var registerWrapper = scope.registerWrapper;
+  var setTreeScope = scope.setTreeScope;
+  var unwrap = scope.unwrap;
+  var unwrapIfNeeded = scope.unwrapIfNeeded;
+  var wrap = scope.wrap;
+  var wrapIfNeeded = scope.wrapIfNeeded;
+  var wrappers = scope.wrappers;
+
+  function assertIsNodeWrapper(node) {
+    assert(node instanceof Node);
+  }
+
+  function createOneElementNodeList(node) {
+    var nodes = new NodeList();
+    nodes[0] = node;
+    nodes.length = 1;
+    return nodes;
+  }
+
+  var surpressMutations = false;
+
+  /**
+   * Called before node is inserted into a node to enqueue its removal from its
+   * old parent.
+   * @param {!Node} node The node that is about to be removed.
+   * @param {!Node} parent The parent node that the node is being removed from.
+   * @param {!NodeList} nodes The collected nodes.
+   */
+  function enqueueRemovalForInsertedNodes(node, parent, nodes) {
+    enqueueMutation(parent, 'childList', {
+      removedNodes: nodes,
+      previousSibling: node.previousSibling,
+      nextSibling: node.nextSibling
+    });
+  }
+
+  function enqueueRemovalForInsertedDocumentFragment(df, nodes) {
+    enqueueMutation(df, 'childList', {
+      removedNodes: nodes
+    });
+  }
+
+  /**
+   * Collects nodes from a DocumentFragment or a Node for removal followed
+   * by an insertion.
+   *
+   * This updates the internal pointers for node, previousNode and nextNode.
+   */
+  function collectNodes(node, parentNode, previousNode, nextNode) {
+    if (node instanceof DocumentFragment) {
+      var nodes = collectNodesForDocumentFragment(node);
+
+      // The extra loop is to work around bugs with DocumentFragments in IE.
+      surpressMutations = true;
+      for (var i = nodes.length - 1; i >= 0; i--) {
+        node.removeChild(nodes[i]);
+        nodes[i].parentNode_ = parentNode;
+      }
+      surpressMutations = false;
+
+      for (var i = 0; i < nodes.length; i++) {
+        nodes[i].previousSibling_ = nodes[i - 1] || previousNode;
+        nodes[i].nextSibling_ = nodes[i + 1] || nextNode;
+      }
+
+      if (previousNode)
+        previousNode.nextSibling_ = nodes[0];
+      if (nextNode)
+        nextNode.previousSibling_ = nodes[nodes.length - 1];
+
+      return nodes;
+    }
+
+    var nodes = createOneElementNodeList(node);
+    var oldParent = node.parentNode;
+    if (oldParent) {
+      // This will enqueue the mutation record for the removal as needed.
+      oldParent.removeChild(node);
+    }
+
+    node.parentNode_ = parentNode;
+    node.previousSibling_ = previousNode;
+    node.nextSibling_ = nextNode;
+    if (previousNode)
+      previousNode.nextSibling_ = node;
+    if (nextNode)
+      nextNode.previousSibling_ = node;
+
+    return nodes;
+  }
+
+  function collectNodesNative(node) {
+    if (node instanceof DocumentFragment)
+      return collectNodesForDocumentFragment(node);
+
+    var nodes = createOneElementNodeList(node);
+    var oldParent = node.parentNode;
+    if (oldParent)
+      enqueueRemovalForInsertedNodes(node, oldParent, nodes);
+    return nodes;
+  }
+
+  function collectNodesForDocumentFragment(node) {
+    var nodes = new NodeList();
+    var i = 0;
+    for (var child = node.firstChild; child; child = child.nextSibling) {
+      nodes[i++] = child;
+    }
+    nodes.length = i;
+    enqueueRemovalForInsertedDocumentFragment(node, nodes);
+    return nodes;
+  }
+
+  function snapshotNodeList(nodeList) {
+    // NodeLists are not live at the moment so just return the same object.
+    return nodeList;
+  }
+
+  // http://dom.spec.whatwg.org/#node-is-inserted
+  function nodeWasAdded(node, treeScope) {
+    setTreeScope(node, treeScope);
+    node.nodeIsInserted_();
+  }
+
+  function nodesWereAdded(nodes, parent) {
+    var treeScope = getTreeScope(parent);
+    for (var i = 0; i < nodes.length; i++) {
+      nodeWasAdded(nodes[i], treeScope);
+    }
+  }
+
+  // http://dom.spec.whatwg.org/#node-is-removed
+  function nodeWasRemoved(node) {
+    setTreeScope(node, new TreeScope(node, null));
+  }
+
+  function nodesWereRemoved(nodes) {
+    for (var i = 0; i < nodes.length; i++) {
+      nodeWasRemoved(nodes[i]);
+    }
+  }
+
+  function ensureSameOwnerDocument(parent, child) {
+    var ownerDoc = parent.nodeType === Node.DOCUMENT_NODE ?
+        parent : parent.ownerDocument;
+    if (ownerDoc !== child.ownerDocument)
+      ownerDoc.adoptNode(child);
+  }
+
+  function adoptNodesIfNeeded(owner, nodes) {
+    if (!nodes.length)
+      return;
+
+    var ownerDoc = owner.ownerDocument;
+
+    // All nodes have the same ownerDocument when we get here.
+    if (ownerDoc === nodes[0].ownerDocument)
+      return;
+
+    for (var i = 0; i < nodes.length; i++) {
+      scope.adoptNodeNoRemove(nodes[i], ownerDoc);
+    }
+  }
+
+  function unwrapNodesForInsertion(owner, nodes) {
+    adoptNodesIfNeeded(owner, nodes);
+    var length = nodes.length;
+
+    if (length === 1)
+      return unwrap(nodes[0]);
+
+    var df = unwrap(owner.ownerDocument.createDocumentFragment());
+    for (var i = 0; i < length; i++) {
+      df.appendChild(unwrap(nodes[i]));
+    }
+    return df;
+  }
+
+  function clearChildNodes(wrapper) {
+    if (wrapper.firstChild_ !== undefined) {
+      var child = wrapper.firstChild_;
+      while (child) {
+        var tmp = child;
+        child = child.nextSibling_;
+        tmp.parentNode_ = tmp.previousSibling_ = tmp.nextSibling_ = undefined;
+      }
+    }
+    wrapper.firstChild_ = wrapper.lastChild_ = undefined;
+  }
+
+  function removeAllChildNodes(wrapper) {
+    if (wrapper.invalidateShadowRenderer()) {
+      var childWrapper = wrapper.firstChild;
+      while (childWrapper) {
+        assert(childWrapper.parentNode === wrapper);
+        var nextSibling = childWrapper.nextSibling;
+        var childNode = unwrap(childWrapper);
+        var parentNode = childNode.parentNode;
+        if (parentNode)
+          originalRemoveChild.call(parentNode, childNode);
+        childWrapper.previousSibling_ = childWrapper.nextSibling_ =
+            childWrapper.parentNode_ = null;
+        childWrapper = nextSibling;
+      }
+      wrapper.firstChild_ = wrapper.lastChild_ = null;
+    } else {
+      var node = unwrap(wrapper);
+      var child = node.firstChild;
+      var nextSibling;
+      while (child) {
+        nextSibling = child.nextSibling;
+        originalRemoveChild.call(node, child);
+        child = nextSibling;
+      }
+    }
+  }
+
+  function invalidateParent(node) {
+    var p = node.parentNode;
+    return p && p.invalidateShadowRenderer();
+  }
+
+  function cleanupNodes(nodes) {
+    for (var i = 0, n; i < nodes.length; i++) {
+      n = nodes[i];
+      n.parentNode.removeChild(n);
+    }
+  }
+
+  var originalImportNode = document.importNode;
+  var originalCloneNode = window.Node.prototype.cloneNode;
+
+  function cloneNode(node, deep, opt_doc) {
+    var clone;
+    if (opt_doc)
+      clone = wrap(originalImportNode.call(opt_doc, node.impl, false));
+    else
+      clone = wrap(originalCloneNode.call(node.impl, false));
+
+    if (deep) {
+      for (var child = node.firstChild; child; child = child.nextSibling) {
+        clone.appendChild(cloneNode(child, true, opt_doc));
+      }
+
+      if (node instanceof wrappers.HTMLTemplateElement) {
+        var cloneContent = clone.content;
+        for (var child = node.content.firstChild;
+             child;
+             child = child.nextSibling) {
+         cloneContent.appendChild(cloneNode(child, true, opt_doc));
+        }
+      }
+    }
+    // TODO(arv): Some HTML elements also clone other data like value.
+    return clone;
+  }
+
+  function contains(self, child) {
+    if (!child || getTreeScope(self) !== getTreeScope(child))
+      return false;
+
+    for (var node = child; node; node = node.parentNode) {
+      if (node === self)
+        return true;
+    }
+    return false;
+  }
+
+  var OriginalNode = window.Node;
+
+  /**
+   * This represents a wrapper of a native DOM node.
+   * @param {!Node} original The original DOM node, aka, the visual DOM node.
+   * @constructor
+   * @extends {EventTarget}
+   */
+  function Node(original) {
+    assert(original instanceof OriginalNode);
+
+    EventTarget.call(this, original);
+
+    // These properties are used to override the visual references with the
+    // logical ones. If the value is undefined it means that the logical is the
+    // same as the visual.
+
+    /**
+     * @type {Node|undefined}
+     * @private
+     */
+    this.parentNode_ = undefined;
+
+    /**
+     * @type {Node|undefined}
+     * @private
+     */
+    this.firstChild_ = undefined;
+
+    /**
+     * @type {Node|undefined}
+     * @private
+     */
+    this.lastChild_ = undefined;
+
+    /**
+     * @type {Node|undefined}
+     * @private
+     */
+    this.nextSibling_ = undefined;
+
+    /**
+     * @type {Node|undefined}
+     * @private
+     */
+    this.previousSibling_ = undefined;
+
+    this.treeScope_ = undefined;
+  }
+
+  var OriginalDocumentFragment = window.DocumentFragment;
+  var originalAppendChild = OriginalNode.prototype.appendChild;
+  var originalCompareDocumentPosition =
+      OriginalNode.prototype.compareDocumentPosition;
+  var originalInsertBefore = OriginalNode.prototype.insertBefore;
+  var originalRemoveChild = OriginalNode.prototype.removeChild;
+  var originalReplaceChild = OriginalNode.prototype.replaceChild;
+
+  var isIe = /Trident/.test(navigator.userAgent);
+
+  var removeChildOriginalHelper = isIe ?
+      function(parent, child) {
+        try {
+          originalRemoveChild.call(parent, child);
+        } catch (ex) {
+          if (!(parent instanceof OriginalDocumentFragment))
+            throw ex;
+        }
+      } :
+      function(parent, child) {
+        originalRemoveChild.call(parent, child);
+      };
+
+  Node.prototype = Object.create(EventTarget.prototype);
+  mixin(Node.prototype, {
+    appendChild: function(childWrapper) {
+      return this.insertBefore(childWrapper, null);
+    },
+
+    insertBefore: function(childWrapper, refWrapper) {
+      assertIsNodeWrapper(childWrapper);
+
+      var refNode;
+      if (refWrapper) {
+        if (isWrapper(refWrapper)) {
+          refNode = unwrap(refWrapper);
+        } else {
+          refNode = refWrapper;
+          refWrapper = wrap(refNode);
+        }
+      } else {
+        refWrapper = null;
+        refNode = null;
+      }
+
+      refWrapper && assert(refWrapper.parentNode === this);
+
+      var nodes;
+      var previousNode =
+          refWrapper ? refWrapper.previousSibling : this.lastChild;
+
+      var useNative = !this.invalidateShadowRenderer() &&
+                      !invalidateParent(childWrapper);
+
+      if (useNative)
+        nodes = collectNodesNative(childWrapper);
+      else
+        nodes = collectNodes(childWrapper, this, previousNode, refWrapper);
+
+      if (useNative) {
+        ensureSameOwnerDocument(this, childWrapper);
+        clearChildNodes(this);
+        originalInsertBefore.call(this.impl, unwrap(childWrapper), refNode);
+      } else {
+        if (!previousNode)
+          this.firstChild_ = nodes[0];
+        if (!refWrapper)
+          this.lastChild_ = nodes[nodes.length - 1];
+
+        var parentNode = refNode ? refNode.parentNode : this.impl;
+
+        // insertBefore refWrapper no matter what the parent is?
+        if (parentNode) {
+          originalInsertBefore.call(parentNode,
+              unwrapNodesForInsertion(this, nodes), refNode);
+        } else {
+          adoptNodesIfNeeded(this, nodes);
+        }
+      }
+
+      enqueueMutation(this, 'childList', {
+        addedNodes: nodes,
+        nextSibling: refWrapper,
+        previousSibling: previousNode
+      });
+
+      nodesWereAdded(nodes, this);
+
+      return childWrapper;
+    },
+
+    removeChild: function(childWrapper) {
+      assertIsNodeWrapper(childWrapper);
+      if (childWrapper.parentNode !== this) {
+        // IE has invalid DOM trees at times.
+        var found = false;
+        var childNodes = this.childNodes;
+        for (var ieChild = this.firstChild; ieChild;
+             ieChild = ieChild.nextSibling) {
+          if (ieChild === childWrapper) {
+            found = true;
+            break;
+          }
+        }
+        if (!found) {
+          // TODO(arv): DOMException
+          throw new Error('NotFoundError');
+        }
+      }
+
+      var childNode = unwrap(childWrapper);
+      var childWrapperNextSibling = childWrapper.nextSibling;
+      var childWrapperPreviousSibling = childWrapper.previousSibling;
+
+      if (this.invalidateShadowRenderer()) {
+        // We need to remove the real node from the DOM before updating the
+        // pointers. This is so that that mutation event is dispatched before
+        // the pointers have changed.
+        var thisFirstChild = this.firstChild;
+        var thisLastChild = this.lastChild;
+
+        var parentNode = childNode.parentNode;
+        if (parentNode)
+          removeChildOriginalHelper(parentNode, childNode);
+
+        if (thisFirstChild === childWrapper)
+          this.firstChild_ = childWrapperNextSibling;
+        if (thisLastChild === childWrapper)
+          this.lastChild_ = childWrapperPreviousSibling;
+        if (childWrapperPreviousSibling)
+          childWrapperPreviousSibling.nextSibling_ = childWrapperNextSibling;
+        if (childWrapperNextSibling) {
+          childWrapperNextSibling.previousSibling_ =
+              childWrapperPreviousSibling;
+        }
+
+        childWrapper.previousSibling_ = childWrapper.nextSibling_ =
+            childWrapper.parentNode_ = undefined;
+      } else {
+        clearChildNodes(this);
+        removeChildOriginalHelper(this.impl, childNode);
+      }
+
+      if (!surpressMutations) {
+        enqueueMutation(this, 'childList', {
+          removedNodes: createOneElementNodeList(childWrapper),
+          nextSibling: childWrapperNextSibling,
+          previousSibling: childWrapperPreviousSibling
+        });
+      }
+
+      registerTransientObservers(this, childWrapper);
+
+      return childWrapper;
+    },
+
+    replaceChild: function(newChildWrapper, oldChildWrapper) {
+      assertIsNodeWrapper(newChildWrapper);
+
+      var oldChildNode;
+      if (isWrapper(oldChildWrapper)) {
+        oldChildNode = unwrap(oldChildWrapper);
+      } else {
+        oldChildNode = oldChildWrapper;
+        oldChildWrapper = wrap(oldChildNode);
+      }
+
+      if (oldChildWrapper.parentNode !== this) {
+        // TODO(arv): DOMException
+        throw new Error('NotFoundError');
+      }
+
+      var nextNode = oldChildWrapper.nextSibling;
+      var previousNode = oldChildWrapper.previousSibling;
+      var nodes;
+
+      var useNative = !this.invalidateShadowRenderer() &&
+                      !invalidateParent(newChildWrapper);
+
+      if (useNative) {
+        nodes = collectNodesNative(newChildWrapper);
+      } else {
+        if (nextNode === newChildWrapper)
+          nextNode = newChildWrapper.nextSibling;
+        nodes = collectNodes(newChildWrapper, this, previousNode, nextNode);
+      }
+
+      if (!useNative) {
+        if (this.firstChild === oldChildWrapper)
+          this.firstChild_ = nodes[0];
+        if (this.lastChild === oldChildWrapper)
+          this.lastChild_ = nodes[nodes.length - 1];
+
+        oldChildWrapper.previousSibling_ = oldChildWrapper.nextSibling_ =
+            oldChildWrapper.parentNode_ = undefined;
+
+        // replaceChild no matter what the parent is?
+        if (oldChildNode.parentNode) {
+          originalReplaceChild.call(
+              oldChildNode.parentNode,
+              unwrapNodesForInsertion(this, nodes),
+              oldChildNode);
+        }
+      } else {
+        ensureSameOwnerDocument(this, newChildWrapper);
+        clearChildNodes(this);
+        originalReplaceChild.call(this.impl, unwrap(newChildWrapper),
+                                  oldChildNode);
+      }
+
+      enqueueMutation(this, 'childList', {
+        addedNodes: nodes,
+        removedNodes: createOneElementNodeList(oldChildWrapper),
+        nextSibling: nextNode,
+        previousSibling: previousNode
+      });
+
+      nodeWasRemoved(oldChildWrapper);
+      nodesWereAdded(nodes, this);
+
+      return oldChildWrapper;
+    },
+
+    /**
+     * Called after a node was inserted. Subclasses override this to invalidate
+     * the renderer as needed.
+     * @private
+     */
+    nodeIsInserted_: function() {
+      for (var child = this.firstChild; child; child = child.nextSibling) {
+        child.nodeIsInserted_();
+      }
+    },
+
+    hasChildNodes: function() {
+      return this.firstChild !== null;
+    },
+
+    /** @type {Node} */
+    get parentNode() {
+      // If the parentNode has not been overridden, use the original parentNode.
+      return this.parentNode_ !== undefined ?
+          this.parentNode_ : wrap(this.impl.parentNode);
+    },
+
+    /** @type {Node} */
+    get firstChild() {
+      return this.firstChild_ !== undefined ?
+          this.firstChild_ : wrap(this.impl.firstChild);
+    },
+
+    /** @type {Node} */
+    get lastChild() {
+      return this.lastChild_ !== undefined ?
+          this.lastChild_ : wrap(this.impl.lastChild);
+    },
+
+    /** @type {Node} */
+    get nextSibling() {
+      return this.nextSibling_ !== undefined ?
+          this.nextSibling_ : wrap(this.impl.nextSibling);
+    },
+
+    /** @type {Node} */
+    get previousSibling() {
+      return this.previousSibling_ !== undefined ?
+          this.previousSibling_ : wrap(this.impl.previousSibling);
+    },
+
+    get parentElement() {
+      var p = this.parentNode;
+      while (p && p.nodeType !== Node.ELEMENT_NODE) {
+        p = p.parentNode;
+      }
+      return p;
+    },
+
+    get textContent() {
+      // TODO(arv): This should fallback to this.impl.textContent if there
+      // are no shadow trees below or above the context node.
+      var s = '';
+      for (var child = this.firstChild; child; child = child.nextSibling) {
+        if (child.nodeType != Node.COMMENT_NODE) {
+          s += child.textContent;
+        }
+      }
+      return s;
+    },
+    set textContent(textContent) {
+      var removedNodes = snapshotNodeList(this.childNodes);
+
+      if (this.invalidateShadowRenderer()) {
+        removeAllChildNodes(this);
+        if (textContent !== '') {
+          var textNode = this.impl.ownerDocument.createTextNode(textContent);
+          this.appendChild(textNode);
+        }
+      } else {
+        clearChildNodes(this);
+        this.impl.textContent = textContent;
+      }
+
+      var addedNodes = snapshotNodeList(this.childNodes);
+
+      enqueueMutation(this, 'childList', {
+        addedNodes: addedNodes,
+        removedNodes: removedNodes
+      });
+
+      nodesWereRemoved(removedNodes);
+      nodesWereAdded(addedNodes, this);
+    },
+
+    get childNodes() {
+      var wrapperList = new NodeList();
+      var i = 0;
+      for (var child = this.firstChild; child; child = child.nextSibling) {
+        wrapperList[i++] = child;
+      }
+      wrapperList.length = i;
+      return wrapperList;
+    },
+
+    cloneNode: function(deep) {
+      return cloneNode(this, deep);
+    },
+
+    contains: function(child) {
+      return contains(this, wrapIfNeeded(child));
+    },
+
+    compareDocumentPosition: function(otherNode) {
+      // This only wraps, it therefore only operates on the composed DOM and not
+      // the logical DOM.
+      return originalCompareDocumentPosition.call(this.impl,
+                                                  unwrapIfNeeded(otherNode));
+    },
+
+    normalize: function() {
+      var nodes = snapshotNodeList(this.childNodes);
+      var remNodes = [];
+      var s = '';
+      var modNode;
+
+      for (var i = 0, n; i < nodes.length; i++) {
+        n = nodes[i];
+        if (n.nodeType === Node.TEXT_NODE) {
+          if (!modNode && !n.data.length)
+            this.removeNode(n);
+          else if (!modNode)
+            modNode = n;
+          else {
+            s += n.data;
+            remNodes.push(n);
+          }
+        } else {
+          if (modNode && remNodes.length) {
+            modNode.data += s;
+            cleanUpNodes(remNodes);
+          }
+          remNodes = [];
+          s = '';
+          modNode = null;
+          if (n.childNodes.length)
+            n.normalize();
+        }
+      }
+
+      // handle case where >1 text nodes are the last children
+      if (modNode && remNodes.length) {
+        modNode.data += s;
+        cleanupNodes(remNodes);
+      }
+    }
+  });
+
+  defineWrapGetter(Node, 'ownerDocument');
+
+  // We use a DocumentFragment as a base and then delete the properties of
+  // DocumentFragment.prototype from the wrapper Node. Since delete makes
+  // objects slow in some JS engines we recreate the prototype object.
+  registerWrapper(OriginalNode, Node, document.createDocumentFragment());
+  delete Node.prototype.querySelector;
+  delete Node.prototype.querySelectorAll;
+  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);
+
+  scope.cloneNode = cloneNode;
+  scope.nodeWasAdded = nodeWasAdded;
+  scope.nodeWasRemoved = nodeWasRemoved;
+  scope.nodesWereAdded = nodesWereAdded;
+  scope.nodesWereRemoved = nodesWereRemoved;
+  scope.snapshotNodeList = snapshotNodeList;
+  scope.wrappers.Node = Node;
+
+})(window.ShadowDOMPolyfill);
+
+// 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) {
+  'use strict';
+
+  function findOne(node, selector) {
+    var m, el = node.firstElementChild;
+    while (el) {
+      if (el.matches(selector))
+        return el;
+      m = findOne(el, selector);
+      if (m)
+        return m;
+      el = el.nextElementSibling;
+    }
+    return null;
+  }
+
+  function findAll(node, selector, results) {
+    var el = node.firstElementChild;
+    while (el) {
+      if (el.matches(selector))
+        results[results.length++] = el;
+      findAll(el, selector, results);
+      el = el.nextElementSibling;
+    }
+    return results;
+  }
+
+  // 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
+
+  var SelectorsInterface = {
+    querySelector: function(selector) {
+      return findOne(this, selector);
+    },
+    querySelectorAll: function(selector) {
+      return findAll(this, selector, new NodeList())
+    }
+  };
+
+  var GetElementsByInterface = {
+    getElementsByTagName: function(tagName) {
+      // TODO(arv): Check tagName?
+      return this.querySelectorAll(tagName);
+    },
+    getElementsByClassName: function(className) {
+      // TODO(arv): Check className?
+      return this.querySelectorAll('.' + className);
+    },
+    getElementsByTagNameNS: function(ns, tagName) {
+      if (ns === '*')
+        return this.getElementsByTagName(tagName);
+
+      // TODO(arv): Check tagName?
+      var result = new NodeList;
+      var els = this.getElementsByTagName(tagName);
+      for (var i = 0, j = 0; i < els.length; i++) {
+        if (els[i].namespaceURI === ns)
+          result[j++] = els[i];
+      }
+      result.length = j;
+      return result;
+    }
+  };
+
+  scope.GetElementsByInterface = GetElementsByInterface;
+  scope.SelectorsInterface = SelectorsInterface;
+
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var NodeList = scope.wrappers.NodeList;
+
+  function forwardElement(node) {
+    while (node && node.nodeType !== Node.ELEMENT_NODE) {
+      node = node.nextSibling;
+    }
+    return node;
+  }
+
+  function backwardsElement(node) {
+    while (node && node.nodeType !== Node.ELEMENT_NODE) {
+      node = node.previousSibling;
+    }
+    return node;
+  }
+
+  var ParentNodeInterface = {
+    get firstElementChild() {
+      return forwardElement(this.firstChild);
+    },
+
+    get lastElementChild() {
+      return backwardsElement(this.lastChild);
+    },
+
+    get childElementCount() {
+      var count = 0;
+      for (var child = this.firstElementChild;
+           child;
+           child = child.nextElementSibling) {
+        count++;
+      }
+      return count;
+    },
+
+    get children() {
+      var wrapperList = new NodeList();
+      var i = 0;
+      for (var child = this.firstElementChild;
+           child;
+           child = child.nextElementSibling) {
+        wrapperList[i++] = child;
+      }
+      wrapperList.length = i;
+      return wrapperList;
+    },
+
+    remove: function() {
+      var p = this.parentNode;
+      if (p)
+        p.removeChild(this);
+    }
+  };
+
+  var ChildNodeInterface = {
+    get nextElementSibling() {
+      return forwardElement(this.nextSibling);
+    },
+
+    get previousElementSibling() {
+      return backwardsElement(this.previousSibling);
+    }
+  };
+
+  scope.ChildNodeInterface = ChildNodeInterface;
+  scope.ParentNodeInterface = ParentNodeInterface;
+
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var ChildNodeInterface = scope.ChildNodeInterface;
+  var Node = scope.wrappers.Node;
+  var enqueueMutation = scope.enqueueMutation;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+
+  var OriginalCharacterData = window.CharacterData;
+
+  function CharacterData(node) {
+    Node.call(this, node);
+  }
+  CharacterData.prototype = Object.create(Node.prototype);
+  mixin(CharacterData.prototype, {
+    get textContent() {
+      return this.data;
+    },
+    set textContent(value) {
+      this.data = value;
+    },
+    get data() {
+      return this.impl.data;
+    },
+    set data(value) {
+      var oldValue = this.impl.data;
+      enqueueMutation(this, 'characterData', {
+        oldValue: oldValue
+      });
+      this.impl.data = value;
+    }
+  });
+
+  mixin(CharacterData.prototype, ChildNodeInterface);
+
+  registerWrapper(OriginalCharacterData, CharacterData,
+                  document.createTextNode(''));
+
+  scope.wrappers.CharacterData = CharacterData;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2014 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var CharacterData = scope.wrappers.CharacterData;
+  var enqueueMutation = scope.enqueueMutation;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+
+  function toUInt32(x) {
+    return x >>> 0;
+  }
+
+  var OriginalText = window.Text;
+
+  function Text(node) {
+    CharacterData.call(this, node);
+  }
+  Text.prototype = Object.create(CharacterData.prototype);
+  mixin(Text.prototype, {
+    splitText: function(offset) {
+      offset = toUInt32(offset);
+      var s = this.data;
+      if (offset > s.length)
+        throw new Error('IndexSizeError');
+      var head = s.slice(0, offset);
+      var tail = s.slice(offset);
+      this.data = head;
+      var newTextNode = this.ownerDocument.createTextNode(tail);
+      if (this.parentNode)
+        this.parentNode.insertBefore(newTextNode, this.nextSibling);
+      return newTextNode;
+    }
+  });
+
+  registerWrapper(OriginalText, Text, document.createTextNode(''));
+
+  scope.wrappers.Text = Text;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var ChildNodeInterface = scope.ChildNodeInterface;
+  var GetElementsByInterface = scope.GetElementsByInterface;
+  var Node = scope.wrappers.Node;
+  var ParentNodeInterface = scope.ParentNodeInterface;
+  var SelectorsInterface = scope.SelectorsInterface;
+  var addWrapNodeListMethod = scope.addWrapNodeListMethod;
+  var enqueueMutation = scope.enqueueMutation;
+  var mixin = scope.mixin;
+  var oneOf = scope.oneOf;
+  var registerWrapper = scope.registerWrapper;
+  var wrappers = scope.wrappers;
+
+  var OriginalElement = window.Element;
+
+  var matchesNames = [
+    'matches',  // needs to come first.
+    'mozMatchesSelector',
+    'msMatchesSelector',
+    'webkitMatchesSelector',
+  ].filter(function(name) {
+    return OriginalElement.prototype[name];
+  });
+
+  var matchesName = matchesNames[0];
+
+  var originalMatches = OriginalElement.prototype[matchesName];
+
+  function invalidateRendererBasedOnAttribute(element, name) {
+    // Only invalidate if parent node is a shadow host.
+    var p = element.parentNode;
+    if (!p || !p.shadowRoot)
+      return;
+
+    var renderer = scope.getRendererForHost(p);
+    if (renderer.dependsOnAttribute(name))
+      renderer.invalidate();
+  }
+
+  function enqueAttributeChange(element, name, oldValue) {
+    // This is not fully spec compliant. We should use localName (which might
+    // have a different case than name) and the namespace (which requires us
+    // to get the Attr object).
+    enqueueMutation(element, 'attributes', {
+      name: name,
+      namespace: null,
+      oldValue: oldValue
+    });
+  }
+
+  function Element(node) {
+    Node.call(this, node);
+  }
+  Element.prototype = Object.create(Node.prototype);
+  mixin(Element.prototype, {
+    createShadowRoot: function() {
+      var newShadowRoot = new wrappers.ShadowRoot(this);
+      this.impl.polymerShadowRoot_ = newShadowRoot;
+
+      var renderer = scope.getRendererForHost(this);
+      renderer.invalidate();
+
+      return newShadowRoot;
+    },
+
+    get shadowRoot() {
+      return this.impl.polymerShadowRoot_ || null;
+    },
+
+    setAttribute: function(name, value) {
+      var oldValue = this.impl.getAttribute(name);
+      this.impl.setAttribute(name, value);
+      enqueAttributeChange(this, name, oldValue);
+      invalidateRendererBasedOnAttribute(this, name);
+    },
+
+    removeAttribute: function(name) {
+      var oldValue = this.impl.getAttribute(name);
+      this.impl.removeAttribute(name);
+      enqueAttributeChange(this, name, oldValue);
+      invalidateRendererBasedOnAttribute(this, name);
+    },
+
+    matches: function(selector) {
+      return originalMatches.call(this.impl, selector);
+    }
+  });
+
+  matchesNames.forEach(function(name) {
+    if (name !== 'matches') {
+      Element.prototype[name] = function(selector) {
+        return this.matches(selector);
+      };
+    }
+  });
+
+  if (OriginalElement.prototype.webkitCreateShadowRoot) {
+    Element.prototype.webkitCreateShadowRoot =
+        Element.prototype.createShadowRoot;
+  }
+
+  /**
+   * Useful for generating the accessor pair for a property that reflects an
+   * attribute.
+   */
+  function setterDirtiesAttribute(prototype, propertyName, opt_attrName) {
+    var attrName = opt_attrName || propertyName;
+    Object.defineProperty(prototype, propertyName, {
+      get: function() {
+        return this.impl[propertyName];
+      },
+      set: function(v) {
+        this.impl[propertyName] = v;
+        invalidateRendererBasedOnAttribute(this, attrName);
+      },
+      configurable: true,
+      enumerable: true
+    });
+  }
+
+  setterDirtiesAttribute(Element.prototype, 'id');
+  setterDirtiesAttribute(Element.prototype, 'className', 'class');
+
+  mixin(Element.prototype, ChildNodeInterface);
+  mixin(Element.prototype, GetElementsByInterface);
+  mixin(Element.prototype, ParentNodeInterface);
+  mixin(Element.prototype, SelectorsInterface);
+
+  registerWrapper(OriginalElement, Element,
+                  document.createElementNS(null, 'x'));
+
+  // TODO(arv): Export setterDirtiesAttribute and apply it to more bindings
+  // that reflect attributes.
+  scope.matchesNames = matchesNames;
+  scope.wrappers.Element = Element;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var Element = scope.wrappers.Element;
+  var defineGetter = scope.defineGetter;
+  var enqueueMutation = scope.enqueueMutation;
+  var mixin = scope.mixin;
+  var nodesWereAdded = scope.nodesWereAdded;
+  var nodesWereRemoved = scope.nodesWereRemoved;
+  var registerWrapper = scope.registerWrapper;
+  var snapshotNodeList = scope.snapshotNodeList;
+  var unwrap = scope.unwrap;
+  var wrap = scope.wrap;
+  var wrappers = scope.wrappers;
+
+  /////////////////////////////////////////////////////////////////////////////
+  // innerHTML and outerHTML
+
+  // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#escapingString
+  var escapeAttrRegExp = /[&\u00A0"]/g;
+  var escapeDataRegExp = /[&\u00A0<>]/g;
+
+  function escapeReplace(c) {
+    switch (c) {
+      case '&':
+        return '&amp;';
+      case '<':
+        return '&lt;';
+      case '>':
+        return '&gt;';
+      case '"':
+        return '&quot;'
+      case '\u00A0':
+        return '&nbsp;';
+    }
+  }
+
+  function escapeAttr(s) {
+    return s.replace(escapeAttrRegExp, escapeReplace);
+  }
+
+  function escapeData(s) {
+    return s.replace(escapeDataRegExp, escapeReplace);
+  }
+
+  function makeSet(arr) {
+    var set = {};
+    for (var i = 0; i < arr.length; i++) {
+      set[arr[i]] = true;
+    }
+    return set;
+  }
+
+  // http://www.whatwg.org/specs/web-apps/current-work/#void-elements
+  var voidElements = makeSet([
+    'area',
+    'base',
+    'br',
+    'col',
+    'command',
+    'embed',
+    'hr',
+    'img',
+    'input',
+    'keygen',
+    'link',
+    'meta',
+    'param',
+    'source',
+    'track',
+    'wbr'
+  ]);
+
+  var plaintextParents = makeSet([
+    'style',
+    'script',
+    'xmp',
+    'iframe',
+    'noembed',
+    'noframes',
+    'plaintext',
+    'noscript'
+  ]);
+
+  function getOuterHTML(node, parentNode) {
+    switch (node.nodeType) {
+      case Node.ELEMENT_NODE:
+        var tagName = node.tagName.toLowerCase();
+        var s = '<' + tagName;
+        var attrs = node.attributes;
+        for (var i = 0, attr; attr = attrs[i]; i++) {
+          s += ' ' + attr.name + '="' + escapeAttr(attr.value) + '"';
+        }
+        s += '>';
+        if (voidElements[tagName])
+          return s;
+
+        return s + getInnerHTML(node) + '</' + tagName + '>';
+
+      case Node.TEXT_NODE:
+        var data = node.data;
+        if (parentNode && plaintextParents[parentNode.localName])
+          return data;
+        return escapeData(data);
+
+      case Node.COMMENT_NODE:
+        return '<!--' + node.data + '-->';
+
+      default:
+        console.error(node);
+        throw new Error('not implemented');
+    }
+  }
+
+  function getInnerHTML(node) {
+    if (node instanceof wrappers.HTMLTemplateElement)
+      node = node.content;
+
+    var s = '';
+    for (var child = node.firstChild; child; child = child.nextSibling) {
+      s += getOuterHTML(child, node);
+    }
+    return s;
+  }
+
+  function setInnerHTML(node, value, opt_tagName) {
+    var tagName = opt_tagName || 'div';
+    node.textContent = '';
+    var tempElement = unwrap(node.ownerDocument.createElement(tagName));
+    tempElement.innerHTML = value;
+    var firstChild;
+    while (firstChild = tempElement.firstChild) {
+      node.appendChild(wrap(firstChild));
+    }
+  }
+
+  // IE11 does not have MSIE in the user agent string.
+  var oldIe = /MSIE/.test(navigator.userAgent);
+
+  var OriginalHTMLElement = window.HTMLElement;
+  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;
+
+  function HTMLElement(node) {
+    Element.call(this, node);
+  }
+  HTMLElement.prototype = Object.create(Element.prototype);
+  mixin(HTMLElement.prototype, {
+    get innerHTML() {
+      return getInnerHTML(this);
+    },
+    set innerHTML(value) {
+      // IE9 does not handle set innerHTML correctly on plaintextParents. It
+      // creates element children. For example
+      //
+      //   scriptElement.innerHTML = '<a>test</a>'
+      //
+      // Creates a single HTMLAnchorElement child.
+      if (oldIe && plaintextParents[this.localName]) {
+        this.textContent = value;
+        return;
+      }
+
+      var removedNodes = snapshotNodeList(this.childNodes);
+
+      if (this.invalidateShadowRenderer()) {
+        if (this instanceof wrappers.HTMLTemplateElement)
+          setInnerHTML(this.content, value);
+        else
+          setInnerHTML(this, value, this.tagName);
+
+      // If we have a non native template element we need to handle this
+      // manually since setting impl.innerHTML would add the html as direct
+      // children and not be moved over to the content fragment.
+      } else if (!OriginalHTMLTemplateElement &&
+                 this instanceof wrappers.HTMLTemplateElement) {
+        setInnerHTML(this.content, value);
+      } else {
+        this.impl.innerHTML = value;
+      }
+
+      var addedNodes = snapshotNodeList(this.childNodes);
+
+      enqueueMutation(this, 'childList', {
+        addedNodes: addedNodes,
+        removedNodes: removedNodes
+      });
+
+      nodesWereRemoved(removedNodes);
+      nodesWereAdded(addedNodes, this);
+    },
+
+    get outerHTML() {
+      return getOuterHTML(this, this.parentNode);
+    },
+    set outerHTML(value) {
+      var p = this.parentNode;
+      if (p) {
+        p.invalidateShadowRenderer();
+        var df = frag(p, value);
+        p.replaceChild(df, this);
+      }
+    },
+
+    insertAdjacentHTML: function(position, text) {
+      var contextElement, refNode;
+      switch (String(position).toLowerCase()) {
+        case 'beforebegin':
+          contextElement = this.parentNode;
+          refNode = this;
+          break;
+        case 'afterend':
+          contextElement = this.parentNode;
+          refNode = this.nextSibling;
+          break;
+        case 'afterbegin':
+          contextElement = this;
+          refNode = this.firstChild;
+          break;
+        case 'beforeend':
+          contextElement = this;
+          refNode = null;
+          break;
+        default:
+          return;
+      }
+
+      var df = frag(contextElement, text);
+      contextElement.insertBefore(df, refNode);
+    }
+  });
+
+  function frag(contextElement, html) {
+    // TODO(arv): This does not work with SVG and other non HTML elements.
+    var p = unwrap(contextElement.cloneNode(false));
+    p.innerHTML = html;
+    var df = unwrap(document.createDocumentFragment());
+    var c;
+    while (c = p.firstChild) {
+      df.appendChild(c);
+    }
+    return wrap(df);
+  }
+
+  function getter(name) {
+    return function() {
+      scope.renderAllPending();
+      return this.impl[name];
+    };
+  }
+
+  function getterRequiresRendering(name) {
+    defineGetter(HTMLElement, name, getter(name));
+  }
+
+  [
+    'clientHeight',
+    'clientLeft',
+    'clientTop',
+    'clientWidth',
+    'offsetHeight',
+    'offsetLeft',
+    'offsetTop',
+    'offsetWidth',
+    'scrollHeight',
+    'scrollWidth',
+  ].forEach(getterRequiresRendering);
+
+  function getterAndSetterRequiresRendering(name) {
+    Object.defineProperty(HTMLElement.prototype, name, {
+      get: getter(name),
+      set: function(v) {
+        scope.renderAllPending();
+        this.impl[name] = v;
+      },
+      configurable: true,
+      enumerable: true
+    });
+  }
+
+  [
+    'scrollLeft',
+    'scrollTop',
+  ].forEach(getterAndSetterRequiresRendering);
+
+  function methodRequiresRendering(name) {
+    Object.defineProperty(HTMLElement.prototype, name, {
+      value: function() {
+        scope.renderAllPending();
+        return this.impl[name].apply(this.impl, arguments);
+      },
+      configurable: true,
+      enumerable: true
+    });
+  }
+
+  [
+    'getBoundingClientRect',
+    'getClientRects',
+    'scrollIntoView'
+  ].forEach(methodRequiresRendering);
+
+  // HTMLElement is abstract so we use a subclass that has no members.
+  registerWrapper(OriginalHTMLElement, HTMLElement,
+                  document.createElement('b'));
+
+  scope.wrappers.HTMLElement = HTMLElement;
+
+  // TODO: Find a better way to share these two with WrapperShadowRoot.
+  scope.getInnerHTML = getInnerHTML;
+  scope.setInnerHTML = setInnerHTML
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var wrap = scope.wrap;
+
+  var OriginalHTMLCanvasElement = window.HTMLCanvasElement;
+
+  function HTMLCanvasElement(node) {
+    HTMLElement.call(this, node);
+  }
+  HTMLCanvasElement.prototype = Object.create(HTMLElement.prototype);
+
+  mixin(HTMLCanvasElement.prototype, {
+    getContext: function() {
+      var context = this.impl.getContext.apply(this.impl, arguments);
+      return context && wrap(context);
+    }
+  });
+
+  registerWrapper(OriginalHTMLCanvasElement, HTMLCanvasElement,
+                  document.createElement('canvas'));
+
+  scope.wrappers.HTMLCanvasElement = HTMLCanvasElement;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+
+  var OriginalHTMLContentElement = window.HTMLContentElement;
+
+  function HTMLContentElement(node) {
+    HTMLElement.call(this, node);
+  }
+  HTMLContentElement.prototype = Object.create(HTMLElement.prototype);
+  mixin(HTMLContentElement.prototype, {
+    get select() {
+      return this.getAttribute('select');
+    },
+    set select(value) {
+      this.setAttribute('select', value);
+    },
+
+    setAttribute: function(n, v) {
+      HTMLElement.prototype.setAttribute.call(this, n, v);
+      if (String(n).toLowerCase() === 'select')
+        this.invalidateShadowRenderer(true);
+    }
+
+    // getDistributedNodes is added in ShadowRenderer
+
+    // TODO: attribute boolean resetStyleInheritance;
+  });
+
+  if (OriginalHTMLContentElement)
+    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);
+
+  scope.wrappers.HTMLContentElement = HTMLContentElement;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
+  var rewrap = scope.rewrap;
+
+  var OriginalHTMLImageElement = window.HTMLImageElement;
+
+  function HTMLImageElement(node) {
+    HTMLElement.call(this, node);
+  }
+  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);
+
+  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,
+                  document.createElement('img'));
+
+  function Image(width, height) {
+    if (!(this instanceof Image)) {
+      throw new TypeError(
+          'DOM object constructor cannot be called as a function.');
+    }
+
+    var node = unwrap(document.createElement('img'));
+    HTMLElement.call(this, node);
+    rewrap(node, this);
+
+    if (width !== undefined)
+      node.width = width;
+    if (height !== undefined)
+      node.height = height;
+  }
+
+  Image.prototype = HTMLImageElement.prototype;
+
+  scope.wrappers.HTMLImageElement = HTMLImageElement;
+  scope.wrappers.Image = Image;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+
+  var OriginalHTMLShadowElement = window.HTMLShadowElement;
+
+  function HTMLShadowElement(node) {
+    HTMLElement.call(this, node);
+  }
+  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);
+  mixin(HTMLShadowElement.prototype, {
+    // TODO: attribute boolean resetStyleInheritance;
+  });
+
+  if (OriginalHTMLShadowElement)
+    registerWrapper(OriginalHTMLShadowElement, HTMLShadowElement);
+
+  scope.wrappers.HTMLShadowElement = HTMLShadowElement;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
+  var wrap = scope.wrap;
+
+  var contentTable = new WeakMap();
+  var templateContentsOwnerTable = new WeakMap();
+
+  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner
+  function getTemplateContentsOwner(doc) {
+    if (!doc.defaultView)
+      return doc;
+    var d = templateContentsOwnerTable.get(doc);
+    if (!d) {
+      // TODO(arv): This should either be a Document or HTMLDocument depending
+      // on doc.
+      d = doc.implementation.createHTMLDocument('');
+      while (d.lastChild) {
+        d.removeChild(d.lastChild);
+      }
+      templateContentsOwnerTable.set(doc, d);
+    }
+    return d;
+  }
+
+  function extractContent(templateElement) {
+    // templateElement is not a wrapper here.
+    var doc = getTemplateContentsOwner(templateElement.ownerDocument);
+    var df = unwrap(doc.createDocumentFragment());
+    var child;
+    while (child = templateElement.firstChild) {
+      df.appendChild(child);
+    }
+    return df;
+  }
+
+  var OriginalHTMLTemplateElement = window.HTMLTemplateElement;
+
+  function HTMLTemplateElement(node) {
+    HTMLElement.call(this, node);
+    if (!OriginalHTMLTemplateElement) {
+      var content = extractContent(node);
+      contentTable.set(this, wrap(content));
+    }
+  }
+  HTMLTemplateElement.prototype = Object.create(HTMLElement.prototype);
+
+  mixin(HTMLTemplateElement.prototype, {
+    get content() {
+      if (OriginalHTMLTemplateElement)
+        return wrap(this.impl.content);
+      return contentTable.get(this);
+    },
+
+    // TODO(arv): cloneNode needs to clone content.
+
+  });
+
+  if (OriginalHTMLTemplateElement)
+    registerWrapper(OriginalHTMLTemplateElement, HTMLTemplateElement);
+
+  scope.wrappers.HTMLTemplateElement = HTMLTemplateElement;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var registerWrapper = scope.registerWrapper;
+
+  var OriginalHTMLMediaElement = window.HTMLMediaElement;
+
+  function HTMLMediaElement(node) {
+    HTMLElement.call(this, node);
+  }
+  HTMLMediaElement.prototype = Object.create(HTMLElement.prototype);
+
+  registerWrapper(OriginalHTMLMediaElement, HTMLMediaElement,
+                  document.createElement('audio'));
+
+  scope.wrappers.HTMLMediaElement = HTMLMediaElement;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var HTMLMediaElement = scope.wrappers.HTMLMediaElement;
+  var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
+  var rewrap = scope.rewrap;
+
+  var OriginalHTMLAudioElement = window.HTMLAudioElement;
+
+  function HTMLAudioElement(node) {
+    HTMLMediaElement.call(this, node);
+  }
+  HTMLAudioElement.prototype = Object.create(HTMLMediaElement.prototype);
+
+  registerWrapper(OriginalHTMLAudioElement, HTMLAudioElement,
+                  document.createElement('audio'));
+
+  function Audio(src) {
+    if (!(this instanceof Audio)) {
+      throw new TypeError(
+          'DOM object constructor cannot be called as a function.');
+    }
+
+    var node = unwrap(document.createElement('audio'));
+    HTMLMediaElement.call(this, node);
+    rewrap(node, this);
+
+    node.setAttribute('preload', 'auto');
+    if (src !== undefined)
+      node.setAttribute('src', src);
+  }
+
+  Audio.prototype = HTMLAudioElement.prototype;
+
+  scope.wrappers.HTMLAudioElement = HTMLAudioElement;
+  scope.wrappers.Audio = Audio;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var rewrap = scope.rewrap;
+  var unwrap = scope.unwrap;
+  var wrap = scope.wrap;
+
+  var OriginalHTMLOptionElement = window.HTMLOptionElement;
+
+  function trimText(s) {
+    return s.replace(/\s+/g, ' ').trim();
+  }
+
+  function HTMLOptionElement(node) {
+    HTMLElement.call(this, node);
+  }
+  HTMLOptionElement.prototype = Object.create(HTMLElement.prototype);
+  mixin(HTMLOptionElement.prototype, {
+    get text() {
+      return trimText(this.textContent);
+    },
+    set text(value) {
+      this.textContent = trimText(String(value));
+    },
+    get form() {
+      return wrap(unwrap(this).form);
+    }
+  });
+
+  registerWrapper(OriginalHTMLOptionElement, HTMLOptionElement,
+                  document.createElement('option'));
+
+  function Option(text, value, defaultSelected, selected) {
+    if (!(this instanceof Option)) {
+      throw new TypeError(
+          'DOM object constructor cannot be called as a function.');
+    }
+
+    var node = unwrap(document.createElement('option'));
+    HTMLElement.call(this, node);
+    rewrap(node, this);
+
+    if (text !== undefined)
+      node.text = text;
+    if (value !== undefined)
+      node.setAttribute('value', value);
+    if (defaultSelected === true)
+      node.setAttribute('selected', '');
+    node.selected = selected === true;
+  }
+
+  Option.prototype = HTMLOptionElement.prototype;
+
+  scope.wrappers.HTMLOptionElement = HTMLOptionElement;
+  scope.wrappers.Option = Option;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2014 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
+  var wrap = scope.wrap;
+
+  var OriginalHTMLSelectElement = window.HTMLSelectElement;
+
+  function HTMLSelectElement(node) {
+    HTMLElement.call(this, node);
+  }
+  HTMLSelectElement.prototype = Object.create(HTMLElement.prototype);
+  mixin(HTMLSelectElement.prototype, {
+    add: function(element, before) {
+      if (typeof before === 'object')  // also includes null
+        before = unwrap(before);
+      unwrap(this).add(unwrap(element), before);
+    },
+
+    remove: function(indexOrNode) {
+      // Spec only allows index but implementations allow index or node.
+      // remove() is also allowed which is same as remove(undefined)
+      if (indexOrNode === undefined) {
+        HTMLElement.prototype.remove.call(this);
+        return;
+      }
+
+      if (typeof indexOrNode === 'object')
+        indexOrNode = unwrap(indexOrNode);
+
+      unwrap(this).remove(indexOrNode);
+    },
+
+    get form() {
+      return wrap(unwrap(this).form);
+    }
+  });
+
+  registerWrapper(OriginalHTMLSelectElement, HTMLSelectElement,
+                  document.createElement('select'));
+
+  scope.wrappers.HTMLSelectElement = HTMLSelectElement;
+})(window.ShadowDOMPolyfill);
+
+/*
+ * Copyright 2014 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+  'use strict';
+
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
+  var wrap = scope.wrap;
+  var wrapHTMLCollection = scope.wrapHTMLCollection;
+
+  var OriginalHTMLTableElement = window.HTMLTableElement;
+
+  function HTMLTableElement(node) {
+    HTMLElement.call(this, node);
+  }
+  HTMLTableElement.prototype = Object.create(HTMLElement.prototype);
+  mixin(HTMLTableElement.prototype, {
+    get caption() {
+      return wrap(unwrap(this).caption);
+    },
+    createCaption: function() {
+      return wrap(unwrap(this).createCaption());
+    },
+
+    get tHead() {
+      return wrap(unwrap(this).tHead);
+    },
+    createTHead: function() {
+      return wrap(unwrap(this).createTHead());
+    },
+
+    createTFoot: function() {
+      return wrap(unwrap(this).createTFoot());
+    },
+    get tFoot() {
+      return wrap(unwrap(this).tFoot);
+    },
+
+    get tBodies() {
+      return wrapHTMLCollection(unwrap(this).tBodies);
+    },
+    createTBody: function() {
+      return wrap(unwrap(this).createTBody());
+    },
+
+    get rows() {
+      return wrapHTMLCollection(unwrap(this).rows);
+    },
+    insertRow: function(index) {
+      return wrap(unwrap(this).insertRow(index));
+    }
+  });
+
+  registerWrapper(OriginalHTMLTableElement, HTMLTableElement,
+                  document.createElement('table'));
+
+  scope.wrappers.HTMLTableElement = HTMLTableElement;
+})(window.ShadowDOMPolyfill);
+
+/*
+ * Copyright 2014 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+  'use strict';
+
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var wrapHTMLCollection = scope.wrapHTMLCollection;
+  var unwrap = scope.unwrap;
+  var wrap = scope.wrap;
+
+  var OriginalHTMLTableSectionElement = window.HTMLTableSectionElement;
+
+  function HTMLTableSectionElement(node) {
+    HTMLElement.call(this, node);
+  }
+  HTMLTableSectionElement.prototype = Object.create(HTMLElement.prototype);
+  mixin(HTMLTableSectionElement.prototype, {
+    get rows() {
+      return wrapHTMLCollection(unwrap(this).rows);
+    },
+    insertRow: function(index) {
+      return wrap(unwrap(this).insertRow(index));
+    }
+  });
+
+  registerWrapper(OriginalHTMLTableSectionElement, HTMLTableSectionElement,
+                  document.createElement('thead'));
+
+  scope.wrappers.HTMLTableSectionElement = HTMLTableSectionElement;
+})(window.ShadowDOMPolyfill);
+
+/*
+ * Copyright 2014 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+  'use strict';
+
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var wrapHTMLCollection = scope.wrapHTMLCollection;
+  var unwrap = scope.unwrap;
+  var wrap = scope.wrap;
+
+  var OriginalHTMLTableRowElement = window.HTMLTableRowElement;
+
+  function HTMLTableRowElement(node) {
+    HTMLElement.call(this, node);
+  }
+  HTMLTableRowElement.prototype = Object.create(HTMLElement.prototype);
+  mixin(HTMLTableRowElement.prototype, {
+    get cells() {
+      return wrapHTMLCollection(unwrap(this).cells);
+    },
+
+    insertCell: function(index) {
+      return wrap(unwrap(this).insertCell(index));
+    }
+  });
+
+  registerWrapper(OriginalHTMLTableRowElement, HTMLTableRowElement,
+                  document.createElement('tr'));
+
+  scope.wrappers.HTMLTableRowElement = HTMLTableRowElement;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var HTMLContentElement = scope.wrappers.HTMLContentElement;
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
+  var HTMLTemplateElement = scope.wrappers.HTMLTemplateElement;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+
+  var OriginalHTMLUnknownElement = window.HTMLUnknownElement;
+
+  function HTMLUnknownElement(node) {
+    switch (node.localName) {
+      case 'content':
+        return new HTMLContentElement(node);
+      case 'shadow':
+        return new HTMLShadowElement(node);
+      case 'template':
+        return new HTMLTemplateElement(node);
+    }
+    HTMLElement.call(this, node);
+  }
+  HTMLUnknownElement.prototype = Object.create(HTMLElement.prototype);
+  registerWrapper(OriginalHTMLUnknownElement, HTMLUnknownElement);
+  scope.wrappers.HTMLUnknownElement = HTMLUnknownElement;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2014 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var registerObject = scope.registerObject;
+
+  var SVG_NS = 'http://www.w3.org/2000/svg';
+  var svgTitleElement = document.createElementNS(SVG_NS, 'title');
+  var SVGTitleElement = registerObject(svgTitleElement);
+  var SVGElement = Object.getPrototypeOf(SVGTitleElement.prototype).constructor;
+
+  scope.wrappers.SVGElement = SVGElement;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2014 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
+  var wrap = scope.wrap;
+
+  var OriginalSVGUseElement = window.SVGUseElement;
+
+  // IE uses SVGElement as parent interface, SVG2 (Blink & Gecko) uses
+  // SVGGraphicsElement. Use the <g> element to get the right prototype.
+
+  var SVG_NS = 'http://www.w3.org/2000/svg';
+  var gWrapper = wrap(document.createElementNS(SVG_NS, 'g'));
+  var useElement = document.createElementNS(SVG_NS, 'use');
+  var SVGGElement = gWrapper.constructor;
+  var parentInterfacePrototype = Object.getPrototypeOf(SVGGElement.prototype);
+  var parentInterface = parentInterfacePrototype.constructor;
+
+  function SVGUseElement(impl) {
+    parentInterface.call(this, impl);
+  }
+
+  SVGUseElement.prototype = Object.create(parentInterfacePrototype);
+
+  // Firefox does not expose instanceRoot.
+  if ('instanceRoot' in useElement) {
+    mixin(SVGUseElement.prototype, {
+      get instanceRoot() {
+        return wrap(unwrap(this).instanceRoot);
+      },
+      get animatedInstanceRoot() {
+        return wrap(unwrap(this).animatedInstanceRoot);
+      },
+    });
+  }
+
+  registerWrapper(OriginalSVGUseElement, SVGUseElement, useElement);
+
+  scope.wrappers.SVGUseElement = SVGUseElement;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2014 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var EventTarget = scope.wrappers.EventTarget;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var wrap = scope.wrap;
+
+  var OriginalSVGElementInstance = window.SVGElementInstance;
+  if (!OriginalSVGElementInstance)
+    return;
+
+  function SVGElementInstance(impl) {
+    EventTarget.call(this, impl);
+  }
+
+  SVGElementInstance.prototype = Object.create(EventTarget.prototype);
+  mixin(SVGElementInstance.prototype, {
+    /** @type {SVGElement} */
+    get correspondingElement() {
+      return wrap(this.impl.correspondingElement);
+    },
+
+    /** @type {SVGUseElement} */
+    get correspondingUseElement() {
+      return wrap(this.impl.correspondingUseElement);
+    },
+
+    /** @type {SVGElementInstance} */
+    get parentNode() {
+      return wrap(this.impl.parentNode);
+    },
+
+    /** @type {SVGElementInstanceList} */
+    get childNodes() {
+      throw new Error('Not implemented');
+    },
+
+    /** @type {SVGElementInstance} */
+    get firstChild() {
+      return wrap(this.impl.firstChild);
+    },
+
+    /** @type {SVGElementInstance} */
+    get lastChild() {
+      return wrap(this.impl.lastChild);
+    },
+
+    /** @type {SVGElementInstance} */
+    get previousSibling() {
+      return wrap(this.impl.previousSibling);
+    },
+
+    /** @type {SVGElementInstance} */
+    get nextSibling() {
+      return wrap(this.impl.nextSibling);
+    }
+  });
+
+  registerWrapper(OriginalSVGElementInstance, SVGElementInstance);
+
+  scope.wrappers.SVGElementInstance = SVGElementInstance;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
+  var unwrapIfNeeded = scope.unwrapIfNeeded;
+  var wrap = scope.wrap;
+
+  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;
+
+  function CanvasRenderingContext2D(impl) {
+    this.impl = impl;
+  }
+
+  mixin(CanvasRenderingContext2D.prototype, {
+    get canvas() {
+      return wrap(this.impl.canvas);
+    },
+
+    drawImage: function() {
+      arguments[0] = unwrapIfNeeded(arguments[0]);
+      this.impl.drawImage.apply(this.impl, arguments);
+    },
+
+    createPattern: function() {
+      arguments[0] = unwrap(arguments[0]);
+      return this.impl.createPattern.apply(this.impl, arguments);
+    }
+  });
+
+  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,
+                  document.createElement('canvas').getContext('2d'));
+
+  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var unwrapIfNeeded = scope.unwrapIfNeeded;
+  var wrap = scope.wrap;
+
+  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;
+
+  // IE10 does not have WebGL.
+  if (!OriginalWebGLRenderingContext)
+    return;
+
+  function WebGLRenderingContext(impl) {
+    this.impl = impl;
+  }
+
+  mixin(WebGLRenderingContext.prototype, {
+    get canvas() {
+      return wrap(this.impl.canvas);
+    },
+
+    texImage2D: function() {
+      arguments[5] = unwrapIfNeeded(arguments[5]);
+      this.impl.texImage2D.apply(this.impl, arguments);
+    },
+
+    texSubImage2D: function() {
+      arguments[6] = unwrapIfNeeded(arguments[6]);
+      this.impl.texSubImage2D.apply(this.impl, arguments);
+    }
+  });
+
+  // Blink/WebKit has broken DOM bindings. Usually we would create an instance
+  // of the object and pass it into registerWrapper as a "blueprint" but
+  // creating WebGL contexts is expensive and might fail so we use a dummy
+  // object with dummy instance properties for these broken browsers.
+  var instanceProperties = /WebKit/.test(navigator.userAgent) ?
+      {drawingBufferHeight: null, drawingBufferWidth: null} : {};
+
+  registerWrapper(OriginalWebGLRenderingContext, WebGLRenderingContext,
+      instanceProperties);
+
+  scope.wrappers.WebGLRenderingContext = WebGLRenderingContext;
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
+  var unwrapIfNeeded = scope.unwrapIfNeeded;
+  var wrap = scope.wrap;
+
+  var OriginalRange = window.Range;
+
+  function Range(impl) {
+    this.impl = impl;
+  }
+  Range.prototype = {
+    get startContainer() {
+      return wrap(this.impl.startContainer);
+    },
+    get endContainer() {
+      return wrap(this.impl.endContainer);
+    },
+    get commonAncestorContainer() {
+      return wrap(this.impl.commonAncestorContainer);
+    },
+    setStart: function(refNode,offset) {
+      this.impl.setStart(unwrapIfNeeded(refNode), offset);
+    },
+    setEnd: function(refNode,offset) {
+      this.impl.setEnd(unwrapIfNeeded(refNode), offset);
+    },
+    setStartBefore: function(refNode) {
+      this.impl.setStartBefore(unwrapIfNeeded(refNode));
+    },
+    setStartAfter: function(refNode) {
+      this.impl.setStartAfter(unwrapIfNeeded(refNode));
+    },
+    setEndBefore: function(refNode) {
+      this.impl.setEndBefore(unwrapIfNeeded(refNode));
+    },
+    setEndAfter: function(refNode) {
+      this.impl.setEndAfter(unwrapIfNeeded(refNode));
+    },
+    selectNode: function(refNode) {
+      this.impl.selectNode(unwrapIfNeeded(refNode));
+    },
+    selectNodeContents: function(refNode) {
+      this.impl.selectNodeContents(unwrapIfNeeded(refNode));
+    },
+    compareBoundaryPoints: function(how, sourceRange) {
+      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));
+    },
+    extractContents: function() {
+      return wrap(this.impl.extractContents());
+    },
+    cloneContents: function() {
+      return wrap(this.impl.cloneContents());
+    },
+    insertNode: function(node) {
+      this.impl.insertNode(unwrapIfNeeded(node));
+    },
+    surroundContents: function(newParent) {
+      this.impl.surroundContents(unwrapIfNeeded(newParent));
+    },
+    cloneRange: function() {
+      return wrap(this.impl.cloneRange());
+    },
+    isPointInRange: function(node, offset) {
+      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);
+    },
+    comparePoint: function(node, offset) {
+      return this.impl.comparePoint(unwrapIfNeeded(node), offset);
+    },
+    intersectsNode: function(node) {
+      return this.impl.intersectsNode(unwrapIfNeeded(node));
+    },
+    toString: function() {
+      return this.impl.toString();
+    }
+  };
+
+  // IE9 does not have createContextualFragment.
+  if (OriginalRange.prototype.createContextualFragment) {
+    Range.prototype.createContextualFragment = function(html) {
+      return wrap(this.impl.createContextualFragment(html));
+    };
+  }
+
+  registerWrapper(window.Range, Range, document.createRange());
+
+  scope.wrappers.Range = Range;
+
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var GetElementsByInterface = scope.GetElementsByInterface;
+  var ParentNodeInterface = scope.ParentNodeInterface;
+  var SelectorsInterface = scope.SelectorsInterface;
+  var mixin = scope.mixin;
+  var registerObject = scope.registerObject;
+
+  var DocumentFragment = registerObject(document.createDocumentFragment());
+  mixin(DocumentFragment.prototype, ParentNodeInterface);
+  mixin(DocumentFragment.prototype, SelectorsInterface);
+  mixin(DocumentFragment.prototype, GetElementsByInterface);
+
+  var Comment = registerObject(document.createComment(''));
+
+  scope.wrappers.Comment = Comment;
+  scope.wrappers.DocumentFragment = DocumentFragment;
+
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var DocumentFragment = scope.wrappers.DocumentFragment;
+  var TreeScope = scope.TreeScope;
+  var elementFromPoint = scope.elementFromPoint;
+  var getInnerHTML = scope.getInnerHTML;
+  var getTreeScope = scope.getTreeScope;
+  var mixin = scope.mixin;
+  var rewrap = scope.rewrap;
+  var setInnerHTML = scope.setInnerHTML;
+  var unwrap = scope.unwrap;
+
+  var shadowHostTable = new WeakMap();
+  var nextOlderShadowTreeTable = new WeakMap();
+
+  var spaceCharRe = /[ \t\n\r\f]/;
+
+  function ShadowRoot(hostWrapper) {
+    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());
+    DocumentFragment.call(this, node);
+
+    // createDocumentFragment associates the node with a wrapper
+    // DocumentFragment instance. Override that.
+    rewrap(node, this);
+
+    this.treeScope_ = new TreeScope(this, getTreeScope(hostWrapper));
+
+    var oldShadowRoot = hostWrapper.shadowRoot;
+    nextOlderShadowTreeTable.set(this, oldShadowRoot);
+
+    shadowHostTable.set(this, hostWrapper);
+  }
+  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);
+  mixin(ShadowRoot.prototype, {
+    get innerHTML() {
+      return getInnerHTML(this);
+    },
+    set innerHTML(value) {
+      setInnerHTML(this, value);
+      this.invalidateShadowRenderer();
+    },
+
+    get olderShadowRoot() {
+      return nextOlderShadowTreeTable.get(this) || null;
+    },
+
+    get host() {
+      return shadowHostTable.get(this) || null;
+    },
+
+    invalidateShadowRenderer: function() {
+      return shadowHostTable.get(this).invalidateShadowRenderer();
+    },
+
+    elementFromPoint: function(x, y) {
+      return elementFromPoint(this, this.ownerDocument, x, y);
+    },
+
+    getElementById: function(id) {
+      if (spaceCharRe.test(id))
+        return null;
+      return this.querySelector('[id="' + id + '"]');
+    }
+  });
+
+  scope.wrappers.ShadowRoot = ShadowRoot;
+
+})(window.ShadowDOMPolyfill);
+
+// 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) {
+  'use strict';
+
+  var Element = scope.wrappers.Element;
+  var HTMLContentElement = scope.wrappers.HTMLContentElement;
+  var HTMLShadowElement = scope.wrappers.HTMLShadowElement;
+  var Node = scope.wrappers.Node;
+  var ShadowRoot = scope.wrappers.ShadowRoot;
+  var assert = scope.assert;
+  var getTreeScope = scope.getTreeScope;
+  var mixin = scope.mixin;
+  var oneOf = scope.oneOf;
+  var unwrap = scope.unwrap;
+  var wrap = scope.wrap;
+
+  /**
+   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.
+   * Up means parentNode
+   * Sideways means previous and next sibling.
+   * @param {!Node} wrapper
+   */
+  function updateWrapperUpAndSideways(wrapper) {
+    wrapper.previousSibling_ = wrapper.previousSibling;
+    wrapper.nextSibling_ = wrapper.nextSibling;
+    wrapper.parentNode_ = wrapper.parentNode;
+  }
+
+  /**
+   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.
+   * Down means first and last child
+   * @param {!Node} wrapper
+   */
+  function updateWrapperDown(wrapper) {
+    wrapper.firstChild_ = wrapper.firstChild;
+    wrapper.lastChild_ = wrapper.lastChild;
+  }
+
+  function updateAllChildNodes(parentNodeWrapper) {
+    assert(parentNodeWrapper instanceof Node);
+    for (var childWrapper = parentNodeWrapper.firstChild;
+         childWrapper;
+         childWrapper = childWrapper.nextSibling) {
+      updateWrapperUpAndSideways(childWrapper);
+    }
+    updateWrapperDown(parentNodeWrapper);
+  }
+
+  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {
+    var parentNode = unwrap(parentNodeWrapper);
+    var newChild = unwrap(newChildWrapper);
+    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;
+
+    remove(newChildWrapper);
+    updateWrapperUpAndSideways(newChildWrapper);
+
+    if (!refChildWrapper) {
+      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;
+      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)
+        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;
+
+      var lastChildWrapper = wrap(parentNode.lastChild);
+      if (lastChildWrapper)
+        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;
+    } else {
+      if (parentNodeWrapper.firstChild === refChildWrapper)
+        parentNodeWrapper.firstChild_ = refChildWrapper;
+
+      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;
+    }
+
+    parentNode.insertBefore(newChild, refChild);
+  }
+
+  function remove(nodeWrapper) {
+    var node = unwrap(nodeWrapper)
+    var parentNode = node.parentNode;
+    if (!parentNode)
+      return;
+
+    var parentNodeWrapper = wrap(parentNode);
+    updateWrapperUpAndSideways(nodeWrapper);
+
+    if (nodeWrapper.previousSibling)
+      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;
+    if (nodeWrapper.nextSibling)
+      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;
+
+    if (parentNodeWrapper.lastChild === nodeWrapper)
+      parentNodeWrapper.lastChild_ = nodeWrapper;
+    if (parentNodeWrapper.firstChild === nodeWrapper)
+      parentNodeWrapper.firstChild_ = nodeWrapper;
+
+    parentNode.removeChild(node);
+  }
+
+  var distributedChildNodesTable = new WeakMap();
+  var eventParentsTable = new WeakMap();
+  var insertionParentTable = new WeakMap();
+  var rendererForHostTable = new WeakMap();
+
+  function distributeChildToInsertionPoint(child, insertionPoint) {
+    getDistributedChildNodes(insertionPoint).push(child);
+    assignToInsertionPoint(child, insertionPoint);
+
+    var eventParents = eventParentsTable.get(child);
+    if (!eventParents)
+      eventParentsTable.set(child, eventParents = []);
+    eventParents.push(insertionPoint);
+  }
+
+  function resetDistributedChildNodes(insertionPoint) {
+    distributedChildNodesTable.set(insertionPoint, []);
+  }
+
+  function getDistributedChildNodes(insertionPoint) {
+    var rv = distributedChildNodesTable.get(insertionPoint);
+    if (!rv)
+      distributedChildNodesTable.set(insertionPoint, rv = []);
+    return rv;
+  }
+
+  function getChildNodesSnapshot(node) {
+    var result = [], i = 0;
+    for (var child = node.firstChild; child; child = child.nextSibling) {
+      result[i++] = child;
+    }
+    return result;
+  }
+
+  /**
+   * Visits all nodes in the tree that fulfils the |predicate|. If the |visitor|
+   * function returns |false| the traversal is aborted.
+   * @param {!Node} tree
+   * @param {function(!Node) : boolean} predicate
+   * @param {function(!Node) : *} visitor
+   */
+  function visit(tree, predicate, visitor) {
+    // This operates on logical DOM.
+    for (var node = tree.firstChild; node; node = node.nextSibling) {
+      if (predicate(node)) {
+        if (visitor(node) === false)
+          return;
+      } else {
+        visit(node, predicate, visitor);
+      }
+    }
+  }
+
+  // Matching Insertion Points
+  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#matching-insertion-points
+
+  // TODO(arv): Verify this... I don't remember why I picked this regexp.
+  var selectorMatchRegExp = /^[*.:#[a-zA-Z_|]/;
+
+  var allowedPseudoRegExp = new RegExp('^:(' + [
+    'link',
+    'visited',
+    'target',
+    'enabled',
+    'disabled',
+    'checked',
+    'indeterminate',
+    'nth-child',
+    'nth-last-child',
+    'nth-of-type',
+    'nth-last-of-type',
+    'first-child',
+    'last-child',
+    'first-of-type',
+    'last-of-type',
+    'only-of-type',
+  ].join('|') + ')');
+
+
+  /**
+   * @param {Element} node
+   * @oaram {Element} point The insertion point element.
+   * @return {boolean} Whether the node matches the insertion point.
+   */
+  function matchesCriteria(node, point) {
+    var select = point.getAttribute('select');
+    if (!select)
+      return true;
+
+    // Here we know the select attribute is a non empty string.
+    select = select.trim();
+    if (!select)
+      return true;
+
+    if (!(node instanceof Element))
+      return false;
+
+    // The native matches function in IE9 does not correctly work with elements
+    // that are not in the document.
+    // TODO(arv): Implement matching in JS.
+    // https://github.com/Polymer/ShadowDOM/issues/361
+    if (select === '*' || select === node.localName)
+      return true;
+
+    // TODO(arv): This does not seem right. Need to check for a simple selector.
+    if (!selectorMatchRegExp.test(select))
+      return false;
+
+    // TODO(arv): This no longer matches the spec.
+    if (select[0] === ':' && !allowedPseudoRegExp.test(select))
+      return false;
+
+    try {
+      return node.matches(select);
+    } catch (ex) {
+      // Invalid selector.
+      return false;
+    }
+  }
+
+  var request = oneOf(window, [
+    'requestAnimationFrame',
+    'mozRequestAnimationFrame',
+    'webkitRequestAnimationFrame',
+    'setTimeout'
+  ]);
+
+  var pendingDirtyRenderers = [];
+  var renderTimer;
+
+  function renderAllPending() {
+    // TODO(arv): Order these in document order. That way we do not have to
+    // render something twice.
+    for (var i = 0; i < pendingDirtyRenderers.length; i++) {
+      var renderer = pendingDirtyRenderers[i];
+      var parentRenderer = renderer.parentRenderer;
+      if (parentRenderer && parentRenderer.dirty)
+        continue;
+      renderer.render();
+    }
+
+    pendingDirtyRenderers = [];
+  }
+
+  function handleRequestAnimationFrame() {
+    renderTimer = null;
+    renderAllPending();
+  }
+
+  /**
+   * Returns existing shadow renderer for a host or creates it if it is needed.
+   * @params {!Element} host
+   * @return {!ShadowRenderer}
+   */
+  function getRendererForHost(host) {
+    var renderer = rendererForHostTable.get(host);
+    if (!renderer) {
+      renderer = new ShadowRenderer(host);
+      rendererForHostTable.set(host, renderer);
+    }
+    return renderer;
+  }
+
+  function getShadowRootAncestor(node) {
+    var root = getTreeScope(node).root;
+    if (root instanceof ShadowRoot)
+      return root;
+    return null;
+  }
+
+  function getRendererForShadowRoot(shadowRoot) {
+    return getRendererForHost(shadowRoot.host);
+  }
+
+  var spliceDiff = new ArraySplice();
+  spliceDiff.equals = function(renderNode, rawNode) {
+    return unwrap(renderNode.node) === rawNode;
+  };
+
+  /**
+   * RenderNode is used as an in memory "render tree". When we render the
+   * composed tree we create a tree of RenderNodes, then we diff this against
+   * the real DOM tree and make minimal changes as needed.
+   */
+  function RenderNode(node) {
+    this.skip = false;
+    this.node = node;
+    this.childNodes = [];
+  }
+
+  RenderNode.prototype = {
+    append: function(node) {
+      var rv = new RenderNode(node);
+      this.childNodes.push(rv);
+      return rv;
+    },
+
+    sync: function(opt_added) {
+      if (this.skip)
+        return;
+
+      var nodeWrapper = this.node;
+      // plain array of RenderNodes
+      var newChildren = this.childNodes;
+      // plain array of real nodes.
+      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));
+      var added = opt_added || new WeakMap();
+
+      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);
+
+      var newIndex = 0, oldIndex = 0;
+      var lastIndex = 0;
+      for (var i = 0; i < splices.length; i++) {
+        var splice = splices[i];
+        for (; lastIndex < splice.index; lastIndex++) {
+          oldIndex++;
+          newChildren[newIndex++].sync(added);
+        }
+
+        var removedCount = splice.removed.length;
+        for (var j = 0; j < removedCount; j++) {
+          var wrapper = wrap(oldChildren[oldIndex++]);
+          if (!added.get(wrapper))
+            remove(wrapper);
+        }
+
+        var addedCount = splice.addedCount;
+        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);
+        for (var j = 0; j < addedCount; j++) {
+          var newChildRenderNode = newChildren[newIndex++];
+          var newChildWrapper = newChildRenderNode.node;
+          insertBefore(nodeWrapper, newChildWrapper, refNode);
+
+          // Keep track of added so that we do not remove the node after it
+          // has been added.
+          added.set(newChildWrapper, true);
+
+          newChildRenderNode.sync(added);
+        }
+
+        lastIndex += addedCount;
+      }
+
+      for (var i = lastIndex; i < newChildren.length; i++) {
+        newChildren[i].sync(added);
+      }
+    }
+  };
+
+  function ShadowRenderer(host) {
+    this.host = host;
+    this.dirty = false;
+    this.invalidateAttributes();
+    this.associateNode(host);
+  }
+
+  ShadowRenderer.prototype = {
+
+    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees
+    render: function(opt_renderNode) {
+      if (!this.dirty)
+        return;
+
+      this.invalidateAttributes();
+      this.treeComposition();
+
+      var host = this.host;
+      var shadowRoot = host.shadowRoot;
+
+      this.associateNode(host);
+      var topMostRenderer = !renderNode;
+      var renderNode = opt_renderNode || new RenderNode(host);
+
+      for (var node = shadowRoot.firstChild; node; node = node.nextSibling) {
+        this.renderNode(shadowRoot, renderNode, node, false);
+      }
+
+      if (topMostRenderer)
+        renderNode.sync();
+
+      this.dirty = false;
+    },
+
+    get parentRenderer() {
+      return getTreeScope(this.host).renderer;
+    },
+
+    invalidate: function() {
+      if (!this.dirty) {
+        this.dirty = true;
+        pendingDirtyRenderers.push(this);
+        if (renderTimer)
+          return;
+        renderTimer = window[request](handleRequestAnimationFrame, 0);
+      }
+    },
+
+    renderNode: function(shadowRoot, renderNode, node, isNested) {
+      if (isShadowHost(node)) {
+        renderNode = renderNode.append(node);
+        var renderer = getRendererForHost(node);
+        renderer.dirty = true;  // Need to rerender due to reprojection.
+        renderer.render(renderNode);
+      } else if (isInsertionPoint(node)) {
+        this.renderInsertionPoint(shadowRoot, renderNode, node, isNested);
+      } else if (isShadowInsertionPoint(node)) {
+        this.renderShadowInsertionPoint(shadowRoot, renderNode, node);
+      } else {
+        this.renderAsAnyDomTree(shadowRoot, renderNode, node, isNested);
+      }
+    },
+
+    renderAsAnyDomTree: function(shadowRoot, renderNode, node, isNested) {
+      renderNode = renderNode.append(node);
+
+      if (isShadowHost(node)) {
+        var renderer = getRendererForHost(node);
+        renderNode.skip = !renderer.dirty;
+        renderer.render(renderNode);
+      } else {
+        for (var child = node.firstChild; child; child = child.nextSibling) {
+          this.renderNode(shadowRoot, renderNode, child, isNested);
+        }
+      }
+    },
+
+    renderInsertionPoint: function(shadowRoot, renderNode, insertionPoint,
+                                   isNested) {
+      var distributedChildNodes = getDistributedChildNodes(insertionPoint);
+      if (distributedChildNodes.length) {
+        this.associateNode(insertionPoint);
+
+        for (var i = 0; i < distributedChildNodes.length; i++) {
+          var child = distributedChildNodes[i];
+          if (isInsertionPoint(child) && isNested)
+            this.renderInsertionPoint(shadowRoot, renderNode, child, isNested);
+          else
+            this.renderAsAnyDomTree(shadowRoot, renderNode, child, isNested);
+        }
+      } else {
+        this.renderFallbackContent(shadowRoot, renderNode, insertionPoint);
+      }
+      this.associateNode(insertionPoint.parentNode);
+    },
+
+    renderShadowInsertionPoint: function(shadowRoot, renderNode,
+                                         shadowInsertionPoint) {
+      var nextOlderTree = shadowRoot.olderShadowRoot;
+      if (nextOlderTree) {
+        assignToInsertionPoint(nextOlderTree, shadowInsertionPoint);
+        this.associateNode(shadowInsertionPoint.parentNode);
+        for (var node = nextOlderTree.firstChild;
+             node;
+             node = node.nextSibling) {
+          this.renderNode(nextOlderTree, renderNode, node, true);
+        }
+      } else {
+        this.renderFallbackContent(shadowRoot, renderNode,
+                                   shadowInsertionPoint);
+      }
+    },
+
+    renderFallbackContent: function(shadowRoot, renderNode, fallbackHost) {
+      this.associateNode(fallbackHost);
+      this.associateNode(fallbackHost.parentNode);
+      for (var node = fallbackHost.firstChild; node; node = node.nextSibling) {
+        this.renderAsAnyDomTree(shadowRoot, renderNode, node, false);
+      }
+    },
+
+    /**
+     * Invalidates the attributes used to keep track of which attributes may
+     * cause the renderer to be invalidated.
+     */
+    invalidateAttributes: function() {
+      this.attributes = Object.create(null);
+    },
+
+    /**
+     * Parses the selector and makes this renderer dependent on the attribute
+     * being used in the selector.
+     * @param {string} selector
+     */
+    updateDependentAttributes: function(selector) {
+      if (!selector)
+        return;
+
+      var attributes = this.attributes;
+
+      // .class
+      if (/\.\w+/.test(selector))
+        attributes['class'] = true;
+
+      // #id
+      if (/#\w+/.test(selector))
+        attributes['id'] = true;
+
+      selector.replace(/\[\s*([^\s=\|~\]]+)/g, function(_, name) {
+        attributes[name] = true;
+      });
+
+      // Pseudo selectors have been removed from the spec.
+    },
+
+    dependsOnAttribute: function(name) {
+      return this.attributes[name];
+    },
+
+    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-distribution-algorithm
+    distribute: function(tree, pool) {
+      var self = this;
+
+      visit(tree, isActiveInsertionPoint,
+          function(insertionPoint) {
+            resetDistributedChildNodes(insertionPoint);
+            self.updateDependentAttributes(
+                insertionPoint.getAttribute('select'));
+
+            for (var i = 0; i < pool.length; i++) {  // 1.2
+              var node = pool[i];  // 1.2.1
+              if (node === undefined)  // removed
+                continue;
+              if (matchesCriteria(node, insertionPoint)) {  // 1.2.2
+                distributeChildToInsertionPoint(node, insertionPoint);  // 1.2.2.1
+                pool[i] = undefined;  // 1.2.2.2
+              }
+            }
+          });
+    },
+
+    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-tree-composition
+    treeComposition: function () {
+      var shadowHost = this.host;
+      var tree = shadowHost.shadowRoot;  // 1.
+      var pool = [];  // 2.
+
+      for (var child = shadowHost.firstChild;
+           child;
+           child = child.nextSibling) {  // 3.
+        if (isInsertionPoint(child)) {  // 3.2.
+          var reprojected = getDistributedChildNodes(child);  // 3.2.1.
+          // if reprojected is undef... reset it?
+          if (!reprojected || !reprojected.length)  // 3.2.2.
+            reprojected = getChildNodesSnapshot(child);
+          pool.push.apply(pool, reprojected);  // 3.2.3.
+        } else {
+          pool.push(child); // 3.3.
+        }
+      }
+
+      var shadowInsertionPoint, point;
+      while (tree) {  // 4.
+        // 4.1.
+        shadowInsertionPoint = undefined;  // Reset every iteration.
+        visit(tree, isActiveShadowInsertionPoint, function(point) {
+          shadowInsertionPoint = point;
+          return false;
+        });
+        point = shadowInsertionPoint;
+
+        this.distribute(tree, pool);  // 4.2.
+        if (point) {  // 4.3.
+          var nextOlderTree = tree.olderShadowRoot;  // 4.3.1.
+          if (!nextOlderTree) {
+            break;  // 4.3.1.1.
+          } else {
+            tree = nextOlderTree;  // 4.3.2.2.
+            assignToInsertionPoint(tree, point);  // 4.3.2.2.
+            continue;  // 4.3.2.3.
+          }
+        } else {
+          break;  // 4.4.
+        }
+      }
+    },
+
+    associateNode: function(node) {
+      node.impl.polymerShadowRenderer_ = this;
+    }
+  };
+
+  function isInsertionPoint(node) {
+    // Should this include <shadow>?
+    return node instanceof HTMLContentElement;
+  }
+
+  function isActiveInsertionPoint(node) {
+    // <content> inside another <content> or <shadow> is considered inactive.
+    return node instanceof HTMLContentElement;
+  }
+
+  function isShadowInsertionPoint(node) {
+    return node instanceof HTMLShadowElement;
+  }
+
+  function isActiveShadowInsertionPoint(node) {
+    // <shadow> inside another <content> or <shadow> is considered inactive.
+    return node instanceof HTMLShadowElement;
+  }
+
+  function isShadowHost(shadowHost) {
+    return shadowHost.shadowRoot;
+  }
+
+  function getShadowTrees(host) {
+    var trees = [];
+
+    for (var tree = host.shadowRoot; tree; tree = tree.olderShadowRoot) {
+      trees.push(tree);
+    }
+    return trees;
+  }
+
+  function assignToInsertionPoint(tree, point) {
+    insertionParentTable.set(tree, point);
+  }
+
+  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees
+  function render(host) {
+    new ShadowRenderer(host).render();
+  };
+
+  // Need to rerender shadow host when:
+  //
+  // - a direct child to the ShadowRoot is added or removed
+  // - a direct child to the host is added or removed
+  // - a new shadow root is created
+  // - a direct child to a content/shadow element is added or removed
+  // - a sibling to a content/shadow element is added or removed
+  // - content[select] is changed
+  // - an attribute in a direct child to a host is modified
+
+  /**
+   * This gets called when a node was added or removed to it.
+   */
+  Node.prototype.invalidateShadowRenderer = function(force) {
+    var renderer = this.impl.polymerShadowRenderer_;
+    if (renderer) {
+      renderer.invalidate();
+      return true;
+    }
+
+    return false;
+  };
+
+  HTMLContentElement.prototype.getDistributedNodes = function() {
+    // TODO(arv): We should only rerender the dirty ancestor renderers (from
+    // the root and down).
+    renderAllPending();
+    return getDistributedChildNodes(this);
+  };
+
+  HTMLShadowElement.prototype.nodeIsInserted_ =
+  HTMLContentElement.prototype.nodeIsInserted_ = function() {
+    // Invalidate old renderer if any.
+    this.invalidateShadowRenderer();
+
+    var shadowRoot = getShadowRootAncestor(this);
+    var renderer;
+    if (shadowRoot)
+      renderer = getRendererForShadowRoot(shadowRoot);
+    this.impl.polymerShadowRenderer_ = renderer;
+    if (renderer)
+      renderer.invalidate();
+  };
+
+  scope.eventParentsTable = eventParentsTable;
+  scope.getRendererForHost = getRendererForHost;
+  scope.getShadowTrees = getShadowTrees;
+  scope.insertionParentTable = insertionParentTable;
+  scope.renderAllPending = renderAllPending;
+
+  // Exposed for testing
+  scope.visual = {
+    insertBefore: insertBefore,
+    remove: remove,
+  };
+
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var HTMLElement = scope.wrappers.HTMLElement;
+  var assert = scope.assert;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
+  var wrap = scope.wrap;
+
+  var elementsWithFormProperty = [
+    'HTMLButtonElement',
+    'HTMLFieldSetElement',
+    'HTMLInputElement',
+    'HTMLKeygenElement',
+    'HTMLLabelElement',
+    'HTMLLegendElement',
+    'HTMLObjectElement',
+    // HTMLOptionElement is handled in HTMLOptionElement.js
+    'HTMLOutputElement',
+    // HTMLSelectElement is handled in HTMLSelectElement.js
+    'HTMLTextAreaElement',
+  ];
+
+  function createWrapperConstructor(name) {
+    if (!window[name])
+      return;
+
+    // Ensure we are not overriding an already existing constructor.
+    assert(!scope.wrappers[name]);
+
+    var GeneratedWrapper = function(node) {
+      // At this point all of them extend HTMLElement.
+      HTMLElement.call(this, node);
+    }
+    GeneratedWrapper.prototype = Object.create(HTMLElement.prototype);
+    mixin(GeneratedWrapper.prototype, {
+      get form() {
+        return wrap(unwrap(this).form);
+      },
+    });
+
+    registerWrapper(window[name], GeneratedWrapper,
+        document.createElement(name.slice(4, -7)));
+    scope.wrappers[name] = GeneratedWrapper;
+  }
+
+  elementsWithFormProperty.forEach(createWrapperConstructor);
+
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2014 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
+  var unwrapIfNeeded = scope.unwrapIfNeeded;
+  var wrap = scope.wrap;
+
+  var OriginalSelection = window.Selection;
+
+  function Selection(impl) {
+    this.impl = impl;
+  }
+  Selection.prototype = {
+    get anchorNode() {
+      return wrap(this.impl.anchorNode);
+    },
+    get focusNode() {
+      return wrap(this.impl.focusNode);
+    },
+    addRange: function(range) {
+      this.impl.addRange(unwrap(range));
+    },
+    collapse: function(node, index) {
+      this.impl.collapse(unwrapIfNeeded(node), index);
+    },
+    containsNode: function(node, allowPartial) {
+      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);
+    },
+    extend: function(node, offset) {
+      this.impl.extend(unwrapIfNeeded(node), offset);
+    },
+    getRangeAt: function(index) {
+      return wrap(this.impl.getRangeAt(index));
+    },
+    removeRange: function(range) {
+      this.impl.removeRange(unwrap(range));
+    },
+    selectAllChildren: function(node) {
+      this.impl.selectAllChildren(unwrapIfNeeded(node));
+    },
+    toString: function() {
+      return this.impl.toString();
+    }
+  };
+
+  // WebKit extensions. Not implemented.
+  // readonly attribute Node baseNode;
+  // readonly attribute long baseOffset;
+  // readonly attribute Node extentNode;
+  // readonly attribute long extentOffset;
+  // [RaisesException] void setBaseAndExtent([Default=Undefined] optional Node baseNode,
+  //                       [Default=Undefined] optional long baseOffset,
+  //                       [Default=Undefined] optional Node extentNode,
+  //                       [Default=Undefined] optional long extentOffset);
+  // [RaisesException, ImplementedAs=collapse] void setPosition([Default=Undefined] optional Node node,
+  //                  [Default=Undefined] optional long offset);
+
+  registerWrapper(window.Selection, Selection, window.getSelection());
+
+  scope.wrappers.Selection = Selection;
+
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var GetElementsByInterface = scope.GetElementsByInterface;
+  var Node = scope.wrappers.Node;
+  var ParentNodeInterface = scope.ParentNodeInterface;
+  var Selection = scope.wrappers.Selection;
+  var SelectorsInterface = scope.SelectorsInterface;
+  var ShadowRoot = scope.wrappers.ShadowRoot;
+  var TreeScope = scope.TreeScope;
+  var cloneNode = scope.cloneNode;
+  var defineWrapGetter = scope.defineWrapGetter;
+  var elementFromPoint = scope.elementFromPoint;
+  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;
+  var matchesNames = scope.matchesNames;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var renderAllPending = scope.renderAllPending;
+  var rewrap = scope.rewrap;
+  var unwrap = scope.unwrap;
+  var wrap = scope.wrap;
+  var wrapEventTargetMethods = scope.wrapEventTargetMethods;
+  var wrapNodeList = scope.wrapNodeList;
+
+  var implementationTable = new WeakMap();
+
+  function Document(node) {
+    Node.call(this, node);
+    this.treeScope_ = new TreeScope(this, null);
+  }
+  Document.prototype = Object.create(Node.prototype);
+
+  defineWrapGetter(Document, 'documentElement');
+
+  // Conceptually both body and head can be in a shadow but suporting that seems
+  // overkill at this point.
+  defineWrapGetter(Document, 'body');
+  defineWrapGetter(Document, 'head');
+
+  // document cannot be overridden so we override a bunch of its methods
+  // directly on the instance.
+
+  function wrapMethod(name) {
+    var original = document[name];
+    Document.prototype[name] = function() {
+      return wrap(original.apply(this.impl, arguments));
+    };
+  }
+
+  [
+    'createComment',
+    'createDocumentFragment',
+    'createElement',
+    'createElementNS',
+    'createEvent',
+    'createEventNS',
+    'createRange',
+    'createTextNode',
+    'getElementById'
+  ].forEach(wrapMethod);
+
+  var originalAdoptNode = document.adoptNode;
+
+  function adoptNodeNoRemove(node, doc) {
+    originalAdoptNode.call(doc.impl, unwrap(node));
+    adoptSubtree(node, doc);
+  }
+
+  function adoptSubtree(node, doc) {
+    if (node.shadowRoot)
+      doc.adoptNode(node.shadowRoot);
+    if (node instanceof ShadowRoot)
+      adoptOlderShadowRoots(node, doc);
+    for (var child = node.firstChild; child; child = child.nextSibling) {
+      adoptSubtree(child, doc);
+    }
+  }
+
+  function adoptOlderShadowRoots(shadowRoot, doc) {
+    var oldShadowRoot = shadowRoot.olderShadowRoot;
+    if (oldShadowRoot)
+      doc.adoptNode(oldShadowRoot);
+  }
+
+  var originalGetSelection = document.getSelection;
+
+  mixin(Document.prototype, {
+    adoptNode: function(node) {
+      if (node.parentNode)
+        node.parentNode.removeChild(node);
+      adoptNodeNoRemove(node, this);
+      return node;
+    },
+    elementFromPoint: function(x, y) {
+      return elementFromPoint(this, this, x, y);
+    },
+    importNode: function(node, deep) {
+      return cloneNode(node, deep, this.impl);
+    },
+    getSelection: function() {
+      renderAllPending();
+      return new Selection(originalGetSelection.call(unwrap(this)));
+    }
+  });
+
+  if (document.registerElement) {
+    var originalRegisterElement = document.registerElement;
+    Document.prototype.registerElement = function(tagName, object) {
+      var prototype, extendsOption;
+      if (object !== undefined) {
+        prototype = object.prototype;
+        extendsOption = object.extends;
+      }
+
+      if (!prototype)
+        prototype = Object.create(HTMLElement.prototype);
+
+
+      // If we already used the object as a prototype for another custom
+      // element.
+      if (scope.nativePrototypeTable.get(prototype)) {
+        // TODO(arv): DOMException
+        throw new Error('NotSupportedError');
+      }
+
+      // Find first object on the prototype chain that already have a native
+      // prototype. Keep track of all the objects before that so we can create
+      // a similar structure for the native case.
+      var proto = Object.getPrototypeOf(prototype);
+      var nativePrototype;
+      var prototypes = [];
+      while (proto) {
+        nativePrototype = scope.nativePrototypeTable.get(proto);
+        if (nativePrototype)
+          break;
+        prototypes.push(proto);
+        proto = Object.getPrototypeOf(proto);
+      }
+
+      if (!nativePrototype) {
+        // TODO(arv): DOMException
+        throw new Error('NotSupportedError');
+      }
+
+      // This works by creating a new prototype object that is empty, but has
+      // the native prototype as its proto. The original prototype object
+      // passed into register is used as the wrapper prototype.
+
+      var newPrototype = Object.create(nativePrototype);
+      for (var i = prototypes.length - 1; i >= 0; i--) {
+        newPrototype = Object.create(newPrototype);
+      }
+
+      // Add callbacks if present.
+      // Names are taken from:
+      //   https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/bindings/v8/CustomElementConstructorBuilder.cpp&sq=package:chromium&type=cs&l=156
+      // and not from the spec since the spec is out of date.
+      [
+        'createdCallback',
+        'attachedCallback',
+        'detachedCallback',
+        'attributeChangedCallback',
+      ].forEach(function(name) {
+        var f = prototype[name];
+        if (!f)
+          return;
+        newPrototype[name] = function() {
+          // if this element has been wrapped prior to registration,
+          // the wrapper is stale; in this case rewrap
+          if (!(wrap(this) instanceof CustomElementConstructor)) {
+            rewrap(this);
+          }
+          f.apply(wrap(this), arguments);
+        };
+      });
+
+      var p = {prototype: newPrototype};
+      if (extendsOption)
+        p.extends = extendsOption;
+
+      function CustomElementConstructor(node) {
+        if (!node) {
+          if (extendsOption) {
+            return document.createElement(extendsOption, tagName);
+          } else {
+            return document.createElement(tagName);
+          }
+        }
+        this.impl = node;
+      }
+      CustomElementConstructor.prototype = prototype;
+      CustomElementConstructor.prototype.constructor = CustomElementConstructor;
+
+      scope.constructorTable.set(newPrototype, CustomElementConstructor);
+      scope.nativePrototypeTable.set(prototype, newPrototype);
+
+      // registration is synchronous so do it last
+      var nativeConstructor = originalRegisterElement.call(unwrap(this),
+          tagName, p);
+      return CustomElementConstructor;
+    };
+
+    forwardMethodsToWrapper([
+      window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument
+    ], [
+      'registerElement',
+    ]);
+  }
+
+  // We also override some of the methods on document.body and document.head
+  // for convenience.
+  forwardMethodsToWrapper([
+    window.HTMLBodyElement,
+    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument
+    window.HTMLHeadElement,
+    window.HTMLHtmlElement,
+  ], [
+    'appendChild',
+    'compareDocumentPosition',
+    'contains',
+    'getElementsByClassName',
+    'getElementsByTagName',
+    'getElementsByTagNameNS',
+    'insertBefore',
+    'querySelector',
+    'querySelectorAll',
+    'removeChild',
+    'replaceChild',
+  ].concat(matchesNames));
+
+  forwardMethodsToWrapper([
+    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument
+  ], [
+    'adoptNode',
+    'importNode',
+    'contains',
+    'createComment',
+    'createDocumentFragment',
+    'createElement',
+    'createElementNS',
+    'createEvent',
+    'createEventNS',
+    'createRange',
+    'createTextNode',
+    'elementFromPoint',
+    'getElementById',
+    'getSelection',
+  ]);
+
+  mixin(Document.prototype, GetElementsByInterface);
+  mixin(Document.prototype, ParentNodeInterface);
+  mixin(Document.prototype, SelectorsInterface);
+
+  mixin(Document.prototype, {
+    get implementation() {
+      var implementation = implementationTable.get(this);
+      if (implementation)
+        return implementation;
+      implementation =
+          new DOMImplementation(unwrap(this).implementation);
+      implementationTable.set(this, implementation);
+      return implementation;
+    }
+  });
+
+  registerWrapper(window.Document, Document,
+      document.implementation.createHTMLDocument(''));
+
+  // Both WebKit and Gecko uses HTMLDocument for document. HTML5/DOM only has
+  // one Document interface and IE implements the standard correctly.
+  if (window.HTMLDocument)
+    registerWrapper(window.HTMLDocument, Document);
+
+  wrapEventTargetMethods([
+    window.HTMLBodyElement,
+    window.HTMLDocument || window.Document,  // Gecko adds these to HTMLDocument
+    window.HTMLHeadElement,
+  ]);
+
+  function DOMImplementation(impl) {
+    this.impl = impl;
+  }
+
+  function wrapImplMethod(constructor, name) {
+    var original = document.implementation[name];
+    constructor.prototype[name] = function() {
+      return wrap(original.apply(this.impl, arguments));
+    };
+  }
+
+  function forwardImplMethod(constructor, name) {
+    var original = document.implementation[name];
+    constructor.prototype[name] = function() {
+      return original.apply(this.impl, arguments);
+    };
+  }
+
+  wrapImplMethod(DOMImplementation, 'createDocumentType');
+  wrapImplMethod(DOMImplementation, 'createDocument');
+  wrapImplMethod(DOMImplementation, 'createHTMLDocument');
+  forwardImplMethod(DOMImplementation, 'hasFeature');
+
+  registerWrapper(window.DOMImplementation, DOMImplementation);
+
+  forwardMethodsToWrapper([
+    window.DOMImplementation,
+  ], [
+    'createDocumentType',
+    'createDocument',
+    'createHTMLDocument',
+    'hasFeature',
+  ]);
+
+  scope.adoptNodeNoRemove = adoptNodeNoRemove;
+  scope.wrappers.DOMImplementation = DOMImplementation;
+  scope.wrappers.Document = Document;
+
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var EventTarget = scope.wrappers.EventTarget;
+  var Selection = scope.wrappers.Selection;
+  var mixin = scope.mixin;
+  var registerWrapper = scope.registerWrapper;
+  var renderAllPending = scope.renderAllPending;
+  var unwrap = scope.unwrap;
+  var unwrapIfNeeded = scope.unwrapIfNeeded;
+  var wrap = scope.wrap;
+
+  var OriginalWindow = window.Window;
+  var originalGetComputedStyle = window.getComputedStyle;
+  var originalGetSelection = window.getSelection;
+
+  function Window(impl) {
+    EventTarget.call(this, impl);
+  }
+  Window.prototype = Object.create(EventTarget.prototype);
+
+  OriginalWindow.prototype.getComputedStyle = function(el, pseudo) {
+    return wrap(this || window).getComputedStyle(unwrapIfNeeded(el), pseudo);
+  };
+
+  OriginalWindow.prototype.getSelection = function() {
+    return wrap(this || window).getSelection();
+  };
+
+  // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065
+  delete window.getComputedStyle;
+  delete window.getSelection;
+
+  ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(
+      function(name) {
+        OriginalWindow.prototype[name] = function() {
+          var w = wrap(this || window);
+          return w[name].apply(w, arguments);
+        };
+
+        // Work around for https://bugzilla.mozilla.org/show_bug.cgi?id=943065
+        delete window[name];
+      });
+
+  mixin(Window.prototype, {
+    getComputedStyle: function(el, pseudo) {
+      renderAllPending();
+      return originalGetComputedStyle.call(unwrap(this), unwrapIfNeeded(el),
+                                           pseudo);
+    },
+    getSelection: function() {
+      renderAllPending();
+      return new Selection(originalGetSelection.call(unwrap(this)));
+    },
+  });
+
+  registerWrapper(OriginalWindow, Window);
+
+  scope.wrappers.Window = Window;
+
+})(window.ShadowDOMPolyfill);
+
+/**
+ * Copyright 2014 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(scope) {
+  'use strict';
+
+  var unwrap = scope.unwrap;
+
+  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that
+  // requires wrapping. Since it is only a method we do not need a real wrapper,
+  // we can just override the method.
+
+  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;
+  var OriginalDataTransferSetDragImage =
+      OriginalDataTransfer.prototype.setDragImage;
+
+  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {
+    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);
+  };
+
+})(window.ShadowDOMPolyfill);
+
+// Copyright 2013 The Polymer Authors. All rights reserved.
+// Use of this source code is goverened by a BSD-style
+// license that can be found in the LICENSE file.
+
+(function(scope) {
+  'use strict';
+
+  var isWrapperFor = scope.isWrapperFor;
+
+  // This is a list of the elements we currently override the global constructor
+  // for.
+  var elements = {
+    'a': 'HTMLAnchorElement',
+    // Do not create an applet element by default since it shows a warning in
+    // IE.
+    // https://github.com/Polymer/polymer/issues/217
+    // 'applet': 'HTMLAppletElement',
+    'area': 'HTMLAreaElement',
+    'audio': 'HTMLAudioElement',
+    'base': 'HTMLBaseElement',
+    'body': 'HTMLBodyElement',
+    'br': 'HTMLBRElement',
+    'button': 'HTMLButtonElement',
+    'canvas': 'HTMLCanvasElement',
+    'caption': 'HTMLTableCaptionElement',
+    'col': 'HTMLTableColElement',
+    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.
+    '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',
+    // WebKit and Moz are wrong:
+    // https://bugs.webkit.org/show_bug.cgi?id=111469
+    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096
+    // 'td': 'HTMLTableCellElement',
+    'template': 'HTMLTemplateElement',
+    'textarea': 'HTMLTextAreaElement',
+    'thead': 'HTMLTableSectionElement',
+    'time': 'HTMLTimeElement',
+    'title': 'HTMLTitleElement',
+    'tr': 'HTMLTableRowElement',
+    'track': 'HTMLTrackElement',
+    'ul': 'HTMLUListElement',
+    'video': 'HTMLVideoElement',
+  };
+
+  function overrideConstructor(tagName) {
+    var nativeConstructorName = elements[tagName];
+    var nativeConstructor = window[nativeConstructorName];
+    if (!nativeConstructor)
+      return;
+    var element = document.createElement(tagName);
+    var wrapperConstructor = element.constructor;
+    window[nativeConstructorName] = wrapperConstructor;
+  }
+
+  Object.keys(elements).forEach(overrideConstructor);
+
+  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {
+    window[name] = scope.wrappers[name]
+  });
+
+})(window.ShadowDOMPolyfill);
+
+/*
+ * 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() {
+
+  // convenient global
+  window.wrap = ShadowDOMPolyfill.wrapIfNeeded;
+  window.unwrap = ShadowDOMPolyfill.unwrapIfNeeded;
+
+  // users may want to customize other types
+  // TODO(sjmiles): 'button' is now supported by ShadowDOMPolyfill, but
+  // I've left this code here in case we need to temporarily patch another
+  // type
+  /*
+  (function() {
+    var elts = {HTMLButtonElement: 'button'};
+    for (var c in elts) {
+      window[c] = function() { throw 'Patched Constructor'; };
+      window[c].prototype = Object.getPrototypeOf(
+          document.createElement(elts[c]));
+    }
+  })();
+  */
+
+  // patch in prefixed name
+  Object.defineProperty(Element.prototype, 'webkitShadowRoot',
+      Object.getOwnPropertyDescriptor(Element.prototype, 'shadowRoot'));
+
+  var originalCreateShadowRoot = Element.prototype.createShadowRoot;
+  Element.prototype.createShadowRoot = function() {
+    var root = originalCreateShadowRoot.call(this);
+    CustomElements.watchShadow(this);
+    return root;
+  };
+
+  Element.prototype.webkitCreateShadowRoot = Element.prototype.createShadowRoot;
+})();
+
+/*
+ * Copyright 2012 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.
+ */
+
+/*
+  This is a limited shim for ShadowDOM css styling.
+  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles
+  
+  The intention here is to support only the styling features which can be 
+  relatively simply implemented. The goal is to allow users to avoid the 
+  most obvious pitfalls and do so without compromising performance significantly. 
+  For ShadowDOM styling that's not covered here, a set of best practices
+  can be provided that should allow users to accomplish more complex styling.
+
+  The following is a list of specific ShadowDOM styling features and a brief
+  discussion of the approach used to shim.
+
+  Shimmed features:
+
+  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host
+  element using the :host rule. To shim this feature, the :host styles are 
+  reformatted and prefixed with a given scope name and promoted to a 
+  document level stylesheet.
+  For example, given a scope name of .foo, a rule like this:
+  
+    :host {
+        background: red;
+      }
+    }
+  
+  becomes:
+  
+    .foo {
+      background: red;
+    }
+  
+  * encapsultion: Styles defined within ShadowDOM, apply only to 
+  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement
+  this feature.
+  
+  By default, rules are prefixed with the host element tag name 
+  as a descendant selector. This ensures styling does not leak out of the 'top'
+  of the element's ShadowDOM. For example,
+
+  div {
+      font-weight: bold;
+    }
+  
+  becomes:
+
+  x-foo div {
+      font-weight: bold;
+    }
+  
+  becomes:
+
+
+  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then 
+  selectors are scoped by adding an attribute selector suffix to each
+  simple selector that contains the host element tag name. Each element 
+  in the element's ShadowDOM template is also given the scope attribute. 
+  Thus, these rules match only elements that have the scope attribute.
+  For example, given a scope name of x-foo, a rule like this:
+  
+    div {
+      font-weight: bold;
+    }
+  
+  becomes:
+  
+    div[x-foo] {
+      font-weight: bold;
+    }
+
+  Note that elements that are dynamically added to a scope must have the scope
+  selector added to them manually.
+
+  * upper/lower bound encapsulation: Styles which are defined outside a
+  shadowRoot should not cross the ShadowDOM boundary and should not apply
+  inside a shadowRoot.
+
+  This styling behavior is not emulated. Some possible ways to do this that 
+  were rejected due to complexity and/or performance concerns include: (1) reset
+  every possible property for every possible selector for a given scope name;
+  (2) re-implement css in javascript.
+  
+  As an alternative, users should make sure to use selectors
+  specific to the scope in which they are working.
+  
+  * ::distributed: This behavior is not emulated. It's often not necessary
+  to style the contents of a specific insertion point and instead, descendants
+  of the host element can be styled selectively. Users can also create an 
+  extra node around an insertion point and style that node's contents
+  via descendent selectors. For example, with a shadowRoot like this:
+  
+    <style>
+      ::content(div) {
+        background: red;
+      }
+    </style>
+    <content></content>
+  
+  could become:
+  
+    <style>
+      / *@polyfill .content-container div * / 
+      ::content(div) {
+        background: red;
+      }
+    </style>
+    <div class="content-container">
+      <content></content>
+    </div>
+  
+  Note the use of @polyfill in the comment above a ShadowDOM specific style
+  declaration. This is a directive to the styling shim to use the selector 
+  in comments in lieu of the next selector when running under polyfill.
+*/
+(function(scope) {
+
+var ShadowCSS = {
+  strictStyling: false,
+  registry: {},
+  // Shim styles for a given root associated with a name and extendsName
+  // 1. cache root styles by name
+  // 2. optionally tag root nodes with scope name
+  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */
+  // 4. shim :host and scoping
+  shimStyling: function(root, name, extendsName) {
+    var scopeStyles = this.prepareRoot(root, name, extendsName);
+    var typeExtension = this.isTypeExtension(extendsName);
+    var scopeSelector = this.makeScopeSelector(name, typeExtension);
+    // use caching to make working with styles nodes easier and to facilitate
+    // lookup of extendee
+    var cssText = stylesToCssText(scopeStyles, true);
+    cssText = this.scopeCssText(cssText, scopeSelector);
+    // cache shimmed css on root for user extensibility
+    if (root) {
+      root.shimmedStyle = cssText;
+    }
+    // add style to document
+    this.addCssToDocument(cssText, name);
+  },
+  /*
+  * Shim a style element with the given selector. Returns cssText that can
+  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).
+  */
+  shimStyle: function(style, selector) {
+    return this.shimCssText(style.textContent, selector);
+  },
+  /*
+  * Shim some cssText with the given selector. Returns cssText that can
+  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).
+  */
+  shimCssText: function(cssText, selector) {
+    cssText = this.insertDirectives(cssText);
+    return this.scopeCssText(cssText, selector);
+  },
+  makeScopeSelector: function(name, typeExtension) {
+    if (name) {
+      return typeExtension ? '[is=' + name + ']' : name;
+    }
+    return '';
+  },
+  isTypeExtension: function(extendsName) {
+    return extendsName && extendsName.indexOf('-') < 0;
+  },
+  prepareRoot: function(root, name, extendsName) {
+    var def = this.registerRoot(root, name, extendsName);
+    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);
+    // remove existing style elements
+    this.removeStyles(root, def.rootStyles);
+    // apply strict attr
+    if (this.strictStyling) {
+      this.applyScopeToContent(root, name);
+    }
+    return def.scopeStyles;
+  },
+  removeStyles: function(root, styles) {
+    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {
+      s.parentNode.removeChild(s);
+    }
+  },
+  registerRoot: function(root, name, extendsName) {
+    var def = this.registry[name] = {
+      root: root,
+      name: name,
+      extendsName: extendsName
+    }
+    var styles = this.findStyles(root);
+    def.rootStyles = styles;
+    def.scopeStyles = def.rootStyles;
+    var extendee = this.registry[def.extendsName];
+    if (extendee) {
+      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);
+    }
+    return def;
+  },
+  findStyles: function(root) {
+    if (!root) {
+      return [];
+    }
+    var styles = root.querySelectorAll('style');
+    return Array.prototype.filter.call(styles, function(s) {
+      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);
+    });
+  },
+  applyScopeToContent: function(root, name) {
+    if (root) {
+      // add the name attribute to each node in root.
+      Array.prototype.forEach.call(root.querySelectorAll('*'),
+          function(node) {
+            node.setAttribute(name, '');
+          });
+      // and template contents too
+      Array.prototype.forEach.call(root.querySelectorAll('template'),
+          function(template) {
+            this.applyScopeToContent(template.content, name);
+          },
+          this);
+    }
+  },
+  insertDirectives: function(cssText) {
+    cssText = this.insertPolyfillDirectivesInCssText(cssText);
+    return this.insertPolyfillRulesInCssText(cssText);
+  },
+  /*
+   * Process styles to convert native ShadowDOM rules that will trip
+   * up the css parser; we rely on decorating the stylesheet with inert rules.
+   * 
+   * For example, we convert this rule:
+   * 
+   * polyfill-next-selector { content: ':host menu-item'; }
+   * ::content menu-item {
+   * 
+   * to this:
+   * 
+   * scopeName menu-item {
+   *
+  **/
+  insertPolyfillDirectivesInCssText: function(cssText) {
+    // TODO(sorvell): remove either content or comment
+    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {
+      // remove end comment delimiter and add block start
+      return p1.slice(0, -2) + '{';
+    });
+    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {
+      return p1 + ' {';
+    });
+  },
+  /*
+   * Process styles to add rules which will only apply under the polyfill
+   * 
+   * For example, we convert this rule:
+   * 
+   * polyfill-rule {
+   *   content: ':host menu-item';
+   * ...
+   * }
+   * 
+   * to this:
+   * 
+   * scopeName menu-item {...}
+   *
+  **/
+  insertPolyfillRulesInCssText: function(cssText) {
+    // TODO(sorvell): remove either content or comment
+    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {
+      // remove end comment delimiter
+      return p1.slice(0, -1);
+    });
+    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {
+      var rule = match.replace(p1, '').replace(p2, '');
+      return p3 + rule;
+    });
+  },
+  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:
+   * 
+   *  .foo {... } 
+   *  
+   *  and converts this to
+   *  
+   *  scopeName .foo { ... }
+  */
+  scopeCssText: function(cssText, scopeSelector) {
+    var unscoped = this.extractUnscopedRulesFromCssText(cssText);
+    cssText = this.insertPolyfillHostInCssText(cssText);
+    cssText = this.convertColonHost(cssText);
+    cssText = this.convertColonHostContext(cssText);
+    cssText = this.convertCombinators(cssText);
+    if (scopeSelector) {
+      var self = this, cssText;
+      withCssRules(cssText, function(rules) {
+        cssText = self.scopeRules(rules, scopeSelector);
+      });
+
+    }
+    cssText = cssText + '\n' + unscoped;
+    return cssText.trim();
+  },
+  /*
+   * Process styles to add rules which will only apply under the polyfill
+   * and do not process via CSSOM. (CSSOM is destructive to rules on rare 
+   * occasions, e.g. -webkit-calc on Safari.)
+   * For example, we convert this rule:
+   * 
+   * (comment start) @polyfill-unscoped-rule menu-item { 
+   * ... } (comment end)
+   * 
+   * to this:
+   * 
+   * menu-item {...}
+   *
+  **/
+  extractUnscopedRulesFromCssText: function(cssText) {
+    // TODO(sorvell): remove either content or comment
+    var r = '', m;
+    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {
+      r += m[1].slice(0, -1) + '\n\n';
+    }
+    while (m = cssContentUnscopedRuleRe.exec(cssText)) {
+      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\n\n';
+    }
+    return r;
+  },
+  /*
+   * convert a rule like :host(.foo) > .bar { }
+   *
+   * to
+   *
+   * scopeName.foo > .bar
+  */
+  convertColonHost: function(cssText) {
+    return this.convertColonRule(cssText, cssColonHostRe,
+        this.colonHostPartReplacer);
+  },
+  /*
+   * convert a rule like :host-context(.foo) > .bar { }
+   *
+   * to
+   *
+   * scopeName.foo > .bar, .foo scopeName > .bar { }
+   * 
+   * and
+   *
+   * :host-context(.foo:host) .bar { ... }
+   * 
+   * to
+   * 
+   * scopeName.foo .bar { ... }
+  */
+  convertColonHostContext: function(cssText) {
+    return this.convertColonRule(cssText, cssColonHostContextRe,
+        this.colonHostContextPartReplacer);
+  },
+  convertColonRule: function(cssText, regExp, partReplacer) {
+    // p1 = :host, p2 = contents of (), p3 rest of rule
+    return cssText.replace(regExp, function(m, p1, p2, p3) {
+      p1 = polyfillHostNoCombinator;
+      if (p2) {
+        var parts = p2.split(','), r = [];
+        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {
+          p = p.trim();
+          r.push(partReplacer(p1, p, p3));
+        }
+        return r.join(',');
+      } else {
+        return p1 + p3;
+      }
+    });
+  },
+  colonHostContextPartReplacer: function(host, part, suffix) {
+    if (part.match(polyfillHost)) {
+      return this.colonHostPartReplacer(host, part, suffix);
+    } else {
+      return host + part + suffix + ', ' + part + ' ' + host + suffix;
+    }
+  },
+  colonHostPartReplacer: function(host, part, suffix) {
+    return host + part.replace(polyfillHost, '') + suffix;
+  },
+  /*
+   * Convert ^ and ^^ combinators by replacing with space.
+  */
+  convertCombinators: function(cssText) {
+    for (var i=0; i < combinatorsRe.length; i++) {
+      cssText = cssText.replace(combinatorsRe[i], ' ');
+    }
+    return cssText;
+  },
+  // change a selector like 'div' to 'name div'
+  scopeRules: function(cssRules, scopeSelector) {
+    var cssText = '';
+    if (cssRules) {
+      Array.prototype.forEach.call(cssRules, function(rule) {
+        if (rule.selectorText && (rule.style && rule.style.cssText)) {
+          cssText += this.scopeSelector(rule.selectorText, scopeSelector, 
+            this.strictStyling) + ' {\n\t';
+          cssText += this.propertiesFromRule(rule) + '\n}\n\n';
+        } else if (rule.type === CSSRule.MEDIA_RULE) {
+          cssText += '@media ' + rule.media.mediaText + ' {\n';
+          cssText += this.scopeRules(rule.cssRules, scopeSelector);
+          cssText += '\n}\n\n';
+        } else if (rule.cssText) {
+          cssText += rule.cssText + '\n\n';
+        }
+      }, this);
+    }
+    return cssText;
+  },
+  scopeSelector: function(selector, scopeSelector, strict) {
+    var r = [], parts = selector.split(',');
+    parts.forEach(function(p) {
+      p = p.trim();
+      if (this.selectorNeedsScoping(p, scopeSelector)) {
+        p = (strict && !p.match(polyfillHostNoCombinator)) ? 
+            this.applyStrictSelectorScope(p, scopeSelector) :
+            this.applySimpleSelectorScope(p, scopeSelector);
+      }
+      r.push(p);
+    }, this);
+    return r.join(', ');
+  },
+  selectorNeedsScoping: function(selector, scopeSelector) {
+    var re = this.makeScopeMatcher(scopeSelector);
+    return !selector.match(re);
+  },
+  makeScopeMatcher: function(scopeSelector) {
+    scopeSelector = scopeSelector.replace(/\[/g, '\\[').replace(/\[/g, '\\]');
+    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');
+  },
+  // scope via name and [is=name]
+  applySimpleSelectorScope: function(selector, scopeSelector) {
+    if (selector.match(polyfillHostRe)) {
+      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);
+      return selector.replace(polyfillHostRe, scopeSelector + ' ');
+    } else {
+      return scopeSelector + ' ' + selector;
+    }
+  },
+  // return a selector with [name] suffix on each simple selector
+  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]
+  applyStrictSelectorScope: function(selector, scopeSelector) {
+    scopeSelector = scopeSelector.replace(/\[is=([^\]]*)\]/g, '$1');
+    var splits = [' ', '>', '+', '~'],
+      scoped = selector,
+      attrName = '[' + scopeSelector + ']';
+    splits.forEach(function(sep) {
+      var parts = scoped.split(sep);
+      scoped = parts.map(function(p) {
+        // remove :host since it should be unnecessary
+        var t = p.trim().replace(polyfillHostRe, '');
+        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {
+          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')
+        }
+        return p;
+      }).join(sep);
+    });
+    return scoped;
+  },
+  insertPolyfillHostInCssText: function(selector) {
+    return selector.replace(colonHostContextRe, polyfillHostContext).replace(
+        colonHostRe, polyfillHost);
+  },
+  propertiesFromRule: function(rule) {
+    var cssText = rule.style.cssText;
+    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content
+    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)
+    // don't replace attr rules
+    if (rule.style.content && !rule.style.content.match(/['"]+|attr/)) {
+      cssText = cssText.replace(/content:[^;]*;/g, 'content: \'' + 
+          rule.style.content + '\';');
+    }
+    // TODO(sorvell): we can workaround this issue here, but we need a list
+    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53
+    //
+    // inherit rules can be omitted from cssText
+    // TODO(sorvell): remove when Blink bug is fixed:
+    // https://code.google.com/p/chromium/issues/detail?id=358273
+    var style = rule.style;
+    for (var i in style) {
+      if (style[i] === 'initial') {
+        cssText += i + ': initial; ';
+      }
+    }
+    return cssText;
+  },
+  replaceTextInStyles: function(styles, action) {
+    if (styles && action) {
+      if (!(styles instanceof Array)) {
+        styles = [styles];
+      }
+      Array.prototype.forEach.call(styles, function(s) {
+        s.textContent = action.call(this, s.textContent);
+      }, this);
+    }
+  },
+  addCssToDocument: function(cssText, name) {
+    if (cssText.match('@import')) {
+      addOwnSheet(cssText, name);
+    } else {
+      addCssToDocument(cssText);
+    }
+  }
+};
+
+var selectorRe = /([^{]*)({[\s\S]*?})/gim,
+    cssCommentRe = /\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,
+    // TODO(sorvell): remove either content or comment
+    cssCommentNextSelectorRe = /\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,
+    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\:[\s]*'([^']*)'[^}]*}([^{]*?){/gim,
+    // TODO(sorvell): remove either content or comment
+    cssCommentRuleRe = /\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
+    cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,
+    // TODO(sorvell): remove either content or comment
+    cssCommentUnscopedRuleRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
+    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,
+    cssPseudoRe = /::(x-[^\s{,(]*)/gim,
+    cssPartRe = /::part\(([^)]*)\)/gim,
+    // note: :host pre-processed to -shadowcsshost.
+    polyfillHost = '-shadowcsshost',
+    // note: :host-context pre-processed to -shadowcsshostcontext.
+    polyfillHostContext = '-shadowcsscontext',
+    parenSuffix = ')(?:\\((' +
+        '(?:\\([^)(]*\\)|[^)(]*)+?' +
+        ')\\))?([^,{]*)';
+    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),
+    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),
+    selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$',
+    colonHostRe = /\:host/gim,
+    colonHostContextRe = /\:host-context/gim,
+    /* host name without combinator */
+    polyfillHostNoCombinator = polyfillHost + '-no-combinator',
+    polyfillHostRe = new RegExp(polyfillHost, 'gim'),
+    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),
+    combinatorsRe = [
+      /\^\^/g,
+      /\^/g,
+      /\/shadow\//g,
+      /\/shadow-deep\//g,
+      /::shadow/g,
+      /\/deep\//g
+    ];
+
+function stylesToCssText(styles, preserveComments) {
+  var cssText = '';
+  Array.prototype.forEach.call(styles, function(s) {
+    cssText += s.textContent + '\n\n';
+  });
+  // strip comments for easier processing
+  if (!preserveComments) {
+    cssText = cssText.replace(cssCommentRe, '');
+  }
+  return cssText;
+}
+
+function cssTextToStyle(cssText) {
+  var style = document.createElement('style');
+  style.textContent = cssText;
+  return style;
+}
+
+function cssToRules(cssText) {
+  var style = cssTextToStyle(cssText);
+  document.head.appendChild(style);
+  var rules = [];
+  if (style.sheet) {
+    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet
+    // with an @import
+    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013
+    try {
+      rules = style.sheet.cssRules;
+    } catch(e) {
+      //
+    }
+  } else {
+    console.warn('sheet not found', style);
+  }
+  style.parentNode.removeChild(style);
+  return rules;
+}
+
+var frame = document.createElement('iframe');
+frame.style.display = 'none';
+
+function initFrame() {
+  frame.initialized = true;
+  document.body.appendChild(frame);
+  var doc = frame.contentDocument;
+  var base = doc.createElement('base');
+  base.href = document.baseURI;
+  doc.head.appendChild(base);
+}
+
+function inFrame(fn) {
+  if (!frame.initialized) {
+    initFrame();
+  }
+  document.body.appendChild(frame);
+  fn(frame.contentDocument);
+  document.body.removeChild(frame);
+}
+
+// TODO(sorvell): use an iframe if the cssText contains an @import to workaround
+// https://code.google.com/p/chromium/issues/detail?id=345114
+var isChrome = navigator.userAgent.match('Chrome');
+function withCssRules(cssText, callback) {
+  if (!callback) {
+    return;
+  }
+  var rules;
+  if (cssText.match('@import') && isChrome) {
+    var style = cssTextToStyle(cssText);
+    inFrame(function(doc) {
+      doc.head.appendChild(style.impl);
+      rules = style.sheet.cssRules;
+      callback(rules);
+    });
+  } else {
+    rules = cssToRules(cssText);
+    callback(rules);
+  }
+}
+
+function rulesToCss(cssRules) {
+  for (var i=0, css=[]; i < cssRules.length; i++) {
+    css.push(cssRules[i].cssText);
+  }
+  return css.join('\n\n');
+}
+
+function addCssToDocument(cssText) {
+  if (cssText) {
+    getSheet().appendChild(document.createTextNode(cssText));
+  }
+}
+
+function addOwnSheet(cssText, name) {
+  var style = cssTextToStyle(cssText);
+  style.setAttribute(name, '');
+  style.setAttribute(SHIMMED_ATTRIBUTE, '');
+  document.head.appendChild(style);
+}
+
+var SHIM_ATTRIBUTE = 'shim-shadowdom';
+var SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';
+var NO_SHIM_ATTRIBUTE = 'no-shim';
+
+var sheet;
+function getSheet() {
+  if (!sheet) {
+    sheet = document.createElement("style");
+    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');
+    sheet[SHIMMED_ATTRIBUTE] = true;
+  }
+  return sheet;
+}
+
+// add polyfill stylesheet to document
+if (window.ShadowDOMPolyfill) {
+  addCssToDocument('style { display: none !important; }\n');
+  var doc = wrap(document);
+  var head = doc.querySelector('head');
+  head.insertBefore(getSheet(), head.childNodes[0]);
+
+  // TODO(sorvell): monkey-patching HTMLImports is abusive;
+  // consider a better solution.
+  document.addEventListener('DOMContentLoaded', function() {
+    var urlResolver = scope.urlResolver;
+    
+    if (window.HTMLImports && !HTMLImports.useNative) {
+      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +
+          '[' + SHIM_ATTRIBUTE + ']';
+      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';
+      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;
+      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;
+
+      HTMLImports.parser.documentSelectors = [
+        HTMLImports.parser.documentSelectors,
+        SHIM_SHEET_SELECTOR,
+        SHIM_STYLE_SELECTOR
+      ].join(',');
+  
+      var originalParseGeneric = HTMLImports.parser.parseGeneric;
+
+      HTMLImports.parser.parseGeneric = function(elt) {
+        if (elt[SHIMMED_ATTRIBUTE]) {
+          return;
+        }
+        var style = elt.__importElement || elt;
+        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {
+          originalParseGeneric.call(this, elt);
+          return;
+        }
+        if (elt.__resource) {
+          style = elt.ownerDocument.createElement('style');
+          style.textContent = urlResolver.resolveCssText(
+              elt.__resource, elt.href);
+        } else {
+          urlResolver.resolveStyle(style);  
+        }
+        style.textContent = ShadowCSS.shimStyle(style);
+        style.removeAttribute(SHIM_ATTRIBUTE, '');
+        style.setAttribute(SHIMMED_ATTRIBUTE, '');
+        style[SHIMMED_ATTRIBUTE] = true;
+        // place in document
+        if (style.parentNode !== head) {
+          // replace links in head
+          if (elt.parentNode === head) {
+            head.replaceChild(style, elt);
+          } else {
+            head.appendChild(style);
+          }
+        }
+        style.__importParsed = true;
+        this.markParsingComplete(elt);
+      }
+
+      var hasResource = HTMLImports.parser.hasResource;
+      HTMLImports.parser.hasResource = function(node) {
+        if (node.localName === 'link' && node.rel === 'stylesheet' &&
+            node.hasAttribute(SHIM_ATTRIBUTE)) {
+          return (node.__resource);
+        } else {
+          return hasResource.call(this, node);
+        }
+      }
+
+    }
+  });
+}
+
+// exports
+scope.ShadowCSS = ShadowCSS;
+
+})(window.Platform);
+} else {
+/*
+ * 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() {
+
+  // poor man's adapter for template.content on various platform scenarios
+  window.templateContent = window.templateContent || function(inTemplate) {
+    return inTemplate.content;
+  };
+
+  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill
+
+  window.wrap = window.unwrap = function(n){
+    return n;
+  }
+  
+  addEventListener('DOMContentLoaded', function() {
+    if (CustomElements.useNative === false) {
+      var originalCreateShadowRoot = Element.prototype.createShadowRoot;
+      Element.prototype.createShadowRoot = function() {
+        var root = originalCreateShadowRoot.call(this);
+        CustomElements.watchShadow(this);
+        return root;
+      };
+    }
+  });
+  
+  window.templateContent = function(inTemplate) {
+    // if MDV exists, it may need to boostrap this template to reveal content
+    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
+      HTMLTemplateElement.bootstrap(inTemplate);
+    }
+    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no
+    // native template support
+    if (!inTemplate.content && !inTemplate._content) {
+      var frag = document.createDocumentFragment();
+      while (inTemplate.firstChild) {
+        frag.appendChild(inTemplate.firstChild);
+      }
+      inTemplate._content = frag;
+    }
+    return inTemplate.content || inTemplate._content;
+  };
+
+})();
+}
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+(function(scope) {
+  'use strict';
+
+  // feature detect for URL constructor
+  var hasWorkingUrl = false;
+  if (!scope.forceJURL) {
+    try {
+      var u = new URL('b', 'http://a');
+      hasWorkingUrl = u.href === 'http://a/b';
+    } catch(e) {}
+  }
+
+  if (hasWorkingUrl)
+    return;
+
+  var relative = Object.create(null);
+  relative['ftp'] = 21;
+  relative['file'] = 0;
+  relative['gopher'] = 70;
+  relative['http'] = 80;
+  relative['https'] = 443;
+  relative['ws'] = 80;
+  relative['wss'] = 443;
+
+  var relativePathDotMapping = Object.create(null);
+  relativePathDotMapping['%2e'] = '.';
+  relativePathDotMapping['.%2e'] = '..';
+  relativePathDotMapping['%2e.'] = '..';
+  relativePathDotMapping['%2e%2e'] = '..';
+
+  function isRelativeScheme(scheme) {
+    return relative[scheme] !== undefined;
+  }
+
+  function invalid() {
+    clear.call(this);
+    this._isInvalid = true;
+  }
+
+  function IDNAToASCII(h) {
+    if ('' == h) {
+      invalid.call(this)
+    }
+    // XXX
+    return h.toLowerCase()
+  }
+
+  function percentEscape(c) {
+    var unicode = c.charCodeAt(0);
+    if (unicode > 0x20 &&
+       unicode < 0x7F &&
+       // " # < > ? `
+       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1
+      ) {
+      return c;
+    }
+    return encodeURIComponent(c);
+  }
+
+  function percentEscapeQuery(c) {
+    // XXX This actually needs to encode c using encoding and then
+    // convert the bytes one-by-one.
+
+    var unicode = c.charCodeAt(0);
+    if (unicode > 0x20 &&
+       unicode < 0x7F &&
+       // " # < > ` (do not escape '?')
+       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1
+      ) {
+      return c;
+    }
+    return encodeURIComponent(c);
+  }
+
+  var EOF = undefined,
+      ALPHA = /[a-zA-Z]/,
+      ALPHANUMERIC = /[a-zA-Z0-9\+\-\.]/;
+
+  function parse(input, stateOverride, base) {
+    function err(message) {
+      errors.push(message)
+    }
+
+    var state = stateOverride || 'scheme start',
+        cursor = 0,
+        buffer = '',
+        seenAt = false,
+        seenBracket = false,
+        errors = [];
+
+    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {
+      var c = input[cursor];
+      switch (state) {
+        case 'scheme start':
+          if (c && ALPHA.test(c)) {
+            buffer += c.toLowerCase(); // ASCII-safe
+            state = 'scheme';
+          } else if (!stateOverride) {
+            buffer = '';
+            state = 'no scheme';
+            continue;
+          } else {
+            err('Invalid scheme.');
+            break loop;
+          }
+          break;
+
+        case 'scheme':
+          if (c && ALPHANUMERIC.test(c)) {
+            buffer += c.toLowerCase(); // ASCII-safe
+          } else if (':' == c) {
+            this._scheme = buffer;
+            buffer = '';
+            if (stateOverride) {
+              break loop;
+            }
+            if (isRelativeScheme(this._scheme)) {
+              this._isRelative = true;
+            }
+            if ('file' == this._scheme) {
+              state = 'relative';
+            } else if (this._isRelative && base && base._scheme == this._scheme) {
+              state = 'relative or authority';
+            } else if (this._isRelative) {
+              state = 'authority first slash';
+            } else {
+              state = 'scheme data';
+            }
+          } else if (!stateOverride) {
+            buffer = '';
+            cursor = 0;
+            state = 'no scheme';
+            continue;
+          } else if (EOF == c) {
+            break loop;
+          } else {
+            err('Code point not allowed in scheme: ' + c)
+            break loop;
+          }
+          break;
+
+        case 'scheme data':
+          if ('?' == c) {
+            query = '?';
+            state = 'query';
+          } else if ('#' == c) {
+            this._fragment = '#';
+            state = 'fragment';
+          } else {
+            // XXX error handling
+            if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
+              this._schemeData += percentEscape(c);
+            }
+          }
+          break;
+
+        case 'no scheme':
+          if (!base || !(isRelativeScheme(base._scheme))) {
+            err('Missing scheme.');
+            invalid.call(this);
+          } else {
+            state = 'relative';
+            continue;
+          }
+          break;
+
+        case 'relative or authority':
+          if ('/' == c && '/' == input[cursor+1]) {
+            state = 'authority ignore slashes';
+          } else {
+            err('Expected /, got: ' + c);
+            state = 'relative';
+            continue
+          }
+          break;
+
+        case 'relative':
+          this._isRelative = true;
+          if ('file' != this._scheme)
+            this._scheme = base._scheme;
+          if (EOF == c) {
+            this._host = base._host;
+            this._port = base._port;
+            this._path = base._path.slice();
+            this._query = base._query;
+            break loop;
+          } else if ('/' == c || '\\' == c) {
+            if ('\\' == c)
+              err('\\ is an invalid code point.');
+            state = 'relative slash';
+          } else if ('?' == c) {
+            this._host = base._host;
+            this._port = base._port;
+            this._path = base._path.slice();
+            this._query = '?';
+            state = 'query';
+          } else if ('#' == c) {
+            this._host = base._host;
+            this._port = base._port;
+            this._path = base._path.slice();
+            this._query = base._query;
+            this._fragment = '#';
+            state = 'fragment';
+          } else {
+            var nextC = input[cursor+1]
+            var nextNextC = input[cursor+2]
+            if (
+              'file' != this._scheme || !ALPHA.test(c) ||
+              (nextC != ':' && nextC != '|') ||
+              (EOF != nextNextC && '/' != nextNextC && '\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {
+              this._host = base._host;
+              this._port = base._port;
+              this._path = base._path.slice();
+              this._path.pop();
+            }
+            state = 'relative path';
+            continue;
+          }
+          break;
+
+        case 'relative slash':
+          if ('/' == c || '\\' == c) {
+            if ('\\' == c) {
+              err('\\ is an invalid code point.');
+            }
+            if ('file' == this._scheme) {
+              state = 'file host';
+            } else {
+              state = 'authority ignore slashes';
+            }
+          } else {
+            if ('file' != this._scheme) {
+              this._host = base._host;
+              this._port = base._port;
+            }
+            state = 'relative path';
+            continue;
+          }
+          break;
+
+        case 'authority first slash':
+          if ('/' == c) {
+            state = 'authority second slash';
+          } else {
+            err("Expected '/', got: " + c);
+            state = 'authority ignore slashes';
+            continue;
+          }
+          break;
+
+        case 'authority second slash':
+          state = 'authority ignore slashes';
+          if ('/' != c) {
+            err("Expected '/', got: " + c);
+            continue;
+          }
+          break;
+
+        case 'authority ignore slashes':
+          if ('/' != c && '\\' != c) {
+            state = 'authority';
+            continue;
+          } else {
+            err('Expected authority, got: ' + c);
+          }
+          break;
+
+        case 'authority':
+          if ('@' == c) {
+            if (seenAt) {
+              err('@ already seen.');
+              buffer += '%40';
+            }
+            seenAt = true;
+            for (var i = 0; i < buffer.length; i++) {
+              var cp = buffer[i];
+              if ('\t' == cp || '\n' == cp || '\r' == cp) {
+                err('Invalid whitespace in authority.');
+                continue;
+              }
+              // XXX check URL code points
+              if (':' == cp && null === this._password) {
+                this._password = '';
+                continue;
+              }
+              var tempC = percentEscape(cp);
+              (null !== this._password) ? this._password += tempC : this._username += tempC;
+            }
+            buffer = '';
+          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
+            cursor -= buffer.length;
+            buffer = '';
+            state = 'host';
+            continue;
+          } else {
+            buffer += c;
+          }
+          break;
+
+        case 'file host':
+          if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
+            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {
+              state = 'relative path';
+            } else if (buffer.length == 0) {
+              state = 'relative path start';
+            } else {
+              this._host = IDNAToASCII.call(this, buffer);
+              buffer = '';
+              state = 'relative path start';
+            }
+            continue;
+          } else if ('\t' == c || '\n' == c || '\r' == c) {
+            err('Invalid whitespace in file host.');
+          } else {
+            buffer += c;
+          }
+          break;
+
+        case 'host':
+        case 'hostname':
+          if (':' == c && !seenBracket) {
+            // XXX host parsing
+            this._host = IDNAToASCII.call(this, buffer);
+            buffer = '';
+            state = 'port';
+            if ('hostname' == stateOverride) {
+              break loop;
+            }
+          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c) {
+            this._host = IDNAToASCII.call(this, buffer);
+            buffer = '';
+            state = 'relative path start';
+            if (stateOverride) {
+              break loop;
+            }
+            continue;
+          } else if ('\t' != c && '\n' != c && '\r' != c) {
+            if ('[' == c) {
+              seenBracket = true;
+            } else if (']' == c) {
+              seenBracket = false;
+            }
+            buffer += c;
+          } else {
+            err('Invalid code point in host/hostname: ' + c);
+          }
+          break;
+
+        case 'port':
+          if (/[0-9]/.test(c)) {
+            buffer += c;
+          } else if (EOF == c || '/' == c || '\\' == c || '?' == c || '#' == c || stateOverride) {
+            if ('' != buffer) {
+              var temp = parseInt(buffer, 10);
+              if (temp != relative[this._scheme]) {
+                this._port = temp + '';
+              }
+              buffer = '';
+            }
+            if (stateOverride) {
+              break loop;
+            }
+            state = 'relative path start';
+            continue;
+          } else if ('\t' == c || '\n' == c || '\r' == c) {
+            err('Invalid code point in port: ' + c);
+          } else {
+            invalid.call(this);
+          }
+          break;
+
+        case 'relative path start':
+          if ('\\' == c)
+            err("'\\' not allowed in path.");
+          state = 'relative path';
+          if ('/' != c && '\\' != c) {
+            continue;
+          }
+          break;
+
+        case 'relative path':
+          if (EOF == c || '/' == c || '\\' == c || (!stateOverride && ('?' == c || '#' == c))) {
+            if ('\\' == c) {
+              err('\\ not allowed in relative path.');
+            }
+            var tmp;
+            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {
+              buffer = tmp;
+            }
+            if ('..' == buffer) {
+              this._path.pop();
+              if ('/' != c && '\\' != c) {
+                this._path.push('');
+              }
+            } else if ('.' == buffer && '/' != c && '\\' != c) {
+              this._path.push('');
+            } else if ('.' != buffer) {
+              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {
+                buffer = buffer[0] + ':';
+              }
+              this._path.push(buffer);
+            }
+            buffer = '';
+            if ('?' == c) {
+              this._query = '?';
+              state = 'query';
+            } else if ('#' == c) {
+              this._fragment = '#';
+              state = 'fragment';
+            }
+          } else if ('\t' != c && '\n' != c && '\r' != c) {
+            buffer += percentEscape(c);
+          }
+          break;
+
+        case 'query':
+          if (!stateOverride && '#' == c) {
+            this._fragment = '#';
+            state = 'fragment';
+          } else if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
+            this._query += percentEscapeQuery(c);
+          }
+          break;
+
+        case 'fragment':
+          if (EOF != c && '\t' != c && '\n' != c && '\r' != c) {
+            this._fragment += c;
+          }
+          break;
+      }
+
+      cursor++;
+    }
+  }
+
+  function clear() {
+    this._scheme = '';
+    this._schemeData = '';
+    this._username = '';
+    this._password = null;
+    this._host = '';
+    this._port = '';
+    this._path = [];
+    this._query = '';
+    this._fragment = '';
+    this._isInvalid = false;
+    this._isRelative = false;
+  }
+
+  // Does not process domain names or IP addresses.
+  // Does not handle encoding for the query parameter.
+  function jURL(url, base /* , encoding */) {
+    if (base !== undefined && !(base instanceof jURL))
+      base = new jURL(String(base));
+
+    this._url = url;
+    clear.call(this);
+
+    var input = url.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g, '');
+    // encoding = encoding || 'utf-8'
+
+    parse.call(this, input, null, base);
+  }
+
+  jURL.prototype = {
+    get href() {
+      if (this._isInvalid)
+        return this._url;
+
+      var authority = '';
+      if ('' != this._username || null != this._password) {
+        authority = this._username +
+            (null != this._password ? ':' + this._password : '') + '@';
+      }
+
+      return this.protocol +
+          (this._isRelative ? '//' + authority + this.host : '') +
+          this.pathname + this._query + this._fragment;
+    },
+    set href(href) {
+      clear.call(this);
+      parse.call(this, href);
+    },
+
+    get protocol() {
+      return this._scheme + ':';
+    },
+    set protocol(protocol) {
+      if (this._isInvalid)
+        return;
+      parse.call(this, protocol + ':', 'scheme start');
+    },
+
+    get host() {
+      return this._isInvalid ? '' : this._port ?
+          this._host + ':' + this._port : this._host;
+    },
+    set host(host) {
+      if (this._isInvalid || !this._isRelative)
+        return;
+      parse.call(this, host, 'host');
+    },
+
+    get hostname() {
+      return this._host;
+    },
+    set hostname(hostname) {
+      if (this._isInvalid || !this._isRelative)
+        return;
+      parse.call(this, hostname, 'hostname');
+    },
+
+    get port() {
+      return this._port;
+    },
+    set port(port) {
+      if (this._isInvalid || !this._isRelative)
+        return;
+      parse.call(this, port, 'port');
+    },
+
+    get pathname() {
+      return this._isInvalid ? '' : this._isRelative ?
+          '/' + this._path.join('/') : this._schemeData;
+    },
+    set pathname(pathname) {
+      if (this._isInvalid || !this._isRelative)
+        return;
+      this._path = [];
+      parse.call(this, pathname, 'relative path start');
+    },
+
+    get search() {
+      return this._isInvalid || !this._query || '?' == this._query ?
+          '' : this._query;
+    },
+    set search(search) {
+      if (this._isInvalid || !this._isRelative)
+        return;
+      this._query = '?';
+      if ('?' == search[0])
+        search = search.slice(1);
+      parse.call(this, search, 'query');
+    },
+
+    get hash() {
+      return this._isInvalid || !this._fragment || '#' == this._fragment ?
+          '' : this._fragment;
+    },
+    set hash(hash) {
+      if (this._isInvalid)
+        return;
+      this._fragment = '#';
+      if ('#' == hash[0])
+        hash = hash.slice(1);
+      parse.call(this, hash, 'fragment');
+    }
+  };
+
+  scope.URL = jURL;
+
+})(window);
+
+/*
+ * 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) {
+
+// Old versions of iOS do not have bind.
+
+if (!Function.prototype.bind) {
+  Function.prototype.bind = function(scope) {
+    var self = this;
+    var args = Array.prototype.slice.call(arguments, 1);
+    return function() {
+      var args2 = args.slice();
+      args2.push.apply(args2, arguments);
+      return self.apply(scope, args2);
+    };
+  };
+}
+
+// mixin
+
+// copy all properties from inProps (et al) to inObj
+function mixin(inObj/*, inProps, inMoreProps, ...*/) {
+  var obj = inObj || {};
+  for (var i = 1; i < arguments.length; i++) {
+    var p = arguments[i];
+    try {
+      for (var n in p) {
+        copyProperty(n, p, obj);
+      }
+    } catch(x) {
+    }
+  }
+  return obj;
+}
+
+// copy property inName from inSource object to inTarget object
+function copyProperty(inName, inSource, inTarget) {
+  var pd = getPropertyDescriptor(inSource, inName);
+  Object.defineProperty(inTarget, inName, pd);
+}
+
+// get property descriptor for inName on inObject, even if
+// inName exists on some link in inObject's prototype chain
+function getPropertyDescriptor(inObject, inName) {
+  if (inObject) {
+    var pd = Object.getOwnPropertyDescriptor(inObject, inName);
+    return pd || getPropertyDescriptor(Object.getPrototypeOf(inObject), inName);
+  }
+}
+
+// export
+
+scope.mixin = mixin;
+
+})(window.Platform);
+// Copyright 2011 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+(function(scope) {
+
+  'use strict';
+
+  // polyfill DOMTokenList
+  // * add/remove: allow these methods to take multiple classNames
+  // * toggle: add a 2nd argument which forces the given state rather
+  //  than toggling.
+
+  var add = DOMTokenList.prototype.add;
+  var remove = DOMTokenList.prototype.remove;
+  DOMTokenList.prototype.add = function() {
+    for (var i = 0; i < arguments.length; i++) {
+      add.call(this, arguments[i]);
+    }
+  };
+  DOMTokenList.prototype.remove = function() {
+    for (var i = 0; i < arguments.length; i++) {
+      remove.call(this, arguments[i]);
+    }
+  };
+  DOMTokenList.prototype.toggle = function(name, bool) {
+    if (arguments.length == 1) {
+      bool = !this.contains(name);
+    }
+    bool ? this.add(name) : this.remove(name);
+  };
+  DOMTokenList.prototype.switch = function(oldName, newName) {
+    oldName && this.remove(oldName);
+    newName && this.add(newName);
+  };
+
+  // add array() to NodeList, NamedNodeMap, HTMLCollection
+
+  var ArraySlice = function() {
+    return Array.prototype.slice.call(this);
+  };
+
+  var namedNodeMap = (window.NamedNodeMap || window.MozNamedAttrMap || {});
+
+  NodeList.prototype.array = ArraySlice;
+  namedNodeMap.prototype.array = ArraySlice;
+  HTMLCollection.prototype.array = ArraySlice;
+
+  // polyfill performance.now
+
+  if (!window.performance) {
+    var start = Date.now();
+    // only at millisecond precision
+    window.performance = {now: function(){ return Date.now() - start }};
+  }
+
+  // polyfill for requestAnimationFrame
+
+  if (!window.requestAnimationFrame) {
+    window.requestAnimationFrame = (function() {
+      var nativeRaf = window.webkitRequestAnimationFrame ||
+        window.mozRequestAnimationFrame;
+
+      return nativeRaf ?
+        function(callback) {
+          return nativeRaf(function() {
+            callback(performance.now());
+          });
+        } :
+        function( callback ){
+          return window.setTimeout(callback, 1000 / 60);
+        };
+    })();
+  }
+
+  if (!window.cancelAnimationFrame) {
+    window.cancelAnimationFrame = (function() {
+      return  window.webkitCancelAnimationFrame ||
+        window.mozCancelAnimationFrame ||
+        function(id) {
+          clearTimeout(id);
+        };
+    })();
+  }
+
+  // utility
+
+  function createDOM(inTagOrNode, inHTML, inAttrs) {
+    var dom = typeof inTagOrNode == 'string' ?
+        document.createElement(inTagOrNode) : inTagOrNode.cloneNode(true);
+    dom.innerHTML = inHTML;
+    if (inAttrs) {
+      for (var n in inAttrs) {
+        dom.setAttribute(n, inAttrs[n]);
+      }
+    }
+    return dom;
+  }
+  // Make a stub for Polymer() for polyfill purposes; under the HTMLImports
+  // polyfill, scripts in the main document run before imports. That means
+  // if (1) polymer is imported and (2) Polymer() is called in the main document
+  // in a script after the import, 2 occurs before 1. We correct this here
+  // by specfiically patching Polymer(); this is not necessary under native
+  // HTMLImports.
+  var elementDeclarations = [];
+
+  var polymerStub = function(name, dictionary) {
+    elementDeclarations.push(arguments);
+  }
+  window.Polymer = polymerStub;
+
+  // deliver queued delcarations
+  scope.deliverDeclarations = function() {
+    scope.deliverDeclarations = function() {
+     throw 'Possible attempt to load Polymer twice';
+    };
+    return elementDeclarations;
+  }
+
+  // Once DOMContent has loaded, any main document scripts that depend on
+  // Polymer() should have run. Calling Polymer() now is an error until
+  // polymer is imported.
+  window.addEventListener('DOMContentLoaded', function() {
+    if (window.Polymer === polymerStub) {
+      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">');
+      };
+    }
+  });
+
+  // exports
+  scope.createDOM = createDOM;
+
+})(window.Platform);
+
+/*
+ * 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.
+ */
+
+// poor man's adapter for template.content on various platform scenarios
+window.templateContent = window.templateContent || function(inTemplate) {
+  return inTemplate.content;
+};
+(function(scope) {
+  
+  scope = scope || (window.Inspector = {});
+  
+  var inspector;
+
+  window.sinspect = function(inNode, inProxy) {
+    if (!inspector) {
+      inspector = window.open('', 'ShadowDOM Inspector', null, true);
+      inspector.document.write(inspectorHTML);
+      //inspector.document.close();
+      inspector.api = {
+        shadowize: shadowize
+      };
+    }
+    inspect(inNode || wrap(document.body), inProxy);
+  };
+
+  var inspectorHTML = [
+    '<!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');
+  
+  var crumbs = [];
+
+  var displayCrumbs = function() {
+    // alias our document
+    var d = inspector.document;
+    // get crumbbar
+    var cb = d.querySelector('#crumbs');
+    // clear crumbs
+    cb.textContent = '';
+    // build new crumbs
+    for (var i=0, c; c=crumbs[i]; i++) {
+      var a = d.createElement('a');
+      a.href = '#';
+      a.textContent = c.localName;
+      a.idx = i;
+      a.onclick = function(event) {
+        var c;
+        while (crumbs.length > this.idx) {
+          c = crumbs.pop();
+        }
+        inspect(c.shadow || c, c);
+        event.preventDefault();
+      };
+      cb.appendChild(d.createElement('li')).appendChild(a);
+    }
+  };
+
+  var inspect = function(inNode, inProxy) {
+    // alias our document
+    var d = inspector.document;
+    // reset list of drillable nodes
+    drillable = [];
+    // memoize our crumb proxy
+    var proxy = inProxy || inNode;
+    crumbs.push(proxy);
+    // update crumbs
+    displayCrumbs();
+    // reflect local tree
+    d.body.querySelector('#tree').innerHTML =
+        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';
+  };
+
+  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
+
+  var blacklisted = {STYLE:1, SCRIPT:1, "#comment": 1, TEMPLATE: 1};
+  var blacklist = function(inNode) {
+    return blacklisted[inNode.nodeName];
+  };
+
+  var output = function(inNode, inChildNodes, inIndent) {
+    if (blacklist(inNode)) {
+      return '';
+    }
+    var indent = inIndent || '';
+    if (inNode.localName || inNode.nodeType == 11) {
+      var name = inNode.localName || 'shadow-root';
+      //inChildNodes = ShadowDOM.localNodes(inNode);
+      var info = indent + describe(inNode);
+      // if only textNodes
+      // TODO(sjmiles): make correct for ShadowDOM
+      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {
+        info += catTextContent(inChildNodes);
+      } else*/ {
+        // TODO(sjmiles): native <shadow> has no reference to its projection
+        if (name == 'content' /*|| name == 'shadow'*/) {
+          inChildNodes = inNode.getDistributedNodes();
+        }
+        info += '<br/>';
+        var ind = indent + '&nbsp;&nbsp;';
+        forEach(inChildNodes, function(n) {
+          info += output(n, n.childNodes, ind);
+        });
+        info += indent;
+      }
+      if (!({br:1}[name])) {
+        info += '<tag>&lt;/' + name + '&gt;</tag>';
+        info += '<br/>';
+      }
+    } else {
+      var text = inNode.textContent.trim();
+      info = text ? indent + '"' + text + '"' + '<br/>' : '';
+    }
+    return info;
+  };
+
+  var catTextContent = function(inChildNodes) {
+    var info = '';
+    forEach(inChildNodes, function(n) {
+      info += n.textContent.trim();
+    });
+    return info;
+  };
+
+  var drillable = [];
+
+  var describe = function(inNode) {
+    var tag = '<tag>' + '&lt;';
+    var name = inNode.localName || 'shadow-root';
+    if (inNode.webkitShadowRoot || inNode.shadowRoot) {
+      tag += ' <button idx="' + drillable.length +
+        '" onclick="api.shadowize.call(this)">' + name + '</button>';
+      drillable.push(inNode);
+    } else {
+      tag += name || 'shadow-root';
+    }
+    if (inNode.attributes) {
+      forEach(inNode.attributes, function(a) {
+        tag += ' ' + a.name + (a.value ? '="' + a.value + '"' : '');
+      });
+    }
+    tag += '&gt;'+ '</tag>';
+    return tag;
+  };
+
+  // remote api
+
+  shadowize = function() {
+    var idx = Number(this.attributes.idx.value);
+    //alert(idx);
+    var node = drillable[idx];
+    if (node) {
+      inspect(node.webkitShadowRoot || node.shadowRoot, node)
+    } else {
+      console.log("bad shadowize node");
+      console.dir(this);
+    }
+  };
+  
+  // export
+  
+  scope.output = output;
+  
+})(window.Inspector);
+
+
+
+/*
+ * 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) {
+
+  // TODO(sorvell): It's desireable to provide a default stylesheet 
+  // that's convenient for styling unresolved elements, but
+  // it's cumbersome to have to include this manually in every page.
+  // It would make sense to put inside some HTMLImport but 
+  // the HTMLImports polyfill does not allow loading of stylesheets 
+  // that block rendering. Therefore this injection is tolerated here.
+
+  var style = document.createElement('style');
+  style.textContent = ''
+      + 'body {'
+      + 'transition: opacity ease-in 0.2s;' 
+      + ' } \n'
+      + 'body[unresolved] {'
+      + 'opacity: 0; display: block; overflow: hidden;' 
+      + ' } \n'
+      ;
+  var head = document.querySelector('head');
+  head.insertBefore(style, head.firstChild);
+
+})(Platform);
+
+(function(scope) {
+
+  function withDependencies(task, depends) {
+    depends = depends || [];
+    if (!depends.map) {
+      depends = [depends];
+    }
+    return task.apply(this, depends.map(marshal));
+  }
+
+  function module(name, dependsOrFactory, moduleFactory) {
+    var module;
+    switch (arguments.length) {
+      case 0:
+        return;
+      case 1:
+        module = null;
+        break;
+      case 2:
+        module = dependsOrFactory.apply(this);
+        break;
+      default:
+        module = withDependencies(moduleFactory, dependsOrFactory);
+        break;
+    }
+    modules[name] = module;
+  };
+
+  function marshal(name) {
+    return modules[name];
+  }
+
+  var modules = {};
+
+  function using(depends, task) {
+    HTMLImports.whenImportsReady(function() {
+      withDependencies(task, depends);
+    });
+  };
+
+  // exports
+
+  scope.marshal = marshal;
+  scope.module = module;
+  scope.using = using;
+
+})(window);
+/*
+ * 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 iterations = 0;
+var callbacks = [];
+var twiddle = document.createTextNode('');
+
+function endOfMicrotask(callback) {
+  twiddle.textContent = iterations++;
+  callbacks.push(callback);
+}
+
+function atEndOfMicrotask() {
+  while (callbacks.length) {
+    callbacks.shift()();
+  }
+}
+
+new (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)
+  .observe(twiddle, {characterData: true})
+  ;
+
+// exports
+
+scope.endOfMicrotask = endOfMicrotask;
+
+})(Platform);
+
+
+/*
+ * 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 urlResolver = {
+  resolveDom: function(root, url) {
+    url = url || root.ownerDocument.baseURI;
+    this.resolveAttributes(root, url);
+    this.resolveStyles(root, url);
+    // handle template.content
+    var templates = root.querySelectorAll('template');
+    if (templates) {
+      for (var i = 0, l = templates.length, t; (i < l) && (t = templates[i]); i++) {
+        if (t.content) {
+          this.resolveDom(t.content, url);
+        }
+      }
+    }
+  },
+  resolveTemplate: function(template) {
+    this.resolveDom(template.content, template.ownerDocument.baseURI);
+  },
+  resolveStyles: function(root, url) {
+    var styles = root.querySelectorAll('style');
+    if (styles) {
+      for (var i = 0, l = styles.length, s; (i < l) && (s = styles[i]); i++) {
+        this.resolveStyle(s, url);
+      }
+    }
+  },
+  resolveStyle: function(style, url) {
+    url = url || style.ownerDocument.baseURI;
+    style.textContent = this.resolveCssText(style.textContent, url);
+  },
+  resolveCssText: function(cssText, baseUrl) {
+    cssText = replaceUrlsInCssText(cssText, baseUrl, CSS_URL_REGEXP);
+    return replaceUrlsInCssText(cssText, baseUrl, CSS_IMPORT_REGEXP);
+  },
+  resolveAttributes: function(root, url) {
+    if (root.hasAttributes && root.hasAttributes()) {
+      this.resolveElementAttributes(root, url);
+    }
+    // search for attributes that host urls
+    var nodes = root && root.querySelectorAll(URL_ATTRS_SELECTOR);
+    if (nodes) {
+      for (var i = 0, l = nodes.length, n; (i < l) && (n = nodes[i]); i++) {
+        this.resolveElementAttributes(n, url);
+      }
+    }
+  },
+  resolveElementAttributes: function(node, url) {
+    url = url || node.ownerDocument.baseURI;
+    URL_ATTRS.forEach(function(v) {
+      var attr = node.attributes[v];
+      if (attr && attr.value &&
+         (attr.value.search(URL_TEMPLATE_SEARCH) < 0)) {
+        var urlPath = resolveRelativeUrl(url, attr.value);
+        attr.value = urlPath;
+      }
+    });
+  }
+};
+
+var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
+var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
+var URL_ATTRS = ['href', 'src', 'action'];
+var URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';
+var URL_TEMPLATE_SEARCH = '{{.*}}';
+
+function replaceUrlsInCssText(cssText, baseUrl, regexp) {
+  return cssText.replace(regexp, function(m, pre, url, post) {
+    var urlPath = url.replace(/["']/g, '');
+    urlPath = resolveRelativeUrl(baseUrl, urlPath);
+    return pre + '\'' + urlPath + '\'' + post;
+  });
+}
+
+function resolveRelativeUrl(baseUrl, url) {
+  var u = new URL(url, baseUrl);
+  return makeDocumentRelPath(u.href);
+}
+
+function makeDocumentRelPath(url) {
+  var root = document.baseURI;
+  var u = new URL(url, root);
+  if (u.host === root.host && u.port === root.port &&
+      u.protocol === root.protocol) {
+    return makeRelPath(root.pathname, u.pathname);
+  } else {
+    return url;
+  }
+}
+
+// make a relative path from source to target
+function makeRelPath(source, target) {
+  var s = source.split('/');
+  var t = target.split('/');
+  while (s.length && s[0] === t[0]){
+    s.shift();
+    t.shift();
+  }
+  for (var i = 0, l = s.length - 1; i < l; i++) {
+    t.unshift('..');
+  }
+  return t.join('/');
+}
+
+// exports
+scope.urlResolver = urlResolver;
+
+})(Platform);
+
+/*
+ * Copyright 2012 The Polymer Authors. All rights reserved.
+ * Use of this source code is goverened by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+(function(global) {
+
+  var registrationsTable = new WeakMap();
+
+  // We use setImmediate or postMessage for our future callback.
+  var setImmediate = window.msSetImmediate;
+
+  // Use post message to emulate setImmediate.
+  if (!setImmediate) {
+    var setImmediateQueue = [];
+    var sentinel = String(Math.random());
+    window.addEventListener('message', function(e) {
+      if (e.data === sentinel) {
+        var queue = setImmediateQueue;
+        setImmediateQueue = [];
+        queue.forEach(function(func) {
+          func();
+        });
+      }
+    });
+    setImmediate = function(func) {
+      setImmediateQueue.push(func);
+      window.postMessage(sentinel, '*');
+    };
+  }
+
+  // This is used to ensure that we never schedule 2 callas to setImmediate
+  var isScheduled = false;
+
+  // Keep track of observers that needs to be notified next time.
+  var scheduledObservers = [];
+
+  /**
+   * Schedules |dispatchCallback| to be called in the future.
+   * @param {MutationObserver} observer
+   */
+  function scheduleCallback(observer) {
+    scheduledObservers.push(observer);
+    if (!isScheduled) {
+      isScheduled = true;
+      setImmediate(dispatchCallbacks);
+    }
+  }
+
+  function wrapIfNeeded(node) {
+    return window.ShadowDOMPolyfill &&
+        window.ShadowDOMPolyfill.wrapIfNeeded(node) ||
+        node;
+  }
+
+  function dispatchCallbacks() {
+    // http://dom.spec.whatwg.org/#mutation-observers
+
+    isScheduled = false; // Used to allow a new setImmediate call above.
+
+    var observers = scheduledObservers;
+    scheduledObservers = [];
+    // Sort observers based on their creation UID (incremental).
+    observers.sort(function(o1, o2) {
+      return o1.uid_ - o2.uid_;
+    });
+
+    var anyNonEmpty = false;
+    observers.forEach(function(observer) {
+
+      // 2.1, 2.2
+      var queue = observer.takeRecords();
+      // 2.3. Remove all transient registered observers whose observer is mo.
+      removeTransientObserversFor(observer);
+
+      // 2.4
+      if (queue.length) {
+        observer.callback_(queue, observer);
+        anyNonEmpty = true;
+      }
+    });
+
+    // 3.
+    if (anyNonEmpty)
+      dispatchCallbacks();
+  }
+
+  function removeTransientObserversFor(observer) {
+    observer.nodes_.forEach(function(node) {
+      var registrations = registrationsTable.get(node);
+      if (!registrations)
+        return;
+      registrations.forEach(function(registration) {
+        if (registration.observer === observer)
+          registration.removeTransientObservers();
+      });
+    });
+  }
+
+  /**
+   * This function is used for the "For each registered observer observer (with
+   * observer's options as options) in target's list of registered observers,
+   * run these substeps:" and the "For each ancestor ancestor of target, and for
+   * each registered observer observer (with options options) in ancestor's list
+   * of registered observers, run these substeps:" part of the algorithms. The
+   * |options.subtree| is checked to ensure that the callback is called
+   * correctly.
+   *
+   * @param {Node} target
+   * @param {function(MutationObserverInit):MutationRecord} callback
+   */
+  function forEachAncestorAndObserverEnqueueRecord(target, callback) {
+    for (var node = target; node; node = node.parentNode) {
+      var registrations = registrationsTable.get(node);
+
+      if (registrations) {
+        for (var j = 0; j < registrations.length; j++) {
+          var registration = registrations[j];
+          var options = registration.options;
+
+          // Only target ignores subtree.
+          if (node !== target && !options.subtree)
+            continue;
+
+          var record = callback(options);
+          if (record)
+            registration.enqueue(record);
+        }
+      }
+    }
+  }
+
+  var uidCounter = 0;
+
+  /**
+   * The class that maps to the DOM MutationObserver interface.
+   * @param {Function} callback.
+   * @constructor
+   */
+  function JsMutationObserver(callback) {
+    this.callback_ = callback;
+    this.nodes_ = [];
+    this.records_ = [];
+    this.uid_ = ++uidCounter;
+  }
+
+  JsMutationObserver.prototype = {
+    observe: function(target, options) {
+      target = wrapIfNeeded(target);
+
+      // 1.1
+      if (!options.childList && !options.attributes && !options.characterData ||
+
+          // 1.2
+          options.attributeOldValue && !options.attributes ||
+
+          // 1.3
+          options.attributeFilter && options.attributeFilter.length &&
+              !options.attributes ||
+
+          // 1.4
+          options.characterDataOldValue && !options.characterData) {
+
+        throw new SyntaxError();
+      }
+
+      var registrations = registrationsTable.get(target);
+      if (!registrations)
+        registrationsTable.set(target, registrations = []);
+
+      // 2
+      // If target's list of registered observers already includes a registered
+      // observer associated with the context object, replace that registered
+      // observer's options with options.
+      var registration;
+      for (var i = 0; i < registrations.length; i++) {
+        if (registrations[i].observer === this) {
+          registration = registrations[i];
+          registration.removeListeners();
+          registration.options = options;
+          break;
+        }
+      }
+
+      // 3.
+      // Otherwise, add a new registered observer to target's list of registered
+      // observers with the context object as the observer and options as the
+      // options, and add target to context object's list of nodes on which it
+      // is registered.
+      if (!registration) {
+        registration = new Registration(this, target, options);
+        registrations.push(registration);
+        this.nodes_.push(target);
+      }
+
+      registration.addListeners();
+    },
+
+    disconnect: function() {
+      this.nodes_.forEach(function(node) {
+        var registrations = registrationsTable.get(node);
+        for (var i = 0; i < registrations.length; i++) {
+          var registration = registrations[i];
+          if (registration.observer === this) {
+            registration.removeListeners();
+            registrations.splice(i, 1);
+            // Each node can only have one registered observer associated with
+            // this observer.
+            break;
+          }
+        }
+      }, this);
+      this.records_ = [];
+    },
+
+    takeRecords: function() {
+      var copyOfRecords = this.records_;
+      this.records_ = [];
+      return copyOfRecords;
+    }
+  };
+
+  /**
+   * @param {string} type
+   * @param {Node} target
+   * @constructor
+   */
+  function MutationRecord(type, target) {
+    this.type = type;
+    this.target = target;
+    this.addedNodes = [];
+    this.removedNodes = [];
+    this.previousSibling = null;
+    this.nextSibling = null;
+    this.attributeName = null;
+    this.attributeNamespace = null;
+    this.oldValue = null;
+  }
+
+  function copyMutationRecord(original) {
+    var record = new MutationRecord(original.type, original.target);
+    record.addedNodes = original.addedNodes.slice();
+    record.removedNodes = original.removedNodes.slice();
+    record.previousSibling = original.previousSibling;
+    record.nextSibling = original.nextSibling;
+    record.attributeName = original.attributeName;
+    record.attributeNamespace = original.attributeNamespace;
+    record.oldValue = original.oldValue;
+    return record;
+  };
+
+  // We keep track of the two (possibly one) records used in a single mutation.
+  var currentRecord, recordWithOldValue;
+
+  /**
+   * Creates a record without |oldValue| and caches it as |currentRecord| for
+   * later use.
+   * @param {string} oldValue
+   * @return {MutationRecord}
+   */
+  function getRecord(type, target) {
+    return currentRecord = new MutationRecord(type, target);
+  }
+
+  /**
+   * Gets or creates a record with |oldValue| based in the |currentRecord|
+   * @param {string} oldValue
+   * @return {MutationRecord}
+   */
+  function getRecordWithOldValue(oldValue) {
+    if (recordWithOldValue)
+      return recordWithOldValue;
+    recordWithOldValue = copyMutationRecord(currentRecord);
+    recordWithOldValue.oldValue = oldValue;
+    return recordWithOldValue;
+  }
+
+  function clearRecords() {
+    currentRecord = recordWithOldValue = undefined;
+  }
+
+  /**
+   * @param {MutationRecord} record
+   * @return {boolean} Whether the record represents a record from the current
+   * mutation event.
+   */
+  function recordRepresentsCurrentMutation(record) {
+    return record === recordWithOldValue || record === currentRecord;
+  }
+
+  /**
+   * Selects which record, if any, to replace the last record in the queue.
+   * This returns |null| if no record should be replaced.
+   *
+   * @param {MutationRecord} lastRecord
+   * @param {MutationRecord} newRecord
+   * @param {MutationRecord}
+   */
+  function selectRecord(lastRecord, newRecord) {
+    if (lastRecord === newRecord)
+      return lastRecord;
+
+    // Check if the the record we are adding represents the same record. If
+    // so, we keep the one with the oldValue in it.
+    if (recordWithOldValue && recordRepresentsCurrentMutation(lastRecord))
+      return recordWithOldValue;
+
+    return null;
+  }
+
+  /**
+   * Class used to represent a registered observer.
+   * @param {MutationObserver} observer
+   * @param {Node} target
+   * @param {MutationObserverInit} options
+   * @constructor
+   */
+  function Registration(observer, target, options) {
+    this.observer = observer;
+    this.target = target;
+    this.options = options;
+    this.transientObservedNodes = [];
+  }
+
+  Registration.prototype = {
+    enqueue: function(record) {
+      var records = this.observer.records_;
+      var length = records.length;
+
+      // There are cases where we replace the last record with the new record.
+      // For example if the record represents the same mutation we need to use
+      // the one with the oldValue. If we get same record (this can happen as we
+      // walk up the tree) we ignore the new record.
+      if (records.length > 0) {
+        var lastRecord = records[length - 1];
+        var recordToReplaceLast = selectRecord(lastRecord, record);
+        if (recordToReplaceLast) {
+          records[length - 1] = recordToReplaceLast;
+          return;
+        }
+      } else {
+        scheduleCallback(this.observer);
+      }
+
+      records[length] = record;
+    },
+
+    addListeners: function() {
+      this.addListeners_(this.target);
+    },
+
+    addListeners_: function(node) {
+      var options = this.options;
+      if (options.attributes)
+        node.addEventListener('DOMAttrModified', this, true);
+
+      if (options.characterData)
+        node.addEventListener('DOMCharacterDataModified', this, true);
+
+      if (options.childList)
+        node.addEventListener('DOMNodeInserted', this, true);
+
+      if (options.childList || options.subtree)
+        node.addEventListener('DOMNodeRemoved', this, true);
+    },
+
+    removeListeners: function() {
+      this.removeListeners_(this.target);
+    },
+
+    removeListeners_: function(node) {
+      var options = this.options;
+      if (options.attributes)
+        node.removeEventListener('DOMAttrModified', this, true);
+
+      if (options.characterData)
+        node.removeEventListener('DOMCharacterDataModified', this, true);
+
+      if (options.childList)
+        node.removeEventListener('DOMNodeInserted', this, true);
+
+      if (options.childList || options.subtree)
+        node.removeEventListener('DOMNodeRemoved', this, true);
+    },
+
+    /**
+     * Adds a transient observer on node. The transient observer gets removed
+     * next time we deliver the change records.
+     * @param {Node} node
+     */
+    addTransientObserver: function(node) {
+      // Don't add transient observers on the target itself. We already have all
+      // the required listeners set up on the target.
+      if (node === this.target)
+        return;
+
+      this.addListeners_(node);
+      this.transientObservedNodes.push(node);
+      var registrations = registrationsTable.get(node);
+      if (!registrations)
+        registrationsTable.set(node, registrations = []);
+
+      // We know that registrations does not contain this because we already
+      // checked if node === this.target.
+      registrations.push(this);
+    },
+
+    removeTransientObservers: function() {
+      var transientObservedNodes = this.transientObservedNodes;
+      this.transientObservedNodes = [];
+
+      transientObservedNodes.forEach(function(node) {
+        // Transient observers are never added to the target.
+        this.removeListeners_(node);
+
+        var registrations = registrationsTable.get(node);
+        for (var i = 0; i < registrations.length; i++) {
+          if (registrations[i] === this) {
+            registrations.splice(i, 1);
+            // Each node can only have one registered observer associated with
+            // this observer.
+            break;
+          }
+        }
+      }, this);
+    },
+
+    handleEvent: function(e) {
+      // Stop propagation since we are managing the propagation manually.
+      // This means that other mutation events on the page will not work
+      // correctly but that is by design.
+      e.stopImmediatePropagation();
+
+      switch (e.type) {
+        case 'DOMAttrModified':
+          // http://dom.spec.whatwg.org/#concept-mo-queue-attributes
+
+          var name = e.attrName;
+          var namespace = e.relatedNode.namespaceURI;
+          var target = e.target;
+
+          // 1.
+          var record = new getRecord('attributes', target);
+          record.attributeName = name;
+          record.attributeNamespace = namespace;
+
+          // 2.
+          var oldValue =
+              e.attrChange === MutationEvent.ADDITION ? null : e.prevValue;
+
+          forEachAncestorAndObserverEnqueueRecord(target, function(options) {
+            // 3.1, 4.2
+            if (!options.attributes)
+              return;
+
+            // 3.2, 4.3
+            if (options.attributeFilter && options.attributeFilter.length &&
+                options.attributeFilter.indexOf(name) === -1 &&
+                options.attributeFilter.indexOf(namespace) === -1) {
+              return;
+            }
+            // 3.3, 4.4
+            if (options.attributeOldValue)
+              return getRecordWithOldValue(oldValue);
+
+            // 3.4, 4.5
+            return record;
+          });
+
+          break;
+
+        case 'DOMCharacterDataModified':
+          // http://dom.spec.whatwg.org/#concept-mo-queue-characterdata
+          var target = e.target;
+
+          // 1.
+          var record = getRecord('characterData', target);
+
+          // 2.
+          var oldValue = e.prevValue;
+
+
+          forEachAncestorAndObserverEnqueueRecord(target, function(options) {
+            // 3.1, 4.2
+            if (!options.characterData)
+              return;
+
+            // 3.2, 4.3
+            if (options.characterDataOldValue)
+              return getRecordWithOldValue(oldValue);
+
+            // 3.3, 4.4
+            return record;
+          });
+
+          break;
+
+        case 'DOMNodeRemoved':
+          this.addTransientObserver(e.target);
+          // Fall through.
+        case 'DOMNodeInserted':
+          // http://dom.spec.whatwg.org/#concept-mo-queue-childlist
+          var target = e.relatedNode;
+          var changedNode = e.target;
+          var addedNodes, removedNodes;
+          if (e.type === 'DOMNodeInserted') {
+            addedNodes = [changedNode];
+            removedNodes = [];
+          } else {
+
+            addedNodes = [];
+            removedNodes = [changedNode];
+          }
+          var previousSibling = changedNode.previousSibling;
+          var nextSibling = changedNode.nextSibling;
+
+          // 1.
+          var record = getRecord('childList', target);
+          record.addedNodes = addedNodes;
+          record.removedNodes = removedNodes;
+          record.previousSibling = previousSibling;
+          record.nextSibling = nextSibling;
+
+          forEachAncestorAndObserverEnqueueRecord(target, function(options) {
+            // 2.1, 3.2
+            if (!options.childList)
+              return;
+
+            // 2.2, 3.3
+            return record;
+          });
+
+      }
+
+      clearRecords();
+    }
+  };
+
+  global.JsMutationObserver = JsMutationObserver;
+
+  if (!global.MutationObserver)
+    global.MutationObserver = JsMutationObserver;
+
+
+})(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.
+ */
+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.
+ */
+
+(function(scope) {
+
+  // imports
+  var path = scope.path;
+  var xhr = scope.xhr;
+  var flags = scope.flags;
+
+  // TODO(sorvell): this loader supports a dynamic list of urls
+  // and an oncomplete callback that is called when the loader is done.
+  // The polyfill currently does *not* need this dynamism or the onComplete
+  // concept. Because of this, the loader could be simplified quite a bit.
+  var Loader = function(onLoad, onComplete) {
+    this.cache = {};
+    this.onload = onLoad;
+    this.oncomplete = onComplete;
+    this.inflight = 0;
+    this.pending = {};
+  };
+
+  Loader.prototype = {
+    addNodes: function(nodes) {
+      // number of transactions to complete
+      this.inflight += nodes.length;
+      // commence transactions
+      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
+        this.require(n);
+      }
+      // anything to do?
+      this.checkDone();
+    },
+    addNode: function(node) {
+      // number of transactions to complete
+      this.inflight++;
+      // commence transactions
+      this.require(node);
+      // anything to do?
+      this.checkDone();
+    },
+    require: function(elt) {
+      var url = elt.src || elt.href;
+      // ensure we have a standard url that can be used
+      // reliably for deduping.
+      // TODO(sjmiles): ad-hoc
+      elt.__nodeUrl = url;
+      // deduplication
+      if (!this.dedupe(url, elt)) {
+        // fetch this resource
+        this.fetch(url, elt);
+      }
+    },
+    dedupe: function(url, elt) {
+      if (this.pending[url]) {
+        // add to list of nodes waiting for inUrl
+        this.pending[url].push(elt);
+        // don't need fetch
+        return true;
+      }
+      var resource;
+      if (this.cache[url]) {
+        this.onload(url, elt, this.cache[url]);
+        // finished this transaction
+        this.tail();
+        // don't need fetch
+        return true;
+      }
+      // first node waiting for inUrl
+      this.pending[url] = [elt];
+      // need fetch (not a dupe)
+      return false;
+    },
+    fetch: function(url, elt) {
+      flags.load && console.log('fetch', url, elt);
+      if (url.match(/^data:/)) {
+        // Handle Data URI Scheme
+        var pieces = url.split(',');
+        var header = pieces[0];
+        var body = pieces[1];
+        if(header.indexOf(';base64') > -1) {
+          body = atob(body);
+        } else {
+          body = decodeURIComponent(body);
+        }
+        setTimeout(function() {
+            this.receive(url, elt, null, body);
+        }.bind(this), 0);
+      } else {
+        var receiveXhr = function(err, resource) {
+          this.receive(url, elt, err, resource);
+        }.bind(this);
+        xhr.load(url, receiveXhr);
+        // TODO(sorvell): blocked on)
+        // https://code.google.com/p/chromium/issues/detail?id=257221
+        // xhr'ing for a document makes scripts in imports runnable; otherwise
+        // they are not; however, it requires that we have doctype=html in
+        // the import which is unacceptable. This is only needed on Chrome
+        // to avoid the bug above.
+        /*
+        if (isDocumentLink(elt)) {
+          xhr.loadDocument(url, receiveXhr);
+        } else {
+          xhr.load(url, receiveXhr);
+        }
+        */
+      }
+    },
+    receive: function(url, elt, err, resource) {
+      this.cache[url] = resource;
+      var $p = this.pending[url];
+      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {
+        //if (!err) {
+          this.onload(url, p, resource);
+        //}
+        this.tail();
+      }
+      this.pending[url] = null;
+    },
+    tail: function() {
+      --this.inflight;
+      this.checkDone();
+    },
+    checkDone: function() {
+      if (!this.inflight) {
+        this.oncomplete();
+      }
+    }
+  };
+
+  xhr = xhr || {
+    async: true,
+    ok: function(request) {
+      return (request.status >= 200 && request.status < 300)
+          || (request.status === 304)
+          || (request.status === 0);
+    },
+    load: function(url, next, nextContext) {
+      var request = new XMLHttpRequest();
+      if (scope.flags.debug || scope.flags.bust) {
+        url += '?' + Math.random();
+      }
+      request.open('GET', url, xhr.async);
+      request.addEventListener('readystatechange', function(e) {
+        if (request.readyState === 4) {
+          next.call(nextContext, !xhr.ok(request) && request,
+              request.response || request.responseText, url);
+        }
+      });
+      request.send();
+      return request;
+    },
+    loadDocument: function(url, next, nextContext) {
+      this.load(url, next, nextContext).responseType = 'document';
+    }
+  };
+
+  // exports
+  scope.xhr = xhr;
+  scope.Loader = Loader;
+
+})(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.
+ */
+
+(function(scope) {
+
+var IMPORT_LINK_TYPE = 'import';
+var flags = scope.flags;
+var isIe = /Trident/.test(navigator.userAgent);
+// TODO(sorvell): SD polyfill intrusion
+var mainDoc = window.ShadowDOMPolyfill ? 
+    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;
+
+// importParser
+// highlander object to manage parsing of imports
+// parses import related elements
+// and ensures proper parse order
+// parse order is enforced by crawling the tree and monitoring which elements
+// have been parsed; async parsing is also supported.
+
+// highlander object for parsing a document tree
+var importParser = {
+  // parse selectors for main document elements
+  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',
+  // parse selectors for import document elements
+  importsSelectors: [
+    'link[rel=' + IMPORT_LINK_TYPE + ']',
+    'link[rel=stylesheet]',
+    'style',
+    'script:not([type])',
+    'script[type="text/javascript"]'
+  ].join(','),
+  map: {
+    link: 'parseLink',
+    script: 'parseScript',
+    style: 'parseStyle'
+  },
+  // try to parse the next import in the tree
+  parseNext: function() {
+    var next = this.nextToParse();
+    if (next) {
+      this.parse(next);
+    }
+  },
+  parse: function(elt) {
+    if (this.isParsed(elt)) {
+      flags.parse && console.log('[%s] is already parsed', elt.localName);
+      return;
+    }
+    var fn = this[this.map[elt.localName]];
+    if (fn) {
+      this.markParsing(elt);
+      fn.call(this, elt);
+    }
+  },
+  // only 1 element may be parsed at a time; parsing is async so, each
+  // parsing implementation must inform the system that parsing is complete
+  // via markParsingComplete.
+  markParsing: function(elt) {
+    flags.parse && console.log('parsing', elt);
+    this.parsingElement = elt;
+  },
+  markParsingComplete: function(elt) {
+    elt.__importParsed = true;
+    if (elt.__importElement) {
+      elt.__importElement.__importParsed = true;
+    }
+    this.parsingElement = null;
+    flags.parse && console.log('completed', elt);
+    this.parseNext();
+  },
+  parseImport: function(elt) {
+    elt.import.__importParsed = true;
+    // TODO(sorvell): consider if there's a better way to do this;
+    // expose an imports parsing hook; this is needed, for example, by the
+    // CustomElements polyfill.
+    if (HTMLImports.__importsParsingHook) {
+      HTMLImports.__importsParsingHook(elt);
+    }
+    // fire load event
+    if (elt.__resource) {
+      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    
+    } else {
+      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));
+    }
+    // TODO(sorvell): workaround for Safari addEventListener not working
+    // for elements not in the main document.
+    if (elt.__pending) {
+      var fn;
+      while (elt.__pending.length) {
+        fn = elt.__pending.shift();
+        if (fn) {
+          fn({target: elt});
+        }
+      }
+    }
+    this.markParsingComplete(elt);
+  },
+  parseLink: function(linkElt) {
+    if (nodeIsImport(linkElt)) {
+      this.parseImport(linkElt);
+    } else {
+      // make href absolute
+      linkElt.href = linkElt.href;
+      this.parseGeneric(linkElt);
+    }
+  },
+  parseStyle: function(elt) {
+    // TODO(sorvell): style element load event can just not fire so clone styles
+    var src = elt;
+    elt = cloneStyle(elt);
+    elt.__importElement = src;
+    this.parseGeneric(elt);
+  },
+  parseGeneric: function(elt) {
+    this.trackElement(elt);
+    document.head.appendChild(elt);
+  },
+  // tracks when a loadable element has loaded
+  trackElement: function(elt, callback) {
+    var self = this;
+    var done = function(e) {
+      if (callback) {
+        callback(e);
+      }
+      self.markParsingComplete(elt);
+    };
+    elt.addEventListener('load', done);
+    elt.addEventListener('error', done);
+
+    // 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') {
+      var fakeLoad = false;
+      // If there's not @import in the textContent, assume it has loaded
+      if (elt.textContent.indexOf('@import') == -1) {
+        fakeLoad = true;
+      // if we have a sheet, we have been parsed
+      } else if (elt.sheet) {
+        fakeLoad = true;
+        var csr = elt.sheet.cssRules;
+        var len = csr ? csr.length : 0;
+        // search the rules for @import's
+        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {
+          if (r.type === CSSRule.IMPORT_RULE) {
+            // if every @import has resolved, fake the load
+            fakeLoad = fakeLoad && Boolean(r.styleSheet);
+          }
+        }
+      }
+      // dispatch a fake load event and continue parsing
+      if (fakeLoad) {
+        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));
+      }
+    }
+  },
+  // NOTE: execute scripts by injecting them and watching for the load/error
+  // event. Inline scripts are handled via dataURL's because browsers tend to
+  // provide correct parsing errors in this case. If this has any compatibility
+  // issues, we can switch to injecting the inline script with textContent.
+  // Scripts with dataURL's do not appear to generate load events and therefore
+  // we assume they execute synchronously.
+  parseScript: function(scriptElt) {
+    var script = document.createElement('script');
+    script.__importElement = scriptElt;
+    script.src = scriptElt.src ? scriptElt.src : 
+        generateScriptDataUrl(scriptElt);
+    scope.currentScript = scriptElt;
+    this.trackElement(script, function(e) {
+      script.parentNode.removeChild(script);
+      scope.currentScript = null;  
+    });
+    document.head.appendChild(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;
+        }
+      }
+    }
+    // all nodes have been parsed, ready to parse import, if any
+    return link;
+  },
+  // return the set of parse selectors relevant for this node.
+  parseSelectorsForNode: function(node) {
+    var doc = node.ownerDocument || node;
+    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;
+  },
+  isParsed: function(node) {
+    return node.__importParsed;
+  },
+  hasResource: function(node) {
+    if (nodeIsImport(node) && !node.import) {
+      return false;
+    }
+    return true;
+  }
+};
+
+function nodeIsImport(elt) {
+  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);
+}
+
+function generateScriptDataUrl(script) {
+  var scriptContent = generateScriptContent(script), b64;
+  try {
+    b64 = btoa(scriptContent);
+  } catch(e) {
+    b64 = btoa(unescape(encodeURIComponent(scriptContent)));
+    console.warn('Script contained non-latin characters that were forced ' +
+      'to latin. Some characters may be wrong.', script);
+  }
+  return 'data:text/javascript;base64,' + b64;
+}
+
+function generateScriptContent(script) {
+  return script.textContent + generateSourceMapHint(script);
+}
+
+// calculate source map hint
+function generateSourceMapHint(script) {
+  var moniker = script.__nodeUrl;
+  if (!moniker) {
+    moniker = script.ownerDocument.baseURI;
+    // there could be more than one script this url
+    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';
+    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow 
+    // this sort of thing
+    var matches = script.textContent.match(/Polymer\(['"]([^'"]*)/);
+    tag = matches && matches[1] || tag;
+    // tag the moniker
+    moniker += '/' + tag + '.js';
+  }
+  return '\n//# sourceURL=' + moniker + '\n';
+}
+
+// style/stylesheet handling
+
+// clone style with proper path resolution for main document
+// NOTE: styles are the only elements that require direct path fixup.
+function cloneStyle(style) {
+  var clone = style.ownerDocument.createElement('style');
+  clone.textContent = style.textContent;
+  path.resolveUrlsInStyle(clone);
+  return clone;
+}
+
+// path fixup: style elements in imports must be made relative to the main 
+// document. We fixup url's in url() and @import.
+var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
+var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
+
+var path = {
+  resolveUrlsInStyle: function(style) {
+    var doc = style.ownerDocument;
+    var resolver = doc.createElement('a');
+    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);
+    return style;  
+  },
+  resolveUrlsInCssText: function(cssText, urlObj) {
+    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);
+    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);
+    return r;
+  },
+  replaceUrls: function(text, urlObj, regexp) {
+    return text.replace(regexp, function(m, pre, url, post) {
+      var urlPath = url.replace(/["']/g, '');
+      urlObj.href = urlPath;
+      urlPath = urlObj.href;
+      return pre + '\'' + urlPath + '\'' + post;
+    });    
+  }
+}
+
+// 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.
+ */
+
+(function(scope) {
+
+var hasNative = ('import' in document.createElement('link'));
+var useNative = hasNative;
+var flags = scope.flags;
+var IMPORT_LINK_TYPE = 'import';
+
+// TODO(sorvell): SD polyfill intrusion
+var mainDoc = window.ShadowDOMPolyfill ? 
+    ShadowDOMPolyfill.wrapIfNeeded(document) : document;
+
+if (!useNative) {
+
+  // imports
+  var xhr = scope.xhr;
+  var Loader = scope.Loader;
+  var parser = scope.parser;
+
+  // importer
+  // highlander object to manage loading of imports
+
+  // for any document, importer:
+  // - loads any linked import documents (with deduping)
+
+  var importer = {
+    documents: {},
+    // nodes to load in the mian document
+    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',
+    // nodes to load in imports
+    importsPreloadSelectors: [
+      'link[rel=' + IMPORT_LINK_TYPE + ']'
+    ].join(','),
+    loadNode: function(node) {
+      importLoader.addNode(node);
+    },
+    // load all loadable elements within the parent element
+    loadSubtree: function(parent) {
+      var nodes = this.marshalNodes(parent);
+      // add these nodes to loader's queue
+      importLoader.addNodes(nodes);
+    },
+    marshalNodes: function(parent) {
+      // all preloadable nodes in inDocument
+      return parent.querySelectorAll(this.loadSelectorsForNode(parent));
+    },
+    // find the proper set of load selectors for a given node
+    loadSelectorsForNode: function(node) {
+      var doc = node.ownerDocument || node;
+      return doc === mainDoc ? this.documentPreloadSelectors :
+          this.importsPreloadSelectors;
+    },
+    loaded: function(url, elt, resource) {
+      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;
+      if (isDocumentLink(elt)) {
+        var doc = this.documents[url];
+        // if we've never seen a document at this url
+        if (!doc) {
+          // 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);
+          // cache document
+          this.documents[url] = doc;
+        }
+        // don't store import record until we're actually loaded
+        // store document resource
+        elt.import = doc;
+      }
+      parser.parseNext();
+    },
+    bootDocument: function(doc) {
+      this.loadSubtree(doc);
+      this.observe(doc);
+      parser.parseNext();
+    },
+    loadedAll: function() {
+      parser.parseNext();
+    }
+  };
+
+  // loader singleton
+  var importLoader = new Loader(importer.loaded.bind(importer), 
+      importer.loadedAll.bind(importer));
+
+  function isDocumentLink(elt) {
+    return isLinkRel(elt, IMPORT_LINK_TYPE);
+  }
+
+  function isLinkRel(elt, rel) {
+    return elt.localName === 'link' && elt.getAttribute('rel') === rel;
+  }
+
+  function isScript(elt) {
+    return elt.localName === 'script';
+  }
+
+  function makeDocument(resource, url) {
+    // create a new HTML document
+    var doc = resource;
+    if (!(doc instanceof Document)) {
+      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);
+    }
+    // cache the new document's source url
+    doc._URL = url;
+    // establish a relative path via <base>
+    var base = doc.createElement('base');
+    base.setAttribute('href', url);
+    // add baseURI support to browsers (IE) that lack it.
+    if (!doc.baseURI) {
+      doc.baseURI = url;
+    }
+    // ensure UTF-8 charset
+    var meta = doc.createElement('meta');
+    meta.setAttribute('charset', 'utf-8');
+
+    doc.head.appendChild(meta);
+    doc.head.appendChild(base);
+    // install HTML last as it may trigger CustomElement upgrades
+    // TODO(sjmiles): problem wrt to template boostrapping below,
+    // template bootstrapping must (?) come before element upgrade
+    // but we cannot bootstrap templates until they are in a document
+    // which is too late
+    if (!(resource instanceof Document)) {
+      // install html
+      doc.body.innerHTML = resource;
+    }
+    // TODO(sorvell): ideally this code is not aware of Template polyfill,
+    // but for now the polyfill needs help to bootstrap these templates
+    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
+      HTMLTemplateElement.bootstrap(doc);
+    }
+    return doc;
+  }
+} 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) {
+      // go async to ensure parser isn't stuck on a script tag
+      requestAnimationFrame(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.__importParsed;
+}
+
+// exports
+scope.hasNative = hasNative;
+scope.useNative = useNative;
+scope.importer = importer;
+scope.whenImportsReady = whenImportsReady;
+scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
+scope.isImportLoaded = isImportLoaded;
+scope.importLoader = importLoader;
+
+})(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.
+*/
+
+(function(scope){
+
+var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
+var importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';
+var importer = scope.importer;
+
+// we track mutations for addedNodes, looking for imports
+function handler(mutations) {
+  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {
+    if (m.type === 'childList' && m.addedNodes.length) {
+      addedNodes(m.addedNodes);
+    }
+  }
+}
+
+// find loadable elements and add them to the importer
+function addedNodes(nodes) {
+  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
+    if (shouldLoadNode(n)) {
+      importer.loadNode(n);
+    }
+    if (n.children && n.children.length) {
+      addedNodes(n.children);
+    }
+  }
+}
+
+function shouldLoadNode(node) {
+  return (node.nodeType === 1) && matches.call(node,
+      importer.loadSelectorsForNode(node));
+}
+
+// x-plat matches
+var matches = HTMLElement.prototype.matches || 
+    HTMLElement.prototype.matchesSelector || 
+    HTMLElement.prototype.webkitMatchesSelector ||
+    HTMLElement.prototype.mozMatchesSelector ||
+    HTMLElement.prototype.msMatchesSelector;
+
+var observer = new MutationObserver(handler);
+
+// observe the given root for loadable elements
+function observe(root) {
+  observer.observe(root, {childList: true, subtree: true});
+}
+
+// exports
+// TODO(sorvell): factor so can put on scope
+scope.observe = observe;
+importer.observe = observe;
+
+})(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.
+ */
+(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() {
+    HTMLImports.importer.bootDocument(doc);
+  }
+    
+  // TODO(sorvell): SD polyfill does *not* generate mutations for nodes added
+  // by the parser. For this reason, we must wait until the dom exists to 
+  // bootstrap.
+  if (document.readyState === 'complete' ||
+      (document.readyState === 'interactive' && !window.attachEvent)) {
+    bootstrap();
+  } else {
+    document.addEventListener('DOMContentLoaded', bootstrap);
+  }
+}
+
+})();
+
+/*
+ * 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.
+ */
+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 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.
+ */
+
+/**
+ * Implements `document.register`
+ * @module CustomElements
+*/
+
+/**
+ * Polyfilled extensions to the `document` object.
+ * @class Document
+*/
+
+(function(scope) {
+
+// imports
+
+if (!scope) {
+  scope = window.CustomElements = {flags:{}};
+}
+var flags = scope.flags;
+
+// native document.registerElement?
+
+var hasNative = Boolean(document.registerElement);
+// TODO(sorvell): See https://github.com/Polymer/polymer/issues/399
+// we'll address this by defaulting to CE polyfill in the presence of the SD
+// polyfill. This will avoid spamming excess attached/detached callbacks.
+// If there is a compelling need to run CE native with SD polyfill,
+// we'll need to fix this issue.
+var useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill;
+
+if (useNative) {
+
+  // stub
+  var nop = function() {};
+
+  // exports
+  scope.registry = {};
+  scope.upgradeElement = nop;
+
+  scope.watchShadow = nop;
+  scope.upgrade = nop;
+  scope.upgradeAll = nop;
+  scope.upgradeSubtree = nop;
+  scope.observeDocument = nop;
+  scope.upgradeDocument = nop;
+  scope.upgradeDocumentTree = nop;
+  scope.takeRecords = nop;
+  scope.reservedTagList = [];
+
+} else {
+
+  /**
+   * Registers a custom tag name with the document.
+   *
+   * When a registered element is created, a `readyCallback` method is called
+   * in the scope of the element. The `readyCallback` method can be specified on
+   * either `options.prototype` or `options.lifecycle` with the latter taking
+   * precedence.
+   *
+   * @method register
+   * @param {String} name The tag name to register. Must include a dash ('-'),
+   *    for example 'x-component'.
+   * @param {Object} options
+   *    @param {String} [options.extends]
+   *      (_off spec_) Tag name of an element to extend (or blank for a new
+   *      element). This parameter is not part of the specification, but instead
+   *      is a hint for the polyfill because the extendee is difficult to infer.
+   *      Remember that the input prototype must chain to the extended element's
+   *      prototype (or HTMLElement.prototype) regardless of the value of
+   *      `extends`.
+   *    @param {Object} options.prototype The prototype to use for the new
+   *      element. The prototype must inherit from HTMLElement.
+   *    @param {Object} [options.lifecycle]
+   *      Callbacks that fire at important phases in the life of the custom
+   *      element.
+   *
+   * @example
+   *      FancyButton = document.registerElement("fancy-button", {
+   *        extends: 'button',
+   *        prototype: Object.create(HTMLButtonElement.prototype, {
+   *          readyCallback: {
+   *            value: function() {
+   *              console.log("a fancy-button was created",
+   *            }
+   *          }
+   *        })
+   *      });
+   * @return {Function} Constructor for the newly registered type.
+   */
+  function register(name, options) {
+    //console.warn('document.registerElement("' + name + '", ', options, ')');
+    // construct a defintion out of options
+    // TODO(sjmiles): probably should clone options instead of mutating it
+    var definition = options || {};
+    if (!name) {
+      // TODO(sjmiles): replace with more appropriate error (EricB can probably
+      // offer guidance)
+      throw new Error('document.registerElement: first argument `name` must not be empty');
+    }
+    if (name.indexOf('-') < 0) {
+      // TODO(sjmiles): replace with more appropriate error (EricB can probably
+      // offer guidance)
+      throw new Error('document.registerElement: first argument (\'name\') must contain a dash (\'-\'). Argument provided was \'' + String(name) + '\'.');
+    }
+    // prevent registering reserved names
+    if (isReservedTag(name)) {
+      throw new Error('Failed to execute \'registerElement\' on \'Document\': Registration failed for type \'' + String(name) + '\'. The type name is invalid.');
+    }
+    // elements may only be registered once
+    if (getRegisteredDefinition(name)) {
+      throw new Error('DuplicateDefinitionError: a type with name \'' + String(name) + '\' is already registered');
+    }
+    // must have a prototype, default to an extension of HTMLElement
+    // TODO(sjmiles): probably should throw if no prototype, check spec
+    if (!definition.prototype) {
+      // TODO(sjmiles): replace with more appropriate error (EricB can probably
+      // offer guidance)
+      throw new Error('Options missing required prototype property');
+    }
+    // record name
+    definition.__name = name.toLowerCase();
+    // ensure a lifecycle object so we don't have to null test it
+    definition.lifecycle = definition.lifecycle || {};
+    // build a list of ancestral custom elements (for native base detection)
+    // TODO(sjmiles): we used to need to store this, but current code only
+    // uses it in 'resolveTagName': it should probably be inlined
+    definition.ancestry = ancestry(definition.extends);
+    // extensions of native specializations of HTMLElement require localName
+    // to remain native, and use secondary 'is' specifier for extension type
+    resolveTagName(definition);
+    // some platforms require modifications to the user-supplied prototype
+    // chain
+    resolvePrototypeChain(definition);
+    // overrides to implement attributeChanged callback
+    overrideAttributeApi(definition.prototype);
+    // 7.1.5: Register the DEFINITION with DOCUMENT
+    registerDefinition(definition.__name, definition);
+    // 7.1.7. Run custom element constructor generation algorithm with PROTOTYPE
+    // 7.1.8. Return the output of the previous step.
+    definition.ctor = generateConstructor(definition);
+    definition.ctor.prototype = definition.prototype;
+    // force our .constructor to be our actual constructor
+    definition.prototype.constructor = definition.ctor;
+    // if initial parsing is complete
+    if (scope.ready) {
+      // upgrade any pre-existing nodes of this type
+      scope.upgradeDocumentTree(document);
+    }
+    return definition.ctor;
+  }
+
+  function isReservedTag(name) {
+    for (var i = 0; i < reservedTagList.length; i++) {
+      if (name === reservedTagList[i]) {
+        return true;
+      }
+    }
+  }
+
+  var reservedTagList = [
+    'annotation-xml', 'color-profile', 'font-face', 'font-face-src',
+    'font-face-uri', 'font-face-format', 'font-face-name', 'missing-glyph'
+  ];
+
+  function ancestry(extnds) {
+    var extendee = getRegisteredDefinition(extnds);
+    if (extendee) {
+      return ancestry(extendee.extends).concat([extendee]);
+    }
+    return [];
+  }
+
+  function resolveTagName(definition) {
+    // if we are explicitly extending something, that thing is our
+    // baseTag, unless it represents a custom component
+    var baseTag = definition.extends;
+    // if our ancestry includes custom components, we only have a
+    // baseTag if one of them does
+    for (var i=0, a; (a=definition.ancestry[i]); i++) {
+      baseTag = a.is && a.tag;
+    }
+    // our tag is our baseTag, if it exists, and otherwise just our name
+    definition.tag = baseTag || definition.__name;
+    if (baseTag) {
+      // if there is a base tag, use secondary 'is' specifier
+      definition.is = definition.__name;
+    }
+  }
+
+  function resolvePrototypeChain(definition) {
+    // if we don't support __proto__ we need to locate the native level
+    // prototype for precise mixing in
+    if (!Object.__proto__) {
+      // default prototype
+      var nativePrototype = HTMLElement.prototype;
+      // work out prototype when using type-extension
+      if (definition.is) {
+        var inst = document.createElement(definition.tag);
+        nativePrototype = Object.getPrototypeOf(inst);
+      }
+      // ensure __proto__ reference is installed at each point on the prototype
+      // chain.
+      // NOTE: On platforms without __proto__, a mixin strategy is used instead
+      // of prototype swizzling. In this case, this generated __proto__ provides
+      // limited support for prototype traversal.
+      var proto = definition.prototype, ancestor;
+      while (proto && (proto !== nativePrototype)) {
+        var ancestor = Object.getPrototypeOf(proto);
+        proto.__proto__ = ancestor;
+        proto = ancestor;
+      }
+    }
+    // cache this in case of mixin
+    definition.native = nativePrototype;
+  }
+
+  // SECTION 4
+
+  function instantiate(definition) {
+    // 4.a.1. Create a new object that implements PROTOTYPE
+    // 4.a.2. Let ELEMENT by this new object
+    //
+    // the custom element instantiation algorithm must also ensure that the
+    // output is a valid DOM element with the proper wrapper in place.
+    //
+    return upgrade(domCreateElement(definition.tag), definition);
+  }
+
+  function upgrade(element, definition) {
+    // some definitions specify an 'is' attribute
+    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
+    element.__upgraded__ = true;
+    // lifecycle management
+    created(element);
+    // attachedCallback fires in tree order, call before recursing
+    scope.insertedNode(element);
+    // there should never be a shadow root on element at this point
+    scope.upgradeSubtree(element);
+    // OUTPUT
+    return element;
+  }
+
+  function implement(element, definition) {
+    // prototype swizzling is best
+    if (Object.__proto__) {
+      element.__proto__ = definition.prototype;
+    } else {
+      // where above we can re-acquire inPrototype via
+      // getPrototypeOf(Element), we cannot do so when
+      // we use mixin, so we install a magic reference
+      customMixin(element, definition.prototype, definition.native);
+      element.__proto__ = definition.prototype;
+    }
+  }
+
+  function customMixin(inTarget, inSrc, inNative) {
+    // TODO(sjmiles): 'used' allows us to only copy the 'youngest' version of
+    // any property. This set should be precalculated. We also need to
+    // consider this for supporting 'super'.
+    var used = {};
+    // start with inSrc
+    var p = inSrc;
+    // The default is HTMLElement.prototype, so we add a test to avoid mixing in
+    // native prototypes
+    while (p !== inNative && p !== HTMLElement.prototype) {
+      var keys = Object.getOwnPropertyNames(p);
+      for (var i=0, k; k=keys[i]; i++) {
+        if (!used[k]) {
+          Object.defineProperty(inTarget, k,
+              Object.getOwnPropertyDescriptor(p, k));
+          used[k] = 1;
+        }
+      }
+      p = Object.getPrototypeOf(p);
+    }
+  }
+
+  function created(element) {
+    // invoke createdCallback
+    if (element.createdCallback) {
+      element.createdCallback();
+    }
+  }
+
+  // attribute watching
+
+  function overrideAttributeApi(prototype) {
+    // overrides to implement callbacks
+    // TODO(sjmiles): should support access via .attributes NamedNodeMap
+    // TODO(sjmiles): preserves user defined overrides, if any
+    if (prototype.setAttribute._polyfilled) {
+      return;
+    }
+    var setAttribute = prototype.setAttribute;
+    prototype.setAttribute = function(name, value) {
+      changeAttribute.call(this, name, value, setAttribute);
+    }
+    var removeAttribute = prototype.removeAttribute;
+    prototype.removeAttribute = function(name) {
+      changeAttribute.call(this, name, null, removeAttribute);
+    }
+    prototype.setAttribute._polyfilled = true;
+  }
+
+  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/
+  // index.html#dfn-attribute-changed-callback
+  function changeAttribute(name, value, operation) {
+    var oldValue = this.getAttribute(name);
+    operation.apply(this, arguments);
+    var newValue = this.getAttribute(name);
+    if (this.attributeChangedCallback
+        && (newValue !== oldValue)) {
+      this.attributeChangedCallback(name, oldValue, newValue);
+    }
+  }
+
+  // element registry (maps tag names to definitions)
+
+  var registry = {};
+
+  function getRegisteredDefinition(name) {
+    if (name) {
+      return registry[name.toLowerCase()];
+    }
+  }
+
+  function registerDefinition(name, definition) {
+    registry[name] = definition;
+  }
+
+  function generateConstructor(definition) {
+    return function() {
+      return instantiate(definition);
+    };
+  }
+
+  var HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
+  function createElementNS(namespace, tag, typeExtension) {
+    // NOTE: we do not support non-HTML elements,
+    // just call createElementNS for non HTML Elements
+    if (namespace === HTML_NAMESPACE) {
+      return createElement(tag, typeExtension);
+    } else {
+      return domCreateElementNS(namespace, tag);
+    }
+  }
+
+  function createElement(tag, typeExtension) {
+    // TODO(sjmiles): ignore 'tag' when using 'typeExtension', we could
+    // error check it, or perhaps there should only ever be one argument
+    var definition = getRegisteredDefinition(typeExtension || tag);
+    if (definition) {
+      if (tag == definition.tag && typeExtension == definition.is) {
+        return new definition.ctor();
+      }
+      // Handle empty string for type extension.
+      if (!typeExtension && !definition.is) {
+        return new definition.ctor();
+      }
+    }
+
+    if (typeExtension) {
+      var element = createElement(tag);
+      element.setAttribute('is', typeExtension);
+      return element;
+    }
+    var element = domCreateElement(tag);
+    // Custom tags should be HTMLElements even if not upgraded.
+    if (tag.indexOf('-') >= 0) {
+      implement(element, HTMLElement);
+    }
+    return element;
+  }
+
+  function upgradeElement(element) {
+    if (!element.__upgraded__ && (element.nodeType === Node.ELEMENT_NODE)) {
+      var is = element.getAttribute('is');
+      var definition = getRegisteredDefinition(is || element.localName);
+      if (definition) {
+        if (is && definition.tag == element.localName) {
+          return upgrade(element, definition);
+        } else if (!is && !definition.extends) {
+          return upgrade(element, definition);
+        }
+      }
+    }
+  }
+
+  function cloneNode(deep) {
+    // call original clone
+    var n = domCloneNode.call(this, deep);
+    // upgrade the element and subtree
+    scope.upgradeAll(n);
+    // return the clone
+    return n;
+  }
+  // capture native createElement before we override it
+
+  var domCreateElement = document.createElement.bind(document);
+  var domCreateElementNS = document.createElementNS.bind(document);
+
+  // capture native cloneNode before we override it
+
+  var domCloneNode = Node.prototype.cloneNode;
+
+  // exports
+
+  document.registerElement = register;
+  document.createElement = createElement; // override
+  document.createElementNS = createElementNS; // override
+  Node.prototype.cloneNode = cloneNode; // override
+
+  scope.registry = registry;
+
+  /**
+   * Upgrade an element to a custom element. Upgrading an element
+   * causes the custom prototype to be applied, an `is` attribute
+   * to be attached (as needed), and invocation of the `readyCallback`.
+   * `upgrade` does nothing if the element is already upgraded, or
+   * if it matches no registered custom tag name.
+   *
+   * @method ugprade
+   * @param {Element} element The element to upgrade.
+   * @return {Element} The upgraded element.
+   */
+  scope.upgrade = upgradeElement;
+}
+
+// Create a custom 'instanceof'. This is necessary when CustomElements
+// are implemented via a mixin strategy, as for example on IE10.
+var isInstance;
+if (!Object.__proto__ && !useNative) {
+  isInstance = function(obj, ctor) {
+    var p = obj;
+    while (p) {
+      // NOTE: this is not technically correct since we're not checking if
+      // an object is an instance of a constructor; however, this should
+      // be good enough for the mixin strategy.
+      if (p === ctor.prototype) {
+        return true;
+      }
+      p = p.__proto__;
+    }
+    return false;
+  }
+} else {
+  isInstance = function(obj, base) {
+    return obj instanceof base;
+  }
+}
+
+// exports
+scope.instanceof = isInstance;
+scope.reservedTagList = reservedTagList;
+
+// bc
+document.register = document.registerElement;
+
+scope.hasNative = hasNative;
+scope.useNative = useNative;
+
+})(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.
+ */
+
+(function(scope) {
+
+// import
+
+var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
+
+// highlander object for parsing a document tree
+
+var parser = {
+  selectors: [
+    'link[rel=' + IMPORT_LINK_TYPE + ']'
+  ],
+  map: {
+    link: 'parseLink'
+  },
+  parse: function(inDocument) {
+    if (!inDocument.__parsed) {
+      // only parse once
+      inDocument.__parsed = true;
+      // all parsable elements in inDocument (depth-first pre-order traversal)
+      var elts = inDocument.querySelectorAll(parser.selectors);
+      // for each parsable node type, call the mapped parsing method
+      forEach(elts, function(e) {
+        parser[parser.map[e.localName]](e);
+      });
+      // upgrade all upgradeable static elements, anything dynamically
+      // created should be caught by observer
+      CustomElements.upgradeDocument(inDocument);
+      // observe document for dom changes
+      CustomElements.observeDocument(inDocument);
+    }
+  },
+  parseLink: function(linkElt) {
+    // imports
+    if (isDocumentLink(linkElt)) {
+      this.parseImport(linkElt);
+    }
+  },
+  parseImport: function(linkElt) {
+    if (linkElt.import) {
+      parser.parse(linkElt.import);
+    }
+  }
+};
+
+function isDocumentLink(inElt) {
+  return (inElt.localName === 'link'
+      && inElt.getAttribute('rel') === IMPORT_LINK_TYPE);
+}
+
+var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
+
+// exports
+
+scope.parser = parser;
+scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
+
+})(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.
+ */
+(function(scope){
+
+// bootstrap parsing
+function bootstrap() {
+  // parse document
+  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;
+    // capture blunt profiling data
+    CustomElements.readyTime = Date.now();
+    if (window.HTMLImports) {
+      CustomElements.elapsed = CustomElements.readyTime - HTMLImports.readyTime;
+    }
+    // notify the system that we are bootstrapped
+    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);
+    return e;
+  };
+}
+
+// When loading at readyState complete time (or via flag), boot custom elements
+// immediately.
+// If relevant, HTMLImports must already be loaded.
+if (document.readyState === 'complete' || scope.flags.eager) {
+  bootstrap();
+// When loading at readyState interactive time, bootstrap only if HTMLImports
+// are not pending. Also avoid IE as the semantics of this state are unreliable.
+} else if (document.readyState === 'interactive' && !window.attachEvent &&
+    (!window.HTMLImports || window.HTMLImports.ready)) {
+  bootstrap();
+// When loading at other readyStates, wait for the appropriate DOM event to 
+// bootstrap.
+} else {
+  var loadEvent = window.HTMLImports && !HTMLImports.ready ?
+      'HTMLImportsLoaded' : 'DOMContentLoaded';
+  window.addEventListener(loadEvent, bootstrap);
+}
+
+})(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.
+ */
+(function() {
+
+if (window.ShadowDOMPolyfill) {
+
+  // ensure wrapped inputs for these functions
+  var fns = ['upgradeAll', 'upgradeSubtree', 'observeDocument',
+      'upgradeDocument'];
+
+  // cache originals
+  var original = {};
+  fns.forEach(function(fn) {
+    original[fn] = CustomElements[fn];
+  });
+
+  // override
+  fns.forEach(function(fn) {
+    CustomElements[fn] = function(inNode) {
+      return original[fn](wrap(inNode));
+    };
+  });
+
+}
+
+})();
+
+/*
+ * Copyright 2014 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+  var endOfMicrotask = scope.endOfMicrotask;
+
+  // Generic url loader
+  function Loader(regex) {
+    this.regex = regex;
+  }
+  Loader.prototype = {
+    // TODO(dfreedm): there may be a better factoring here
+    // extract absolute urls from the text (full of relative urls)
+    extractUrls: function(text, base) {
+      var matches = [];
+      var matched, u;
+      while ((matched = this.regex.exec(text))) {
+        u = new URL(matched[1], base);
+        matches.push({matched: matched[0], url: u.href});
+      }
+      return matches;
+    },
+    // take a text blob, a root url, and a callback and load all the urls found within the text
+    // returns a map of absolute url to text
+    process: function(text, root, callback) {
+      var matches = this.extractUrls(text, root);
+      this.fetch(matches, {}, callback);
+    },
+    // build a mapping of url -> text from matches
+    fetch: function(matches, map, callback) {
+      var inflight = matches.length;
+
+      // return early if there is no fetching to be done
+      if (!inflight) {
+        return callback(map);
+      }
+
+      var done = function() {
+        if (--inflight === 0) {
+          callback(map);
+        }
+      };
+
+      // map url -> responseText
+      var handleXhr = function(err, request) {
+        var match = request.match;
+        var key = match.url;
+        // handle errors with an empty string
+        if (err) {
+          map[key] = '';
+          return done();
+        }
+        var response = request.response || request.responseText;
+        map[key] = response;
+        this.fetch(this.extractUrls(response, key), map, done);
+      };
+
+      var m, req, url;
+      for (var i = 0; i < inflight; i++) {
+        m = matches[i];
+        url = m.url;
+        // if this url has already been requested, skip requesting it again
+        if (map[url]) {
+          // Async call to done to simplify the inflight logic
+          endOfMicrotask(done);
+          continue;
+        }
+        req = this.xhr(url, handleXhr, this);
+        req.match = m;
+        // tag the map with an XHR request to deduplicate at the same level
+        map[url] = req;
+      }
+    },
+    xhr: function(url, callback, scope) {
+      var request = new XMLHttpRequest();
+      request.open('GET', url, true);
+      request.send();
+      request.onload = function() {
+        callback.call(scope, null, request);
+      };
+      request.onerror = function() {
+        callback.call(scope, null, request);
+      };
+      return request;
+    }
+  };
+
+  scope.Loader = Loader;
+})(window.Platform);
+
+/*
+ * Copyright 2014 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+(function(scope) {
+
+var urlResolver = scope.urlResolver;
+var Loader = scope.Loader;
+
+function StyleResolver() {
+  this.loader = new Loader(this.regex);
+}
+StyleResolver.prototype = {
+  regex: /@import\s+(?:url)?["'\(]*([^'"\)]*)['"\)]*;/g,
+  // Recursively replace @imports with the text at that url
+  resolve: function(text, url, callback) {
+    var done = function(map) {
+      callback(this.flatten(text, url, map));
+    }.bind(this);
+    this.loader.process(text, url, done);
+  },
+  // resolve the textContent of a style node
+  resolveNode: function(style, callback) {
+    var text = style.textContent;
+    var url = style.ownerDocument.baseURI;
+    var done = function(text) {
+      style.textContent = text;
+      callback(style);
+    };
+    this.resolve(text, url, done);
+  },
+  // flatten all the @imports to text
+  flatten: function(text, base, map) {
+    var matches = this.loader.extractUrls(text, base);
+    var match, url, intermediate;
+    for (var i = 0; i < matches.length; i++) {
+      match = matches[i];
+      url = match.url;
+      // resolve any css text to be relative to the importer
+      intermediate = urlResolver.resolveCssText(map[url], url);
+      // flatten intermediate @imports
+      intermediate = this.flatten(intermediate, url, map);
+      text = text.replace(match.matched, intermediate);
+    }
+    return text;
+  },
+  loadStyles: function(styles, callback) {
+    var loaded=0, l = styles.length;
+    // called in the context of the style
+    function loadedStyle(style) {
+      loaded++;
+      if (loaded === l && callback) {
+        callback();
+      }
+    }
+    for (var i=0, s; (i<l) && (s=styles[i]); i++) {
+      this.resolveNode(s, loadedStyle);
+    }
+  }
+};
+
+var styleResolver = new StyleResolver();
+
+// exports
+scope.styleResolver = styleResolver;
+
+})(window.Platform);
+
+/*
+ * 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) {
+  scope = scope || {};
+  scope.external = scope.external || {};
+  var target = {
+    shadow: function(inEl) {
+      if (inEl) {
+        return inEl.shadowRoot || inEl.webkitShadowRoot;
+      }
+    },
+    canTarget: function(shadow) {
+      return shadow && Boolean(shadow.elementFromPoint);
+    },
+    targetingShadow: function(inEl) {
+      var s = this.shadow(inEl);
+      if (this.canTarget(s)) {
+        return s;
+      }
+    },
+    olderShadow: function(shadow) {
+      var os = shadow.olderShadowRoot;
+      if (!os) {
+        var se = shadow.querySelector('shadow');
+        if (se) {
+          os = se.olderShadowRoot;
+        }
+      }
+      return os;
+    },
+    allShadows: function(element) {
+      var shadows = [], s = this.shadow(element);
+      while(s) {
+        shadows.push(s);
+        s = this.olderShadow(s);
+      }
+      return shadows;
+    },
+    searchRoot: function(inRoot, x, y) {
+      if (inRoot) {
+        var t = inRoot.elementFromPoint(x, y);
+        var st, sr, os;
+        // is element a shadow host?
+        sr = this.targetingShadow(t);
+        while (sr) {
+          // find the the element inside the shadow root
+          st = sr.elementFromPoint(x, y);
+          if (!st) {
+            // check for older shadows
+            sr = this.olderShadow(sr);
+          } else {
+            // shadowed element may contain a shadow root
+            var ssr = this.targetingShadow(st);
+            return this.searchRoot(ssr, x, y) || st;
+          }
+        }
+        // light dom element is the target
+        return t;
+      }
+    },
+    owner: function(element) {
+      var s = element;
+      // walk up until you hit the shadow root or document
+      while (s.parentNode) {
+        s = s.parentNode;
+      }
+      // the owner element is expected to be a Document or ShadowRoot
+      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {
+        s = document;
+      }
+      return s;
+    },
+    findTarget: function(inEvent) {
+      var x = inEvent.clientX, y = inEvent.clientY;
+      // if the listener is in the shadow root, it is much faster to start there
+      var s = this.owner(inEvent.target);
+      // if x, y is not in this root, fall back to document search
+      if (!s.elementFromPoint(x, y)) {
+        s = document;
+      }
+      return this.searchRoot(s, x, y);
+    }
+  };
+  scope.targetFinding = target;
+  scope.findTarget = target.findTarget.bind(target);
+
+  window.PointerEventsPolyfill = scope;
+})(window.PointerEventsPolyfill);
+
+/*
+ * 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() {
+  function shadowSelector(v) {
+    return 'body /shadow-deep/ ' + selector(v);
+  }
+  function selector(v) {
+    return '[touch-action="' + v + '"]';
+  }
+  function rule(v) {
+    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + '; touch-action-delay: none; }';
+  }
+  var attrib2css = [
+    'none',
+    'auto',
+    'pan-x',
+    'pan-y',
+    {
+      rule: 'pan-x pan-y',
+      selectors: [
+        'pan-x pan-y',
+        'pan-y pan-x'
+      ]
+    }
+  ];
+  var styles = '';
+  // only install stylesheet if the browser has touch action support
+  var head = document.head;
+  var hasNativePE = window.PointerEvent || window.MSPointerEvent;
+  // only add shadow selectors if shadowdom is supported
+  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;
+
+  if (hasNativePE) {
+    attrib2css.forEach(function(r) {
+      if (String(r) === r) {
+        styles += selector(r) + rule(r) + '\n';
+        if (hasShadowRoot) {
+          styles += shadowSelector(r) + rule(r) + '\n';
+        }
+      } else {
+        styles += r.selectors.map(selector) + rule(r.rule) + '\n';
+        if (hasShadowRoot) {
+          styles += r.selectors.map(shadowSelector) + rule(r.rule) + '\n';
+        }
+      }
+    });
+
+    var el = document.createElement('style');
+    el.textContent = styles;
+    document.head.appendChild(el);
+  }
+})();
+
+/*
+ * 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.
+ */
+
+/**
+ * This is the constructor for new PointerEvents.
+ *
+ * New Pointer Events must be given a type, and an optional dictionary of
+ * initialization properties.
+ *
+ * Due to certain platform requirements, events returned from the constructor
+ * identify as MouseEvents.
+ *
+ * @constructor
+ * @param {String} inType The type of the event to create.
+ * @param {Object} [inDict] An optional dictionary of initial event properties.
+ * @return {Event} A new PointerEvent of type `inType` and initialized with properties from `inDict`.
+ */
+(function(scope) {
+
+  var MOUSE_PROPS = [
+    'bubbles',
+    'cancelable',
+    'view',
+    'detail',
+    'screenX',
+    'screenY',
+    'clientX',
+    'clientY',
+    'ctrlKey',
+    'altKey',
+    'shiftKey',
+    'metaKey',
+    'button',
+    'relatedTarget',
+    'pageX',
+    'pageY'
+  ];
+
+  var MOUSE_DEFAULTS = [
+    false,
+    false,
+    null,
+    null,
+    0,
+    0,
+    0,
+    0,
+    false,
+    false,
+    false,
+    false,
+    0,
+    null,
+    0,
+    0
+  ];
+
+  function PointerEvent(inType, inDict) {
+    inDict = inDict || Object.create(null);
+
+    var e = document.createEvent('Event');
+    e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);
+
+    // define inherited MouseEvent properties
+    for(var i = 0, p; i < MOUSE_PROPS.length; i++) {
+      p = MOUSE_PROPS[i];
+      e[p] = inDict[p] || MOUSE_DEFAULTS[i];
+    }
+    e.buttons = inDict.buttons || 0;
+
+    // Spec requires that pointers without pressure specified use 0.5 for down
+    // state and 0 for up state.
+    var pressure = 0;
+    if (inDict.pressure) {
+      pressure = inDict.pressure;
+    } else {
+      pressure = e.buttons ? 0.5 : 0;
+    }
+
+    // add x/y properties aliased to clientX/Y
+    e.x = e.clientX;
+    e.y = e.clientY;
+
+    // define the properties of the PointerEvent interface
+    e.pointerId = inDict.pointerId || 0;
+    e.width = inDict.width || 0;
+    e.height = inDict.height || 0;
+    e.pressure = pressure;
+    e.tiltX = inDict.tiltX || 0;
+    e.tiltY = inDict.tiltY || 0;
+    e.pointerType = inDict.pointerType || '';
+    e.hwTimestamp = inDict.hwTimestamp || 0;
+    e.isPrimary = inDict.isPrimary || false;
+    return e;
+  }
+
+  // attach to window
+  if (!scope.PointerEvent) {
+    scope.PointerEvent = PointerEvent;
+  }
+})(window);
+
+/*
+ * 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.
+ */
+
+/**
+ * This module implements an map of pointer states
+ */
+(function(scope) {
+  var USE_MAP = window.Map && window.Map.prototype.forEach;
+  var POINTERS_FN = function(){ return this.size; };
+  function PointerMap() {
+    if (USE_MAP) {
+      var m = new Map();
+      m.pointers = POINTERS_FN;
+      return m;
+    } else {
+      this.keys = [];
+      this.values = [];
+    }
+  }
+
+  PointerMap.prototype = {
+    set: function(inId, inEvent) {
+      var i = this.keys.indexOf(inId);
+      if (i > -1) {
+        this.values[i] = inEvent;
+      } else {
+        this.keys.push(inId);
+        this.values.push(inEvent);
+      }
+    },
+    has: function(inId) {
+      return this.keys.indexOf(inId) > -1;
+    },
+    'delete': function(inId) {
+      var i = this.keys.indexOf(inId);
+      if (i > -1) {
+        this.keys.splice(i, 1);
+        this.values.splice(i, 1);
+      }
+    },
+    get: function(inId) {
+      var i = this.keys.indexOf(inId);
+      return this.values[i];
+    },
+    clear: function() {
+      this.keys.length = 0;
+      this.values.length = 0;
+    },
+    // return value, key, map
+    forEach: function(callback, thisArg) {
+      this.values.forEach(function(v, i) {
+        callback.call(thisArg, v, this.keys[i], this);
+      }, this);
+    },
+    pointers: function() {
+      return this.keys.length;
+    }
+  };
+
+  scope.PointerMap = PointerMap;
+})(window.PointerEventsPolyfill);
+
+/*
+ * 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 CLONE_PROPS = [
+    // MouseEvent
+    'bubbles',
+    'cancelable',
+    'view',
+    'detail',
+    'screenX',
+    'screenY',
+    'clientX',
+    'clientY',
+    'ctrlKey',
+    'altKey',
+    'shiftKey',
+    'metaKey',
+    'button',
+    'relatedTarget',
+    // DOM Level 3
+    'buttons',
+    // PointerEvent
+    'pointerId',
+    'width',
+    'height',
+    'pressure',
+    'tiltX',
+    'tiltY',
+    'pointerType',
+    'hwTimestamp',
+    'isPrimary',
+    // event instance
+    'type',
+    'target',
+    'currentTarget',
+    'which',
+    'pageX',
+    'pageY'
+  ];
+
+  var CLONE_DEFAULTS = [
+    // MouseEvent
+    false,
+    false,
+    null,
+    null,
+    0,
+    0,
+    0,
+    0,
+    false,
+    false,
+    false,
+    false,
+    0,
+    null,
+    // DOM Level 3
+    0,
+    // PointerEvent
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    '',
+    0,
+    false,
+    // event instance
+    '',
+    null,
+    null,
+    0,
+    0,
+    0
+  ];
+
+  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');
+
+  /**
+   * This module is for normalizing events. Mouse and Touch events will be
+   * collected here, and fire PointerEvents that have the same semantics, no
+   * matter the source.
+   * Events fired:
+   *   - pointerdown: a pointing is added
+   *   - pointerup: a pointer is removed
+   *   - pointermove: a pointer is moved
+   *   - pointerover: a pointer crosses into an element
+   *   - pointerout: a pointer leaves an element
+   *   - pointercancel: a pointer will no longer generate events
+   */
+  var dispatcher = {
+    pointermap: new scope.PointerMap(),
+    eventMap: Object.create(null),
+    captureInfo: Object.create(null),
+    // Scope objects for native events.
+    // This exists for ease of testing.
+    eventSources: Object.create(null),
+    eventSourceList: [],
+    /**
+     * Add a new event source that will generate pointer events.
+     *
+     * `inSource` must contain an array of event names named `events`, and
+     * functions with the names specified in the `events` array.
+     * @param {string} name A name for the event source
+     * @param {Object} source A new source of platform events.
+     */
+    registerSource: function(name, source) {
+      var s = source;
+      var newEvents = s.events;
+      if (newEvents) {
+        newEvents.forEach(function(e) {
+          if (s[e]) {
+            this.eventMap[e] = s[e].bind(s);
+          }
+        }, this);
+        this.eventSources[name] = s;
+        this.eventSourceList.push(s);
+      }
+    },
+    register: function(element) {
+      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);
+      }
+    },
+    unregister: function(element) {
+      var l = this.eventSourceList.length;
+      for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {
+        // call eventsource register
+        es.unregister.call(es, element);
+      }
+    },
+    contains: scope.external.contains || function(container, contained) {
+      return container.contains(contained);
+    },
+    // EVENTS
+    down: function(inEvent) {
+      inEvent.bubbles = true;
+      this.fireEvent('pointerdown', inEvent);
+    },
+    move: function(inEvent) {
+      inEvent.bubbles = true;
+      this.fireEvent('pointermove', inEvent);
+    },
+    up: function(inEvent) {
+      inEvent.bubbles = true;
+      this.fireEvent('pointerup', inEvent);
+    },
+    enter: function(inEvent) {
+      inEvent.bubbles = false;
+      this.fireEvent('pointerenter', inEvent);
+    },
+    leave: function(inEvent) {
+      inEvent.bubbles = false;
+      this.fireEvent('pointerleave', inEvent);
+    },
+    over: function(inEvent) {
+      inEvent.bubbles = true;
+      this.fireEvent('pointerover', inEvent);
+    },
+    out: function(inEvent) {
+      inEvent.bubbles = true;
+      this.fireEvent('pointerout', inEvent);
+    },
+    cancel: function(inEvent) {
+      inEvent.bubbles = true;
+      this.fireEvent('pointercancel', inEvent);
+    },
+    leaveOut: function(event) {
+      this.out(event);
+      if (!this.contains(event.target, event.relatedTarget)) {
+        this.leave(event);
+      }
+    },
+    enterOver: function(event) {
+      this.over(event);
+      if (!this.contains(event.target, event.relatedTarget)) {
+        this.enter(event);
+      }
+    },
+    // LISTENER LOGIC
+    eventHandler: function(inEvent) {
+      // This is used to prevent multiple dispatch of pointerevents 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.
+      if (inEvent._handledByPE) {
+        return;
+      }
+      var type = inEvent.type;
+      var fn = this.eventMap && this.eventMap[type];
+      if (fn) {
+        fn(inEvent);
+      }
+      inEvent._handledByPE = true;
+    },
+    // set up event listeners
+    listen: function(target, events) {
+      events.forEach(function(e) {
+        this.addEvent(target, e);
+      }, this);
+    },
+    // remove event listeners
+    unlisten: function(target, events) {
+      events.forEach(function(e) {
+        this.removeEvent(target, e);
+      }, this);
+    },
+    addEvent: scope.external.addEvent || function(target, eventName) {
+      target.addEventListener(eventName, this.boundHandler);
+    },
+    removeEvent: scope.external.removeEvent || function(target, eventName) {
+      target.removeEventListener(eventName, this.boundHandler);
+    },
+    // EVENT CREATION AND TRACKING
+    /**
+     * Creates a new Event of type `inType`, based on the information in
+     * `inEvent`.
+     *
+     * @param {string} inType A string representing the type of event to create
+     * @param {Event} inEvent A platform event with a target
+     * @return {Event} A PointerEvent of type `inType`
+     */
+    makeEvent: function(inType, inEvent) {
+      // relatedTarget must be null if pointer is captured
+      if (this.captureInfo[inEvent.pointerId]) {
+        inEvent.relatedTarget = null;
+      }
+      var e = new PointerEvent(inType, inEvent);
+      if (inEvent.preventDefault) {
+        e.preventDefault = inEvent.preventDefault;
+      }
+      e._target = e._target || inEvent.target;
+      return e;
+    },
+    // make and dispatch an event in one call
+    fireEvent: function(inType, inEvent) {
+      var e = this.makeEvent(inType, inEvent);
+      return this.dispatchEvent(e);
+    },
+    /**
+     * Returns a snapshot of inEvent, with writable properties.
+     *
+     * @param {Event} inEvent An event that contains properties to copy.
+     * @return {Object} An object containing shallow copies of `inEvent`'s
+     *    properties.
+     */
+    cloneEvent: function(inEvent) {
+      var eventCopy = Object.create(null), p;
+      for (var i = 0; i < CLONE_PROPS.length; i++) {
+        p = CLONE_PROPS[i];
+        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];
+        // Work around SVGInstanceElement shadow tree
+        // Return the <use> element that is represented by the instance for Safari, Chrome, IE.
+        // This is the behavior implemented by Firefox.
+        if (HAS_SVG_INSTANCE && (p === 'target' || p === 'relatedTarget')) {
+          if (eventCopy[p] instanceof SVGElementInstance) {
+            eventCopy[p] = eventCopy[p].correspondingUseElement;
+          }
+        }
+      }
+      // keep the semantics of preventDefault
+      if (inEvent.preventDefault) {
+        eventCopy.preventDefault = function() {
+          inEvent.preventDefault();
+        };
+      }
+      return eventCopy;
+    },
+    getTarget: function(inEvent) {
+      // if pointer capture is set, route all events for the specified pointerId
+      // to the capture target
+      return this.captureInfo[inEvent.pointerId] || inEvent._target;
+    },
+    setCapture: function(inPointerId, inTarget) {
+      if (this.captureInfo[inPointerId]) {
+        this.releaseCapture(inPointerId);
+      }
+      this.captureInfo[inPointerId] = inTarget;
+      var e = document.createEvent('Event');
+      e.initEvent('gotpointercapture', true, false);
+      e.pointerId = inPointerId;
+      this.implicitRelease = this.releaseCapture.bind(this, inPointerId);
+      document.addEventListener('pointerup', this.implicitRelease);
+      document.addEventListener('pointercancel', this.implicitRelease);
+      e._target = inTarget;
+      this.asyncDispatchEvent(e);
+    },
+    releaseCapture: function(inPointerId) {
+      var t = this.captureInfo[inPointerId];
+      if (t) {
+        var e = document.createEvent('Event');
+        e.initEvent('lostpointercapture', true, false);
+        e.pointerId = inPointerId;
+        this.captureInfo[inPointerId] = undefined;
+        document.removeEventListener('pointerup', this.implicitRelease);
+        document.removeEventListener('pointercancel', this.implicitRelease);
+        e._target = t;
+        this.asyncDispatchEvent(e);
+      }
+    },
+    /**
+     * Dispatches the event to its target.
+     *
+     * @param {Event} inEvent The event to be dispatched.
+     * @return {Boolean} True if an event handler returns true, false otherwise.
+     */
+    dispatchEvent: scope.external.dispatchEvent || function(inEvent) {
+      var t = this.getTarget(inEvent);
+      if (t) {
+        return t.dispatchEvent(inEvent);
+      }
+    },
+    asyncDispatchEvent: function(inEvent) {
+      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent));
+    }
+  };
+  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);
+  scope.dispatcher = dispatcher;
+  scope.register = dispatcher.register.bind(dispatcher);
+  scope.unregister = dispatcher.unregister.bind(dispatcher);
+})(window.PointerEventsPolyfill);
+
+/*
+ * 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.
+ */
+
+/**
+ * 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);
+        }
+      }.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);
+      }
+    }
+  };
+
+  if (!MO) {
+    Installer.prototype.watchSubtree = function(){
+      console.warn('PointerEventsPolyfill: MutationObservers not found, touch-action will not be dynamically detected');
+    };
+  }
+
+  scope.Installer = Installer;
+})(window.PointerEventsPolyfill);
+
+/*
+ * 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 dispatcher = scope.dispatcher;
+  var pointermap = dispatcher.pointermap;
+  // radius around touchend that swallows mouse events
+  var DEDUP_DIST = 25;
+
+  var WHICH_TO_BUTTONS = [0, 1, 4, 2];
+
+  var HAS_BUTTONS = false;
+  try {
+    HAS_BUTTONS = new MouseEvent('test', {buttons: 1}).buttons === 1;
+  } catch (e) {}
+
+  // handler block for native mouse events
+  var mouseEvents = {
+    POINTER_ID: 1,
+    POINTER_TYPE: 'mouse',
+    events: [
+      'mousedown',
+      'mousemove',
+      'mouseup',
+      'mouseover',
+      'mouseout'
+    ],
+    register: function(target) {
+      dispatcher.listen(target, this.events);
+    },
+    unregister: function(target) {
+      dispatcher.unlisten(target, this.events);
+    },
+    lastTouches: [],
+    // collide with the global mouse listener
+    isEventSimulatedFromTouch: function(inEvent) {
+      var lts = this.lastTouches;
+      var x = inEvent.clientX, y = inEvent.clientY;
+      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {
+        // simulated mouse events will be swallowed near a primary touchend
+        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);
+        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {
+          return true;
+        }
+      }
+    },
+    prepareEvent: function(inEvent) {
+      var e = dispatcher.cloneEvent(inEvent);
+      // forward mouse preventDefault
+      var pd = e.preventDefault;
+      e.preventDefault = function() {
+        inEvent.preventDefault();
+        pd();
+      };
+      e.pointerId = this.POINTER_ID;
+      e.isPrimary = true;
+      e.pointerType = this.POINTER_TYPE;
+      if (!HAS_BUTTONS) {
+        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;
+      }
+      return e;
+    },
+    mousedown: function(inEvent) {
+      if (!this.isEventSimulatedFromTouch(inEvent)) {
+        var p = pointermap.has(this.POINTER_ID);
+        // TODO(dfreedman) workaround for some elements not sending mouseup
+        // http://crbug/149091
+        if (p) {
+          this.cancel(inEvent);
+        }
+        var e = this.prepareEvent(inEvent);
+        pointermap.set(this.POINTER_ID, inEvent);
+        dispatcher.down(e);
+      }
+    },
+    mousemove: function(inEvent) {
+      if (!this.isEventSimulatedFromTouch(inEvent)) {
+        var e = this.prepareEvent(inEvent);
+        dispatcher.move(e);
+      }
+    },
+    mouseup: function(inEvent) {
+      if (!this.isEventSimulatedFromTouch(inEvent)) {
+        var p = pointermap.get(this.POINTER_ID);
+        if (p && p.button === inEvent.button) {
+          var e = this.prepareEvent(inEvent);
+          dispatcher.up(e);
+          this.cleanupMouse();
+        }
+      }
+    },
+    mouseover: function(inEvent) {
+      if (!this.isEventSimulatedFromTouch(inEvent)) {
+        var e = this.prepareEvent(inEvent);
+        dispatcher.enterOver(e);
+      }
+    },
+    mouseout: function(inEvent) {
+      if (!this.isEventSimulatedFromTouch(inEvent)) {
+        var e = this.prepareEvent(inEvent);
+        dispatcher.leaveOut(e);
+      }
+    },
+    cancel: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      dispatcher.cancel(e);
+      this.cleanupMouse();
+    },
+    cleanupMouse: function() {
+      pointermap['delete'](this.POINTER_ID);
+    }
+  };
+
+  scope.mouseEvents = mouseEvents;
+})(window.PointerEventsPolyfill);
+
+/*
+ * 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 dispatcher = scope.dispatcher;
+  var captureInfo = dispatcher.captureInfo;
+  var findTarget = scope.findTarget;
+  var allShadows = scope.targetFinding.allShadows.bind(scope.targetFinding);
+  var pointermap = dispatcher.pointermap;
+  var touchMap = Array.prototype.map.call.bind(Array.prototype.map);
+  // This should be long enough to ignore compat mouse events made by touch
+  var DEDUP_TIMEOUT = 2500;
+  var CLICK_COUNT_TIMEOUT = 200;
+  var ATTRIB = 'touch-action';
+  var INSTALLER;
+  // The presence of touch event handlers blocks scrolling, and so we must be careful to
+  // avoid adding handlers unnecessarily.  Chrome plans to add a touch-action-delay property
+  // (crbug.com/329559) to address this, and once we have that we can opt-in to a simpler
+  // handler registration mechanism.  Rather than try to predict how exactly to opt-in to
+  // that we'll just leave this disabled until there is a build of Chrome to test.
+  var HAS_TOUCH_ACTION_DELAY = false;
+  
+  // handler block for native touch events
+  var touchEvents = {
+    events: [
+      'touchstart',
+      'touchmove',
+      'touchend',
+      'touchcancel'
+    ],
+    register: function(target) {
+      if (HAS_TOUCH_ACTION_DELAY) {
+        dispatcher.listen(target, this.events);
+      } else {
+        INSTALLER.enableOnSubtree(target);
+      }
+    },
+    unregister: function(target) {
+      if (HAS_TOUCH_ACTION_DELAY) {
+        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);
+      }
+    },
+    scrollTypes: {
+      EMITTER: 'none',
+      XSCROLLER: 'pan-x',
+      YSCROLLER: 'pan-y',
+      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/
+    },
+    touchActionToScrollType: function(touchAction) {
+      var t = touchAction;
+      var st = this.scrollTypes;
+      if (t === 'none') {
+        return 'none';
+      } else if (t === st.XSCROLLER) {
+        return 'X';
+      } else if (t === st.YSCROLLER) {
+        return 'Y';
+      } else if (st.SCROLLER.exec(t)) {
+        return 'XY';
+      }
+    },
+    POINTER_TYPE: 'touch',
+    firstTouch: null,
+    isPrimaryTouch: function(inTouch) {
+      return this.firstTouch === inTouch.identifier;
+    },
+    setPrimaryTouch: function(inTouch) {
+      // set primary touch if there no pointers, or the only pointer is the mouse
+      if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {
+        this.firstTouch = inTouch.identifier;
+        this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};
+        this.scrolling = false;
+        this.cancelResetClickCount();
+      }
+    },
+    removePrimaryPointer: function(inPointer) {
+      if (inPointer.isPrimary) {
+        this.firstTouch = null;
+        this.firstXY = null;
+        this.resetClickCount();
+      }
+    },
+    clickCount: 0,
+    resetId: null,
+    resetClickCount: function() {
+      var fn = function() {
+        this.clickCount = 0;
+        this.resetId = null;
+      }.bind(this);
+      this.resetId = setTimeout(fn, CLICK_COUNT_TIMEOUT);
+    },
+    cancelResetClickCount: function() {
+      if (this.resetId) {
+        clearTimeout(this.resetId);
+      }
+    },
+    typeToButtons: function(type) {
+      var ret = 0;
+      if (type === 'touchstart' || type === 'touchmove') {
+        ret = 1;
+      }
+      return ret;
+    },
+    touchToPointer: function(inTouch) {
+      var cte = this.currentTouchEvent;
+      var e = dispatcher.cloneEvent(inTouch);
+      // Spec specifies that pointerId 1 is reserved for Mouse.
+      // Touch identifiers can start at 0.
+      // Add 2 to the touch identifier for compatibility.
+      var id = e.pointerId = inTouch.identifier + 2;
+      e.target = captureInfo[id] || findTarget(e);
+      e.bubbles = true;
+      e.cancelable = true;
+      e.detail = this.clickCount;
+      e.button = 0;
+      e.buttons = this.typeToButtons(cte.type);
+      e.width = inTouch.webkitRadiusX || inTouch.radiusX || 0;
+      e.height = inTouch.webkitRadiusY || inTouch.radiusY || 0;
+      e.pressure = inTouch.webkitForce || inTouch.force || 0.5;
+      e.isPrimary = this.isPrimaryTouch(inTouch);
+      e.pointerType = this.POINTER_TYPE;
+      // forward touch preventDefaults
+      var self = this;
+      e.preventDefault = function() {
+        self.scrolling = false;
+        self.firstXY = null;
+        cte.preventDefault();
+      };
+      return e;
+    },
+    processTouches: function(inEvent, inFunction) {
+      var tl = inEvent.changedTouches;
+      this.currentTouchEvent = inEvent;
+      for (var i = 0, t; i < tl.length; i++) {
+        t = tl[i];
+        inFunction.call(this, this.touchToPointer(t));
+      }
+    },
+    // For single axis scrollers, determines whether the element should emit
+    // pointer events or behave as a scroller
+    shouldScroll: function(inEvent) {
+      if (this.firstXY) {
+        var ret;
+        var scrollAxis = inEvent.currentTarget._scrollType;
+        if (scrollAxis === 'none') {
+          // this element is a touch-action: none, should never scroll
+          ret = false;
+        } else if (scrollAxis === 'XY') {
+          // this element should always scroll
+          ret = true;
+        } else {
+          var t = inEvent.changedTouches[0];
+          // check the intended scroll axis, and other axis
+          var a = scrollAxis;
+          var oa = scrollAxis === 'Y' ? 'X' : 'Y';
+          var da = Math.abs(t['client' + a] - this.firstXY[a]);
+          var doa = Math.abs(t['client' + oa] - this.firstXY[oa]);
+          // if delta in the scroll axis > delta other axis, scroll instead of
+          // making events
+          ret = da >= doa;
+        }
+        this.firstXY = null;
+        return ret;
+      }
+    },
+    findTouch: function(inTL, inId) {
+      for (var i = 0, l = inTL.length, t; i < l && (t = inTL[i]); i++) {
+        if (t.identifier === inId) {
+          return true;
+        }
+      }
+    },
+    // In some instances, a touchstart can happen without a touchend. This
+    // leaves the pointermap in a broken state.
+    // Therefore, on every touchstart, we remove the touches that did not fire a
+    // touchend event.
+    // To keep state globally consistent, we fire a
+    // pointercancel for this "abandoned" touch
+    vacuumTouches: function(inEvent) {
+      var tl = inEvent.touches;
+      // pointermap.pointers() should be < tl.length here, as the touchstart has not
+      // been processed yet.
+      if (pointermap.pointers() >= tl.length) {
+        var d = [];
+        pointermap.forEach(function(value, key) {
+          // Never remove pointerId == 1, which is mouse.
+          // Touch identifiers are 2 smaller than their pointerId, which is the
+          // index in pointermap.
+          if (key !== 1 && !this.findTouch(tl, key - 2)) {
+            var p = value.out;
+            d.push(p);
+          }
+        }, this);
+        d.forEach(this.cancelOut, this);
+      }
+    },
+    touchstart: function(inEvent) {
+      this.vacuumTouches(inEvent);
+      this.setPrimaryTouch(inEvent.changedTouches[0]);
+      this.dedupSynthMouse(inEvent);
+      if (!this.scrolling) {
+        this.clickCount++;
+        this.processTouches(inEvent, this.overDown);
+      }
+    },
+    overDown: function(inPointer) {
+      var p = pointermap.set(inPointer.pointerId, {
+        target: inPointer.target,
+        out: inPointer,
+        outTarget: inPointer.target
+      });
+      dispatcher.over(inPointer);
+      dispatcher.enter(inPointer);
+      dispatcher.down(inPointer);
+    },
+    touchmove: function(inEvent) {
+      if (!this.scrolling) {
+        if (this.shouldScroll(inEvent)) {
+          this.scrolling = true;
+          this.touchcancel(inEvent);
+        } else {
+          inEvent.preventDefault();
+          this.processTouches(inEvent, this.moveOverOut);
+        }
+      }
+    },
+    moveOverOut: function(inPointer) {
+      var event = inPointer;
+      var pointer = pointermap.get(event.pointerId);
+      // a finger drifted off the screen, ignore it
+      if (!pointer) {
+        return;
+      }
+      var outEvent = pointer.out;
+      var outTarget = pointer.outTarget;
+      dispatcher.move(event);
+      if (outEvent && outTarget !== event.target) {
+        outEvent.relatedTarget = event.target;
+        event.relatedTarget = outTarget;
+        // recover from retargeting by shadow
+        outEvent.target = outTarget;
+        if (event.target) {
+          dispatcher.leaveOut(outEvent);
+          dispatcher.enterOver(event);
+        } else {
+          // clean up case when finger leaves the screen
+          event.target = outTarget;
+          event.relatedTarget = null;
+          this.cancelOut(event);
+        }
+      }
+      pointer.out = event;
+      pointer.outTarget = event.target;
+    },
+    touchend: function(inEvent) {
+      this.dedupSynthMouse(inEvent);
+      this.processTouches(inEvent, this.upOut);
+    },
+    upOut: function(inPointer) {
+      if (!this.scrolling) {
+        dispatcher.up(inPointer);
+        dispatcher.out(inPointer);
+        dispatcher.leave(inPointer);
+      }
+      this.cleanUpPointer(inPointer);
+    },
+    touchcancel: function(inEvent) {
+      this.processTouches(inEvent, this.cancelOut);
+    },
+    cancelOut: function(inPointer) {
+      dispatcher.cancel(inPointer);
+      dispatcher.out(inPointer);
+      dispatcher.leave(inPointer);
+      this.cleanUpPointer(inPointer);
+    },
+    cleanUpPointer: function(inPointer) {
+      pointermap['delete'](inPointer.pointerId);
+      this.removePrimaryPointer(inPointer);
+    },
+    // prevent synth mouse events from creating pointer events
+    dedupSynthMouse: function(inEvent) {
+      var lts = scope.mouseEvents.lastTouches;
+      var t = inEvent.changedTouches[0];
+      // only the primary finger will synth mouse events
+      if (this.isPrimaryTouch(t)) {
+        // remember x/y of last touch
+        var lt = {x: t.clientX, y: t.clientY};
+        lts.push(lt);
+        var fn = (function(lts, lt){
+          var i = lts.indexOf(lt);
+          if (i > -1) {
+            lts.splice(i, 1);
+          }
+        }).bind(null, lts, lt);
+        setTimeout(fn, DEDUP_TIMEOUT);
+      }
+    }
+  };
+
+  if (!HAS_TOUCH_ACTION_DELAY) {
+    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);
+  }
+
+  scope.touchEvents = touchEvents;
+})(window.PointerEventsPolyfill);
+
+/*
+ * 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 dispatcher = scope.dispatcher;
+  var pointermap = dispatcher.pointermap;
+  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';
+  var msEvents = {
+    events: [
+      'MSPointerDown',
+      'MSPointerMove',
+      'MSPointerUp',
+      'MSPointerOut',
+      'MSPointerOver',
+      'MSPointerCancel',
+      'MSGotPointerCapture',
+      'MSLostPointerCapture'
+    ],
+    register: function(target) {
+      dispatcher.listen(target, this.events);
+    },
+    unregister: function(target) {
+      dispatcher.unlisten(target, this.events);
+    },
+    POINTER_TYPES: [
+      '',
+      'unavailable',
+      'touch',
+      'pen',
+      'mouse'
+    ],
+    prepareEvent: function(inEvent) {
+      var e = inEvent;
+      if (HAS_BITMAP_TYPE) {
+        e = dispatcher.cloneEvent(inEvent);
+        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];
+      }
+      return e;
+    },
+    cleanup: function(id) {
+      pointermap['delete'](id);
+    },
+    MSPointerDown: function(inEvent) {
+      pointermap.set(inEvent.pointerId, inEvent);
+      var e = this.prepareEvent(inEvent);
+      dispatcher.down(e);
+    },
+    MSPointerMove: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      dispatcher.move(e);
+    },
+    MSPointerUp: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      dispatcher.up(e);
+      this.cleanup(inEvent.pointerId);
+    },
+    MSPointerOut: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      dispatcher.leaveOut(e);
+    },
+    MSPointerOver: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      dispatcher.enterOver(e);
+    },
+    MSPointerCancel: function(inEvent) {
+      var e = this.prepareEvent(inEvent);
+      dispatcher.cancel(e);
+      this.cleanup(inEvent.pointerId);
+    },
+    MSLostPointerCapture: function(inEvent) {
+      var e = dispatcher.makeEvent('lostpointercapture', inEvent);
+      dispatcher.dispatchEvent(e);
+    },
+    MSGotPointerCapture: function(inEvent) {
+      var e = dispatcher.makeEvent('gotpointercapture', inEvent);
+      dispatcher.dispatchEvent(e);
+    }
+  };
+
+  scope.msEvents = msEvents;
+})(window.PointerEventsPolyfill);
+
+/*
+ * 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.
+ */
+
+/**
+ * This module contains the handlers for native platform events.
+ * From here, the dispatcher is called to create unified pointer events.
+ * Included are touch events (v1), mouse events, and MSPointerEvents.
+ */
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+
+  // only activate if this platform does not have pointer events
+  if (window.PointerEvent !== scope.PointerEvent) {
+
+    if (window.navigator.msPointerEnabled) {
+      var tp = window.navigator.msMaxTouchPoints;
+      Object.defineProperty(window.navigator, 'maxTouchPoints', {
+        value: tp,
+        enumerable: true
+      });
+      dispatcher.registerSource('ms', scope.msEvents);
+    } else {
+      dispatcher.registerSource('mouse', scope.mouseEvents);
+      if (window.ontouchstart !== undefined) {
+        dispatcher.registerSource('touch', scope.touchEvents);
+      }
+    }
+
+    dispatcher.register(document);
+  }
+})(window.PointerEventsPolyfill);
+
+/*
+ * 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 dispatcher = scope.dispatcher;
+  var n = window.navigator;
+  var s, r;
+  function assertDown(id) {
+    if (!dispatcher.pointermap.has(id)) {
+      throw new Error('InvalidPointerId');
+    }
+  }
+  if (n.msPointerEnabled) {
+    s = function(pointerId) {
+      assertDown(pointerId);
+      this.msSetPointerCapture(pointerId);
+    };
+    r = function(pointerId) {
+      assertDown(pointerId);
+      this.msReleasePointerCapture(pointerId);
+    };
+  } else {
+    s = function setPointerCapture(pointerId) {
+      assertDown(pointerId);
+      dispatcher.setCapture(pointerId, this);
+    };
+    r = function releasePointerCapture(pointerId) {
+      assertDown(pointerId);
+      dispatcher.releaseCapture(pointerId, this);
+    };
+  }
+  if (window.Element && !Element.prototype.setPointerCapture) {
+    Object.defineProperties(Element.prototype, {
+      'setPointerCapture': {
+        value: s
+      },
+      'releasePointerCapture': {
+        value: r
+      }
+    });
+  }
+})(window.PointerEventsPolyfill);
+
+/*
+ * 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.
+ */
+
+/**
+ * PointerGestureEvent is the constructor for all PointerGesture events.
+ *
+ * @module PointerGestures
+ * @class PointerGestureEvent
+ * @extends UIEvent
+ * @constructor
+ * @param {String} inType Event type
+ * @param {Object} [inDict] Dictionary of properties to initialize on the event
+ */
+
+function PointerGestureEvent(inType, inDict) {
+  var dict = inDict || {};
+  var e = document.createEvent('Event');
+  var props = {
+    bubbles: Boolean(dict.bubbles) === dict.bubbles || true,
+    cancelable: Boolean(dict.cancelable) === dict.cancelable || true
+  };
+
+  e.initEvent(inType, props.bubbles, props.cancelable);
+
+  var keys = Object.keys(dict), k;
+  for (var i = 0; i < keys.length; i++) {
+    k = keys[i];
+    e[k] = dict[k];
+  }
+
+  e.preventTap = this.preventTap;
+
+  return e;
+}
+
+/**
+ * Allows for any gesture to prevent the tap gesture.
+ *
+ * @method preventTap
+ */
+PointerGestureEvent.prototype.preventTap = function() {
+  this.tapPrevented = true;
+};
+
+
+/*
+ * 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) {
+  /**
+   * This class contains the gesture recognizers that create the PointerGesture
+   * events.
+   *
+   * @class PointerGestures
+   * @static
+   */
+  scope = scope || {};
+  scope.utils = {
+    LCA: {
+      // Determines the lowest node in the ancestor chain of a and b
+      find: function(a, b) {
+        if (a === b) {
+          return a;
+        }
+        // fast case, a is a direct descendant of b or vice versa
+        if (a.contains) {
+          if (a.contains(b)) {
+            return a;
+          }
+          if (b.contains(a)) {
+            return b;
+          }
+        }
+        var adepth = this.depth(a);
+        var bdepth = this.depth(b);
+        var d = adepth - bdepth;
+        if (d > 0) {
+          a = this.walk(a, d);
+        } else {
+          b = this.walk(b, -d);
+        }
+        while(a && b && a !== b) {
+          a = this.walk(a, 1);
+          b = this.walk(b, 1);
+        }
+        return a;
+      },
+      walk: function(n, u) {
+        for (var i = 0; i < u; i++) {
+          n = n.parentNode;
+        }
+        return n;
+      },
+      depth: function(n) {
+        var d = 0;
+        while(n) {
+          d++;
+          n = n.parentNode;
+        }
+        return d;
+      }
+    }
+  };
+  scope.findLCA = function(a, b) {
+    return scope.utils.LCA.find(a, b);
+  }
+  window.PointerGestures = scope;
+})(window.PointerGestures);
+
+/*
+ * 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.
+ */
+
+/**
+ * This module implements an map of pointer states
+ */
+(function(scope) {
+  var USE_MAP = window.Map && window.Map.prototype.forEach;
+  var POINTERS_FN = function(){ return this.size; };
+  function PointerMap() {
+    if (USE_MAP) {
+      var m = new Map();
+      m.pointers = POINTERS_FN;
+      return m;
+    } else {
+      this.keys = [];
+      this.values = [];
+    }
+  }
+
+  PointerMap.prototype = {
+    set: function(inId, inEvent) {
+      var i = this.keys.indexOf(inId);
+      if (i > -1) {
+        this.values[i] = inEvent;
+      } else {
+        this.keys.push(inId);
+        this.values.push(inEvent);
+      }
+    },
+    has: function(inId) {
+      return this.keys.indexOf(inId) > -1;
+    },
+    'delete': function(inId) {
+      var i = this.keys.indexOf(inId);
+      if (i > -1) {
+        this.keys.splice(i, 1);
+        this.values.splice(i, 1);
+      }
+    },
+    get: function(inId) {
+      var i = this.keys.indexOf(inId);
+      return this.values[i];
+    },
+    clear: function() {
+      this.keys.length = 0;
+      this.values.length = 0;
+    },
+    // return value, key, map
+    forEach: function(callback, thisArg) {
+      this.values.forEach(function(v, i) {
+        callback.call(thisArg, v, this.keys[i], this);
+      }, this);
+    },
+    pointers: function() {
+      return this.keys.length;
+    }
+  };
+
+  scope.PointerMap = PointerMap;
+})(window.PointerGestures);
+
+/*
+ * 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 CLONE_PROPS = [
+    // MouseEvent
+    'bubbles',
+    'cancelable',
+    'view',
+    'detail',
+    'screenX',
+    'screenY',
+    'clientX',
+    'clientY',
+    'ctrlKey',
+    'altKey',
+    'shiftKey',
+    'metaKey',
+    'button',
+    'relatedTarget',
+    // DOM Level 3
+    'buttons',
+    // PointerEvent
+    'pointerId',
+    'width',
+    'height',
+    'pressure',
+    'tiltX',
+    'tiltY',
+    'pointerType',
+    'hwTimestamp',
+    'isPrimary',
+    // event instance
+    'type',
+    'target',
+    'currentTarget',
+    'screenX',
+    'screenY',
+    'pageX',
+    'pageY',
+    'tapPrevented'
+  ];
+
+  var CLONE_DEFAULTS = [
+    // MouseEvent
+    false,
+    false,
+    null,
+    null,
+    0,
+    0,
+    0,
+    0,
+    false,
+    false,
+    false,
+    false,
+    0,
+    null,
+    // DOM Level 3
+    0,
+    // PointerEvent
+    0,
+    0,
+    0,
+    0,
+    0,
+    0,
+    '',
+    0,
+    false,
+    // event instance
+    '',
+    null,
+    null,
+    0,
+    0,
+    0,
+    0
+  ];
+
+  var dispatcher = {
+    handledEvents: new WeakMap(),
+    targets: new WeakMap(),
+    handlers: {},
+    recognizers: {},
+    events: {},
+    // Add a new gesture recognizer to the event listeners.
+    // Recognizer needs an `events` property.
+    registerRecognizer: function(inName, inRecognizer) {
+      var r = inRecognizer;
+      this.recognizers[inName] = r;
+      r.events.forEach(function(e) {
+        if (r[e]) {
+          this.events[e] = true;
+          var f = r[e].bind(r);
+          this.addHandler(e, f);
+        }
+      }, this);
+    },
+    addHandler: function(inEvent, inFn) {
+      var e = inEvent;
+      if (!this.handlers[e]) {
+        this.handlers[e] = [];
+      }
+      this.handlers[e].push(inFn);
+    },
+    // add event listeners for inTarget
+    registerTarget: function(inTarget) {
+      this.listen(Object.keys(this.events), inTarget);
+    },
+    // remove event listeners for inTarget
+    unregisterTarget: function(inTarget) {
+      this.unlisten(Object.keys(this.events), inTarget);
+    },
+    // LISTENER LOGIC
+    eventHandler: function(inEvent) {
+      if (this.handledEvents.get(inEvent)) {
+        return;
+      }
+      var type = inEvent.type, fns = this.handlers[type];
+      if (fns) {
+        this.makeQueue(fns, inEvent);
+      }
+      this.handledEvents.set(inEvent, true);
+    },
+    // queue event for async dispatch
+    makeQueue: function(inHandlerFns, inEvent) {
+      // must clone events to keep the (possibly shadowed) target correct for
+      // async dispatching
+      var e = this.cloneEvent(inEvent);
+      requestAnimationFrame(this.runQueue.bind(this, inHandlerFns, e));
+    },
+    // Dispatch the queued events
+    runQueue: function(inHandlers, inEvent) {
+      this.currentPointerId = inEvent.pointerId;
+      for (var i = 0, f, l = inHandlers.length; (i < l) && (f = inHandlers[i]); i++) {
+        f(inEvent);
+      }
+      this.currentPointerId = 0;
+    },
+    // set up event listeners
+    listen: function(inEvents, inTarget) {
+      inEvents.forEach(function(e) {
+        this.addEvent(e, this.boundHandler, false, inTarget);
+      }, this);
+    },
+    // remove event listeners
+    unlisten: function(inEvents) {
+      inEvents.forEach(function(e) {
+        this.removeEvent(e, this.boundHandler, false, inTarget);
+      }, this);
+    },
+    addEvent: function(inEventName, inEventHandler, inCapture, inTarget) {
+      inTarget.addEventListener(inEventName, inEventHandler, inCapture);
+    },
+    removeEvent: function(inEventName, inEventHandler, inCapture, inTarget) {
+      inTarget.removeEventListener(inEventName, inEventHandler, inCapture);
+    },
+    // EVENT CREATION AND TRACKING
+    // Creates a new Event of type `inType`, based on the information in
+    // `inEvent`.
+    makeEvent: function(inType, inDict) {
+      return new PointerGestureEvent(inType, inDict);
+    },
+    /*
+     * Returns a snapshot of inEvent, with writable properties.
+     *
+     * @method cloneEvent
+     * @param {Event} inEvent An event that contains properties to copy.
+     * @return {Object} An object containing shallow copies of `inEvent`'s
+     *    properties.
+     */
+    cloneEvent: function(inEvent) {
+      var eventCopy = {}, p;
+      for (var i = 0; i < CLONE_PROPS.length; i++) {
+        p = CLONE_PROPS[i];
+        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];
+      }
+      return eventCopy;
+    },
+    // Dispatches the event to its target.
+    dispatchEvent: function(inEvent, inTarget) {
+      var t = inTarget || this.targets.get(inEvent);
+      if (t) {
+        t.dispatchEvent(inEvent);
+        if (inEvent.tapPrevented) {
+          this.preventTap(this.currentPointerId);
+        }
+      }
+    },
+    asyncDispatchEvent: function(inEvent, inTarget) {
+      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent, inTarget));
+    },
+    preventTap: function(inPointerId) {
+      var t = this.recognizers.tap;
+      if (t){
+        t.preventTap(inPointerId);
+      }
+    }
+  };
+  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);
+  // recognizers call into the dispatcher and load later
+  // solve the chicken and egg problem by having registerScopes module run last
+  dispatcher.registerQueue = [];
+  dispatcher.immediateRegister = false;
+  scope.dispatcher = dispatcher;
+  /**
+   * Enable gesture events for a given scope, typically
+   * [ShadowRoots](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-root-object).
+   *
+   * @for PointerGestures
+   * @method register
+   * @param {ShadowRoot} scope A top level scope to enable gesture
+   * support on.
+   */
+  scope.register = function(inScope) {
+    if (dispatcher.immediateRegister) {
+      var pe = window.PointerEventsPolyfill;
+      if (pe) {
+        pe.register(inScope);
+      }
+      scope.dispatcher.registerTarget(inScope);
+    } else {
+      dispatcher.registerQueue.push(inScope);
+    }
+  };
+  scope.register(document);
+})(window.PointerGestures);
+
+/*
+ * 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.
+ */
+
+/**
+ * This event is fired when a pointer is held down for 200ms.
+ *
+ * @module PointerGestures
+ * @submodule Events
+ * @class hold
+ */
+/**
+ * Type of pointer that made the holding event.
+ * @type String
+ * @property pointerType
+ */
+/**
+ * Screen X axis position of the held pointer
+ * @type Number
+ * @property clientX
+ */
+/**
+ * Screen Y axis position of the held pointer
+ * @type Number
+ * @property clientY
+ */
+/**
+ * Type of pointer that made the holding event.
+ * @type String
+ * @property pointerType
+ */
+/**
+ * This event is fired every 200ms while a pointer is held down.
+ *
+ * @class holdpulse
+ * @extends hold
+ */
+/**
+ * Milliseconds pointer has been held down.
+ * @type Number
+ * @property holdTime
+ */
+/**
+ * This event is fired when a held pointer is released or moved.
+ *
+ * @class released
+ */
+
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var hold = {
+    // wait at least HOLD_DELAY ms between hold and pulse events
+    HOLD_DELAY: 200,
+    // pointer can move WIGGLE_THRESHOLD pixels before not counting as a hold
+    WIGGLE_THRESHOLD: 16,
+    events: [
+      'pointerdown',
+      'pointermove',
+      'pointerup',
+      'pointercancel'
+    ],
+    heldPointer: null,
+    holdJob: null,
+    pulse: function() {
+      var hold = Date.now() - this.heldPointer.timeStamp;
+      var type = this.held ? 'holdpulse' : 'hold';
+      this.fireHold(type, hold);
+      this.held = true;
+    },
+    cancel: function() {
+      clearInterval(this.holdJob);
+      if (this.held) {
+        this.fireHold('release');
+      }
+      this.held = false;
+      this.heldPointer = null;
+      this.target = null;
+      this.holdJob = null;
+    },
+    pointerdown: function(inEvent) {
+      if (inEvent.isPrimary && !this.heldPointer) {
+        this.heldPointer = inEvent;
+        this.target = inEvent.target;
+        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);
+      }
+    },
+    pointerup: function(inEvent) {
+      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {
+        this.cancel();
+      }
+    },
+    pointercancel: function(inEvent) {
+      this.cancel();
+    },
+    pointermove: function(inEvent) {
+      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {
+        var x = inEvent.clientX - this.heldPointer.clientX;
+        var y = inEvent.clientY - this.heldPointer.clientY;
+        if ((x * x + y * y) > this.WIGGLE_THRESHOLD) {
+          this.cancel();
+        }
+      }
+    },
+    fireHold: function(inType, inHoldTime) {
+      var p = {
+        pointerType: this.heldPointer.pointerType,
+        clientX: this.heldPointer.clientX,
+        clientY: this.heldPointer.clientY
+      };
+      if (inHoldTime) {
+        p.holdTime = inHoldTime;
+      }
+      var e = dispatcher.makeEvent(inType, p);
+      dispatcher.dispatchEvent(e, this.target);
+      if (e.tapPrevented) {
+        dispatcher.preventTap(this.heldPointer.pointerId);
+      }
+    }
+  };
+  dispatcher.registerRecognizer('hold', hold);
+})(window.PointerGestures);
+
+/*
+ * 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.
+ */
+
+/**
+ * This event denotes the beginning of a series of tracking events.
+ *
+ * @module PointerGestures
+ * @submodule Events
+ * @class trackstart
+ */
+/**
+ * Pixels moved in the x direction since trackstart.
+ * @type Number
+ * @property dx
+ */
+/**
+ * Pixes moved in the y direction since trackstart.
+ * @type Number
+ * @property dy
+ */
+/**
+ * Pixels moved in the x direction since the last track.
+ * @type Number
+ * @property ddx
+ */
+/**
+ * Pixles moved in the y direction since the last track.
+ * @type Number
+ * @property ddy
+ */
+/**
+ * The clientX position of the track gesture.
+ * @type Number
+ * @property clientX
+ */
+/**
+ * The clientY position of the track gesture.
+ * @type Number
+ * @property clientY
+ */
+/**
+ * The pageX position of the track gesture.
+ * @type Number
+ * @property pageX
+ */
+/**
+ * The pageY position of the track gesture.
+ * @type Number
+ * @property pageY
+ */
+/**
+ * The screenX position of the track gesture.
+ * @type Number
+ * @property screenX
+ */
+/**
+ * The screenY position of the track gesture.
+ * @type Number
+ * @property screenY
+ */
+/**
+ * The last x axis direction of the pointer.
+ * @type Number
+ * @property xDirection
+ */
+/**
+ * The last y axis direction of the pointer.
+ * @type Number
+ * @property yDirection
+ */
+/**
+ * A shared object between all tracking events.
+ * @type Object
+ * @property trackInfo
+ */
+/**
+ * The element currently under the pointer.
+ * @type Element
+ * @property relatedTarget
+ */
+/**
+ * The type of pointer that make the track gesture.
+ * @type String
+ * @property pointerType
+ */
+/**
+ *
+ * This event fires for all pointer movement being tracked.
+ *
+ * @class track
+ * @extends trackstart
+ */
+/**
+ * This event fires when the pointer is no longer being tracked.
+ *
+ * @class trackend
+ * @extends trackstart
+ */
+
+ (function(scope) {
+   var dispatcher = scope.dispatcher;
+   var pointermap = new scope.PointerMap();
+   var track = {
+     events: [
+       'pointerdown',
+       'pointermove',
+       'pointerup',
+       'pointercancel'
+     ],
+     WIGGLE_THRESHOLD: 4,
+     clampDir: function(inDelta) {
+       return inDelta > 0 ? 1 : -1;
+     },
+     calcPositionDelta: function(inA, inB) {
+       var x = 0, y = 0;
+       if (inA && inB) {
+         x = inB.pageX - inA.pageX;
+         y = inB.pageY - inA.pageY;
+       }
+       return {x: x, y: y};
+     },
+     fireTrack: function(inType, inEvent, inTrackingData) {
+       var t = inTrackingData;
+       var d = this.calcPositionDelta(t.downEvent, inEvent);
+       var dd = this.calcPositionDelta(t.lastMoveEvent, inEvent);
+       if (dd.x) {
+         t.xDirection = this.clampDir(dd.x);
+       }
+       if (dd.y) {
+         t.yDirection = this.clampDir(dd.y);
+       }
+       var trackData = {
+         dx: d.x,
+         dy: d.y,
+         ddx: dd.x,
+         ddy: dd.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.target,
+         pointerType: inEvent.pointerType
+       };
+       var e = dispatcher.makeEvent(inType, trackData);
+       t.lastMoveEvent = inEvent;
+       dispatcher.dispatchEvent(e, t.downTarget);
+     },
+     pointerdown: function(inEvent) {
+       if (inEvent.isPrimary && (inEvent.pointerType === 'mouse' ? inEvent.buttons === 1 : true)) {
+         var p = {
+           downEvent: inEvent,
+           downTarget: inEvent.target,
+           trackInfo: {},
+           lastMoveEvent: null,
+           xDirection: 0,
+           yDirection: 0,
+           tracking: false
+         };
+         pointermap.set(inEvent.pointerId, p);
+       }
+     },
+     pointermove: function(inEvent) {
+       var p = pointermap.get(inEvent.pointerId);
+       if (p) {
+         if (!p.tracking) {
+           var d = this.calcPositionDelta(p.downEvent, inEvent);
+           var move = d.x * d.x + d.y * d.y;
+           // 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);
+           }
+         } else {
+           this.fireTrack('track', inEvent, p);
+         }
+       }
+     },
+     pointerup: function(inEvent) {
+       var p = pointermap.get(inEvent.pointerId);
+       if (p) {
+         if (p.tracking) {
+           this.fireTrack('trackend', inEvent, p);
+         }
+         pointermap.delete(inEvent.pointerId);
+       }
+     },
+     pointercancel: function(inEvent) {
+       this.pointerup(inEvent);
+     }
+   };
+   dispatcher.registerRecognizer('track', track);
+ })(window.PointerGestures);
+
+/*
+ * 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.
+ */
+
+/**
+ * This event denotes a rapid down/move/up sequence from a pointer.
+ *
+ * The event is sent to the first element the pointer went down on.
+ *
+ * @module PointerGestures
+ * @submodule Events
+ * @class flick
+ */
+/**
+ * Signed velocity of the flick in the x direction.
+ * @property xVelocity
+ * @type Number
+ */
+/**
+ * Signed velocity of the flick in the y direction.
+ * @type Number
+ * @property yVelocity
+ */
+/**
+ * Unsigned total velocity of the flick.
+ * @type Number
+ * @property velocity
+ */
+/**
+ * Angle of the flick in degrees, with 0 along the
+ * positive x axis.
+ * @type Number
+ * @property angle
+ */
+/**
+ * Axis with the greatest absolute velocity. Denoted
+ * with 'x' or 'y'.
+ * @type String
+ * @property majorAxis
+ */
+/**
+ * Type of the pointer that made the flick.
+ * @type String
+ * @property pointerType
+ */
+
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var flick = {
+    // TODO(dfreedman): value should be low enough for low speed flicks, but
+    // high enough to remove accidental flicks
+    MIN_VELOCITY: 0.5 /* px/ms */,
+    MAX_QUEUE: 4,
+    moveQueue: [],
+    target: null,
+    pointerId: null,
+    events: [
+      'pointerdown',
+      'pointermove',
+      'pointerup',
+      'pointercancel'
+    ],
+    pointerdown: function(inEvent) {
+      if (inEvent.isPrimary && !this.pointerId) {
+        this.pointerId = inEvent.pointerId;
+        this.target = inEvent.target;
+        this.addMove(inEvent);
+      }
+    },
+    pointermove: function(inEvent) {
+      if (inEvent.pointerId === this.pointerId) {
+        this.addMove(inEvent);
+      }
+    },
+    pointerup: function(inEvent) {
+      if (inEvent.pointerId === this.pointerId) {
+        this.fireFlick(inEvent);
+      }
+      this.cleanup();
+    },
+    pointercancel: function(inEvent) {
+      this.cleanup();
+    },
+    cleanup: function() {
+      this.moveQueue = [];
+      this.target = null;
+      this.pointerId = null;
+    },
+    addMove: function(inEvent) {
+      if (this.moveQueue.length >= this.MAX_QUEUE) {
+        this.moveQueue.shift();
+      }
+      this.moveQueue.push(inEvent);
+    },
+    fireFlick: function(inEvent) {
+      var e = inEvent;
+      var l = this.moveQueue.length;
+      var dt, dx, dy, tx, ty, tv, x = 0, y = 0, v = 0;
+      // flick based off the fastest segment of movement
+      for (var i = 0, m; i < l && (m = this.moveQueue[i]); i++) {
+        dt = e.timeStamp - m.timeStamp;
+        dx = e.clientX - m.clientX, dy = e.clientY - m.clientY;
+        tx = dx / dt, ty = dy / dt, tv = Math.sqrt(tx * tx + ty * ty);
+        if (tv > v) {
+          x = tx, y = ty, v = tv;
+        }
+      }
+      var ma = Math.abs(x) > Math.abs(y) ? 'x' : 'y';
+      var a = this.calcAngle(x, y);
+      if (Math.abs(v) >= this.MIN_VELOCITY) {
+        var ev = dispatcher.makeEvent('flick', {
+          xVelocity: x,
+          yVelocity: y,
+          velocity: v,
+          angle: a,
+          majorAxis: ma,
+          pointerType: inEvent.pointerType
+        });
+        dispatcher.dispatchEvent(ev, this.target);
+      }
+    },
+    calcAngle: function(inX, inY) {
+      return (Math.atan2(inY, inX) * 180 / Math.PI);
+    }
+  };
+  dispatcher.registerRecognizer('flick', flick);
+})(window.PointerGestures);
+
+/*
+ * 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.
+ */
+
+/*
+ * Basic strategy: find the farthest apart points, use as diameter of circle
+ * react to size change and rotation of the chord
+ */
+
+/**
+ * @module PointerGestures
+ * @submodule Events
+ * @class pinch
+ */
+/**
+ * Scale of the pinch zoom gesture
+ * @property scale
+ * @type Number
+ */
+/**
+ * Center X position of pointers causing pinch
+ * @property centerX
+ * @type Number
+ */
+/**
+ * Center Y position of pointers causing pinch
+ * @property centerY
+ * @type Number
+ */
+
+/**
+ * @module PointerGestures
+ * @submodule Events
+ * @class rotate
+ */
+/**
+ * Angle (in degrees) of rotation. Measured from starting positions of pointers.
+ * @property angle
+ * @type Number
+ */
+/**
+ * Center X position of pointers causing rotation
+ * @property centerX
+ * @type Number
+ */
+/**
+ * Center Y position of pointers causing rotation
+ * @property centerY
+ * @type Number
+ */
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var pointermap = new scope.PointerMap();
+  var RAD_TO_DEG = 180 / Math.PI;
+  var pinch = {
+    events: [
+      'pointerdown',
+      'pointermove',
+      'pointerup',
+      'pointercancel'
+    ],
+    reference: {},
+    pointerdown: function(ev) {
+      pointermap.set(ev.pointerId, ev);
+      if (pointermap.pointers() == 2) {
+        var points = this.calcChord();
+        var angle = this.calcAngle(points);
+        this.reference = {
+          angle: angle,
+          diameter: points.diameter,
+          target: scope.findLCA(points.a.target, points.b.target)
+        };
+      }
+    },
+    pointerup: function(ev) {
+      pointermap.delete(ev.pointerId);
+    },
+    pointermove: function(ev) {
+      if (pointermap.has(ev.pointerId)) {
+        pointermap.set(ev.pointerId, ev);
+        if (pointermap.pointers() > 1) {
+          this.calcPinchRotate();
+        }
+      }
+    },
+    pointercancel: function(ev) {
+      this.pointerup(ev);
+    },
+    dispatchPinch: function(diameter, points) {
+      var zoom = diameter / this.reference.diameter;
+      var ev = dispatcher.makeEvent('pinch', {
+        scale: zoom,
+        centerX: points.center.x,
+        centerY: points.center.y
+      });
+      dispatcher.dispatchEvent(ev, this.reference.target);
+    },
+    dispatchRotate: function(angle, points) {
+      var diff = Math.round((angle - this.reference.angle) % 360);
+      var ev = dispatcher.makeEvent('rotate', {
+        angle: diff,
+        centerX: points.center.x,
+        centerY: points.center.y
+      });
+      dispatcher.dispatchEvent(ev, this.reference.target);
+    },
+    calcPinchRotate: function() {
+      var points = this.calcChord();
+      var diameter = points.diameter;
+      var angle = this.calcAngle(points);
+      if (diameter != this.reference.diameter) {
+        this.dispatchPinch(diameter, points);
+      }
+      if (angle != this.reference.angle) {
+        this.dispatchRotate(angle, points);
+      }
+    },
+    calcChord: function() {
+      var pointers = [];
+      pointermap.forEach(function(p) {
+        pointers.push(p);
+      });
+      var dist = 0;
+      // start with at least two pointers
+      var points = {a: pointers[0], b: pointers[1]};
+      var x, y, d;
+      for (var i = 0; i < pointers.length; i++) {
+        var a = pointers[i];
+        for (var j = i + 1; j < pointers.length; j++) {
+          var b = pointers[j];
+          x = Math.abs(a.clientX - b.clientX);
+          y = Math.abs(a.clientY - b.clientY);
+          d = x + y;
+          if (d > dist) {
+            dist = d;
+            points = {a: a, b: b};
+          }
+        }
+      }
+      x = Math.abs(points.a.clientX + points.b.clientX) / 2;
+      y = Math.abs(points.a.clientY + points.b.clientY) / 2;
+      points.center = { x: x, y: y };
+      points.diameter = dist;
+      return points;
+    },
+    calcAngle: function(points) {
+      var x = points.a.clientX - points.b.clientX;
+      var y = points.a.clientY - points.b.clientY;
+      return (360 + Math.atan2(y, x) * RAD_TO_DEG) % 360;
+    },
+  };
+  dispatcher.registerRecognizer('pinch', pinch);
+})(window.PointerGestures);
+
+/*
+ * 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.
+ */
+
+/**
+ * This event is fired when a pointer quickly goes down and up, and is used to
+ * denote activation.
+ *
+ * Any gesture event can prevent the tap event from being created by calling
+ * `event.preventTap`.
+ *
+ * Any pointer event can prevent the tap by setting the `tapPrevented` property
+ * on itself.
+ *
+ * @module PointerGestures
+ * @submodule Events
+ * @class tap
+ */
+/**
+ * X axis position of the tap.
+ * @property x
+ * @type Number
+ */
+/**
+ * Y axis position of the tap.
+ * @property y
+ * @type Number
+ */
+/**
+ * Type of the pointer that made the tap.
+ * @property pointerType
+ * @type String
+ */
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  var pointermap = new scope.PointerMap();
+  var tap = {
+    events: [
+      'pointerdown',
+      'pointermove',
+      'pointerup',
+      'pointercancel',
+      'keyup'
+    ],
+    pointerdown: function(inEvent) {
+      if (inEvent.isPrimary && !inEvent.tapPrevented) {
+        pointermap.set(inEvent.pointerId, {
+          target: inEvent.target,
+          buttons: inEvent.buttons,
+          x: inEvent.clientX,
+          y: inEvent.clientY
+        });
+      }
+    },
+    pointermove: function(inEvent) {
+      if (inEvent.isPrimary) {
+        var start = pointermap.get(inEvent.pointerId);
+        if (start) {
+          if (inEvent.tapPrevented) {
+            pointermap.delete(inEvent.pointerId);
+          }
+        }
+      }
+    },
+    shouldTap: function(e, downState) {
+      if (!e.tapPrevented) {
+        if (e.pointerType === 'mouse') {
+          // only allow left click to tap for mouse
+          return downState.buttons === 1;
+        } else {
+          return true;
+        }
+      }
+    },
+    pointerup: function(inEvent) {
+      var start = pointermap.get(inEvent.pointerId);
+      if (start && this.shouldTap(inEvent, start)) {
+        var t = scope.findLCA(start.target, inEvent.target);
+        if (t) {
+          var e = dispatcher.makeEvent('tap', {
+            x: inEvent.clientX,
+            y: inEvent.clientY,
+            detail: inEvent.detail,
+            pointerType: inEvent.pointerType
+          });
+          dispatcher.dispatchEvent(e, t);
+        }
+      }
+      pointermap.delete(inEvent.pointerId);
+    },
+    pointercancel: function(inEvent) {
+      pointermap.delete(inEvent.pointerId);
+    },
+    keyup: function(inEvent) {
+      var code = inEvent.keyCode;
+      // 32 == spacebar
+      if (code === 32) {
+        var t = inEvent.target;
+        if (!(t instanceof HTMLInputElement || t instanceof HTMLTextAreaElement)) {
+          dispatcher.dispatchEvent(dispatcher.makeEvent('tap', {
+            x: 0,
+            y: 0,
+            detail: 0,
+            pointerType: 'unavailable'
+          }), t);
+        }
+      }
+    },
+    preventTap: function(inPointerId) {
+      pointermap.delete(inPointerId);
+    }
+  };
+  dispatcher.registerRecognizer('tap', tap);
+})(window.PointerGestures);
+
+/*
+ * Copyright 2014 The Polymer Authors. All rights reserved.
+ * Use of this source code is governed by a BSD-style
+ * license that can be found in the LICENSE file.
+ */
+
+/**
+ * Because recognizers are loaded after dispatcher, we have to wait to register
+ * scopes until after all the recognizers.
+ */
+(function(scope) {
+  var dispatcher = scope.dispatcher;
+  function registerScopes() {
+    dispatcher.immediateRegister = true;
+    var rq = dispatcher.registerQueue;
+    rq.forEach(scope.register);
+    rq.length = 0;
+  }
+  if (document.readyState === 'complete') {
+    registerScopes();
+  } else {
+    // register scopes after a steadystate is reached
+    // less MutationObserver churn
+    document.addEventListener('readystatechange', function() {
+      if (document.readyState === 'complete') {
+        registerScopes();
+      }
+    });
+  }
+})(window.PointerGestures);
+
+// 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(global) {
+  'use strict';
+
+  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);
+
+  function getTreeScope(node) {
+    while (node.parentNode) {
+      node = node.parentNode;
+    }
+
+    return typeof node.getElementById === 'function' ? node : null;
+  }
+
+  Node.prototype.bind = function(name, observable) {
+    console.error('Unhandled binding to Node: ', this, name, observable);
+  };
+
+  function updateBindings(node, name, binding) {
+    var bindings = node.bindings_;
+    if (!bindings)
+      bindings = node.bindings_ = {};
+
+    if (bindings[name])
+      binding[name].close();
+
+    return bindings[name] = binding;
+  }
+
+  function returnBinding(node, name, binding) {
+    return binding;
+  }
+
+  function sanitizeValue(value) {
+    return value == null ? '' : value;
+  }
+
+  function updateText(node, value) {
+    node.data = sanitizeValue(value);
+  }
+
+  function textBinding(node) {
+    return function(value) {
+      return updateText(node, value);
+    };
+  }
+
+  var maybeUpdateBindings = returnBinding;
+
+  Object.defineProperty(Platform, 'enableBindingsReflection', {
+    get: function() {
+      return maybeUpdateBindings === updateBindings;
+    },
+    set: function(enable) {
+      maybeUpdateBindings = enable ? updateBindings : returnBinding;
+      return enable;
+    },
+    configurable: true
+  });
+
+  Text.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'textContent')
+      return Node.prototype.bind.call(this, name, value, oneTime);
+
+    if (oneTime)
+      return updateText(this, value);
+
+    var observable = value;
+    updateText(this, observable.open(textBinding(this)));
+    return maybeUpdateBindings(this, name, observable);
+  }
+
+  function updateAttribute(el, name, conditional, value) {
+    if (conditional) {
+      if (value)
+        el.setAttribute(name, '');
+      else
+        el.removeAttribute(name);
+      return;
+    }
+
+    el.setAttribute(name, sanitizeValue(value));
+  }
+
+  function attributeBinding(el, name, conditional) {
+    return function(value) {
+      updateAttribute(el, name, conditional, value);
+    };
+  }
+
+  Element.prototype.bind = function(name, value, oneTime) {
+    var conditional = name[name.length - 1] == '?';
+    if (conditional) {
+      this.removeAttribute(name);
+      name = name.slice(0, -1);
+    }
+
+    if (oneTime)
+      return updateAttribute(this, name, conditional, value);
+
+
+    var observable = value;
+    updateAttribute(this, name, conditional,
+        observable.open(attributeBinding(this, name, conditional)));
+
+    return maybeUpdateBindings(this, name, observable);
+  };
+
+  var checkboxEventType;
+  (function() {
+    // Attempt to feature-detect which event (change or click) is fired first
+    // for checkboxes.
+    var div = document.createElement('div');
+    var checkbox = div.appendChild(document.createElement('input'));
+    checkbox.setAttribute('type', 'checkbox');
+    var first;
+    var count = 0;
+    checkbox.addEventListener('click', function(e) {
+      count++;
+      first = first || 'click';
+    });
+    checkbox.addEventListener('change', function() {
+      count++;
+      first = first || 'change';
+    });
+
+    var event = document.createEvent('MouseEvent');
+    event.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0, false,
+        false, false, false, 0, null);
+    checkbox.dispatchEvent(event);
+    // WebKit/Blink don't fire the change event if the element is outside the
+    // document, so assume 'change' for that case.
+    checkboxEventType = count == 1 ? 'change' : first;
+  })();
+
+  function getEventForInputType(element) {
+    switch (element.type) {
+      case 'checkbox':
+        return checkboxEventType;
+      case 'radio':
+      case 'select-multiple':
+      case 'select-one':
+        return 'change';
+      case 'range':
+        if (/Trident|MSIE/.test(navigator.userAgent))
+          return 'change';
+      default:
+        return 'input';
+    }
+  }
+
+  function updateInput(input, property, value, santizeFn) {
+    input[property] = (santizeFn || sanitizeValue)(value);
+  }
+
+  function inputBinding(input, property, santizeFn) {
+    return function(value) {
+      return updateInput(input, property, value, santizeFn);
+    }
+  }
+
+  function noop() {}
+
+  function bindInputEvent(input, property, observable, postEventFn) {
+    var eventType = getEventForInputType(input);
+
+    function eventHandler() {
+      observable.setValue(input[property]);
+      observable.discardChanges();
+      (postEventFn || noop)(input);
+      Platform.performMicrotaskCheckpoint();
+    }
+    input.addEventListener(eventType, eventHandler);
+
+    return {
+      close: function() {
+        input.removeEventListener(eventType, eventHandler);
+        observable.close();
+      },
+
+      observable_: observable
+    }
+  }
+
+  function booleanSanitize(value) {
+    return Boolean(value);
+  }
+
+  // |element| is assumed to be an HTMLInputElement with |type| == 'radio'.
+  // Returns an array containing all radio buttons other than |element| that
+  // have the same |name|, either in the form that |element| belongs to or,
+  // if no form, in the document tree to which |element| belongs.
+  //
+  // This implementation is based upon the HTML spec definition of a
+  // "radio button group":
+  //   http://www.whatwg.org/specs/web-apps/current-work/multipage/number-state.html#radio-button-group
+  //
+  function getAssociatedRadioButtons(element) {
+    if (element.form) {
+      return filter(element.form.elements, function(el) {
+        return el != element &&
+            el.tagName == 'INPUT' &&
+            el.type == 'radio' &&
+            el.name == element.name;
+      });
+    } else {
+      var treeScope = getTreeScope(element);
+      if (!treeScope)
+        return [];
+      var radios = treeScope.querySelectorAll(
+          'input[type="radio"][name="' + element.name + '"]');
+      return filter(radios, function(el) {
+        return el != element && !el.form;
+      });
+    }
+  }
+
+  function checkedPostEvent(input) {
+    // Only the radio button that is getting checked gets an event. We
+    // therefore find all the associated radio buttons and update their
+    // check binding manually.
+    if (input.tagName === 'INPUT' &&
+        input.type === 'radio') {
+      getAssociatedRadioButtons(input).forEach(function(radio) {
+        var checkedBinding = radio.bindings_.checked;
+        if (checkedBinding) {
+          // Set the value directly to avoid an infinite call stack.
+          checkedBinding.observable_.setValue(false);
+        }
+      });
+    }
+  }
+
+  HTMLInputElement.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'value' && name !== 'checked')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute(name);
+    var sanitizeFn = name == 'checked' ? booleanSanitize : sanitizeValue;
+    var postEventFn = name == 'checked' ? checkedPostEvent : noop;
+
+    if (oneTime)
+      return updateInput(this, name, value, sanitizeFn);
+
+
+    var observable = value;
+    var binding = bindInputEvent(this, name, observable, postEventFn);
+    updateInput(this, name,
+                observable.open(inputBinding(this, name, sanitizeFn)),
+                sanitizeFn);
+
+    // Checkboxes may need to update bindings of other checkboxes.
+    return updateBindings(this, name, binding);
+  }
+
+  HTMLTextAreaElement.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'value')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute('value');
+
+    if (oneTime)
+      return updateInput(this, 'value', value);
+
+    var observable = value;
+    var binding = bindInputEvent(this, 'value', observable);
+    updateInput(this, 'value',
+                observable.open(inputBinding(this, 'value', sanitizeValue)));
+    return maybeUpdateBindings(this, name, binding);
+  }
+
+  function updateOption(option, value) {
+    var parentNode = option.parentNode;;
+    var select;
+    var selectBinding;
+    var oldValue;
+    if (parentNode instanceof HTMLSelectElement &&
+        parentNode.bindings_ &&
+        parentNode.bindings_.value) {
+      select = parentNode;
+      selectBinding = select.bindings_.value;
+      oldValue = select.value;
+    }
+
+    option.value = sanitizeValue(value);
+
+    if (select && select.value != oldValue) {
+      selectBinding.observable_.setValue(select.value);
+      selectBinding.observable_.discardChanges();
+      Platform.performMicrotaskCheckpoint();
+    }
+  }
+
+  function optionBinding(option) {
+    return function(value) {
+      updateOption(option, value);
+    }
+  }
+
+  HTMLOptionElement.prototype.bind = function(name, value, oneTime) {
+    if (name !== 'value')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute('value');
+
+    if (oneTime)
+      return updateOption(this, value);
+
+    var observable = value;
+    var binding = bindInputEvent(this, 'value', observable);
+    updateOption(this, observable.open(optionBinding(this)));
+    return maybeUpdateBindings(this, name, binding);
+  }
+
+  HTMLSelectElement.prototype.bind = function(name, value, oneTime) {
+    if (name === 'selectedindex')
+      name = 'selectedIndex';
+
+    if (name !== 'selectedIndex' && name !== 'value')
+      return HTMLElement.prototype.bind.call(this, name, value, oneTime);
+
+    this.removeAttribute(name);
+
+    if (oneTime)
+      return updateInput(this, name, value);
+
+    var observable = value;
+    var binding = bindInputEvent(this, name, observable);
+    updateInput(this, name,
+                observable.open(inputBinding(this, name)));
+
+    // Option update events may need to access select bindings.
+    return updateBindings(this, name, binding);
+  }
+})(this);
+
+// 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(global) {
+  'use strict';
+
+  function assert(v) {
+    if (!v)
+      throw new Error('Assertion failed');
+  }
+
+  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
+
+  function getFragmentRoot(node) {
+    var p;
+    while (p = node.parentNode) {
+      node = p;
+    }
+
+    return node;
+  }
+
+  function searchRefId(node, id) {
+    if (!id)
+      return;
+
+    var ref;
+    var selector = '#' + id;
+    while (!ref) {
+      node = getFragmentRoot(node);
+
+      if (node.protoContent_)
+        ref = node.protoContent_.querySelector(selector);
+      else if (node.getElementById)
+        ref = node.getElementById(id);
+
+      if (ref || !node.templateCreator_)
+        break
+
+      node = node.templateCreator_;
+    }
+
+    return ref;
+  }
+
+  function getInstanceRoot(node) {
+    while (node.parentNode) {
+      node = node.parentNode;
+    }
+    return node.templateCreator_ ? node : null;
+  }
+
+  var Map;
+  if (global.Map && typeof global.Map.prototype.forEach === 'function') {
+    Map = global.Map;
+  } else {
+    Map = function() {
+      this.keys = [];
+      this.values = [];
+    };
+
+    Map.prototype = {
+      set: function(key, value) {
+        var index = this.keys.indexOf(key);
+        if (index < 0) {
+          this.keys.push(key);
+          this.values.push(value);
+        } else {
+          this.values[index] = value;
+        }
+      },
+
+      get: function(key) {
+        var index = this.keys.indexOf(key);
+        if (index < 0)
+          return;
+
+        return this.values[index];
+      },
+
+      delete: function(key, value) {
+        var index = this.keys.indexOf(key);
+        if (index < 0)
+          return false;
+
+        this.keys.splice(index, 1);
+        this.values.splice(index, 1);
+        return true;
+      },
+
+      forEach: function(f, opt_this) {
+        for (var i = 0; i < this.keys.length; i++)
+          f.call(opt_this || this, this.values[i], this.keys[i], this);
+      }
+    };
+  }
+
+  // JScript does not have __proto__. We wrap all object literals with
+  // createObject which uses Object.create, Object.defineProperty and
+  // Object.getOwnPropertyDescriptor to create a new object that does the exact
+  // same thing. The main downside to this solution is that we have to extract
+  // all those property descriptors for IE.
+  var createObject = ('__proto__' in {}) ?
+      function(obj) { return obj; } :
+      function(obj) {
+        var proto = obj.__proto__;
+        if (!proto)
+          return obj;
+        var newObject = Object.create(proto);
+        Object.getOwnPropertyNames(obj).forEach(function(name) {
+          Object.defineProperty(newObject, name,
+                               Object.getOwnPropertyDescriptor(obj, name));
+        });
+        return newObject;
+      };
+
+  // IE does not support have Document.prototype.contains.
+  if (typeof document.contains != 'function') {
+    Document.prototype.contains = function(node) {
+      if (node === this || node.parentNode === this)
+        return true;
+      return this.documentElement.contains(node);
+    }
+  }
+
+  var BIND = 'bind';
+  var REPEAT = 'repeat';
+  var IF = 'if';
+
+  var templateAttributeDirectives = {
+    'template': true,
+    'repeat': true,
+    'bind': true,
+    'ref': true
+  };
+
+  var semanticTemplateElements = {
+    'THEAD': true,
+    'TBODY': true,
+    'TFOOT': true,
+    'TH': true,
+    'TR': true,
+    'TD': true,
+    'COLGROUP': true,
+    'COL': true,
+    'CAPTION': true,
+    'OPTION': true,
+    'OPTGROUP': true
+  };
+
+  var hasTemplateElement = typeof HTMLTemplateElement !== 'undefined';
+  if (hasTemplateElement) {
+    // TODO(rafaelw): Remove when fix for
+    // https://codereview.chromium.org/164803002/
+    // makes it to Chrome release.
+    (function() {
+      var t = document.createElement('template');
+      var d = t.content.ownerDocument;
+      var html = d.appendChild(d.createElement('html'));
+      var head = html.appendChild(d.createElement('head'));
+      var base = d.createElement('base');
+      base.href = document.baseURI;
+      head.appendChild(base);
+    })();
+  }
+
+  var allTemplatesSelectors = 'template, ' +
+      Object.keys(semanticTemplateElements).map(function(tagName) {
+        return tagName.toLowerCase() + '[template]';
+      }).join(', ');
+
+  function isSVGTemplate(el) {
+    return el.tagName == 'template' &&
+           el.namespaceURI == 'http://www.w3.org/2000/svg';
+  }
+
+  function isHTMLTemplate(el) {
+    return el.tagName == 'TEMPLATE' &&
+           el.namespaceURI == 'http://www.w3.org/1999/xhtml';
+  }
+
+  function isAttributeTemplate(el) {
+    return Boolean(semanticTemplateElements[el.tagName] &&
+                   el.hasAttribute('template'));
+  }
+
+  function isTemplate(el) {
+    if (el.isTemplate_ === undefined)
+      el.isTemplate_ = el.tagName == 'TEMPLATE' || isAttributeTemplate(el);
+
+    return el.isTemplate_;
+  }
+
+  // FIXME: Observe templates being added/removed from documents
+  // FIXME: Expose imperative API to decorate and observe templates in
+  // "disconnected tress" (e.g. ShadowRoot)
+  document.addEventListener('DOMContentLoaded', function(e) {
+    bootstrapTemplatesRecursivelyFrom(document);
+    // FIXME: Is this needed? Seems like it shouldn't be.
+    Platform.performMicrotaskCheckpoint();
+  }, false);
+
+  function forAllTemplatesFrom(node, fn) {
+    var subTemplates = node.querySelectorAll(allTemplatesSelectors);
+
+    if (isTemplate(node))
+      fn(node)
+    forEach(subTemplates, fn);
+  }
+
+  function bootstrapTemplatesRecursivelyFrom(node) {
+    function bootstrap(template) {
+      if (!HTMLTemplateElement.decorate(template))
+        bootstrapTemplatesRecursivelyFrom(template.content);
+    }
+
+    forAllTemplatesFrom(node, bootstrap);
+  }
+
+  if (!hasTemplateElement) {
+    /**
+     * This represents a <template> element.
+     * @constructor
+     * @extends {HTMLElement}
+     */
+    global.HTMLTemplateElement = function() {
+      throw TypeError('Illegal constructor');
+    };
+  }
+
+  var hasProto = '__proto__' in {};
+
+  function mixin(to, from) {
+    Object.getOwnPropertyNames(from).forEach(function(name) {
+      Object.defineProperty(to, name,
+                            Object.getOwnPropertyDescriptor(from, name));
+    });
+  }
+
+  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/templates/index.html#dfn-template-contents-owner
+  function getOrCreateTemplateContentsOwner(template) {
+    var doc = template.ownerDocument
+    if (!doc.defaultView)
+      return doc;
+    var d = doc.templateContentsOwner_;
+    if (!d) {
+      // TODO(arv): This should either be a Document or HTMLDocument depending
+      // on doc.
+      d = doc.implementation.createHTMLDocument('');
+      while (d.lastChild) {
+        d.removeChild(d.lastChild);
+      }
+      doc.templateContentsOwner_ = d;
+    }
+    return d;
+  }
+
+  function getTemplateStagingDocument(template) {
+    if (!template.stagingDocument_) {
+      var owner = template.ownerDocument;
+      if (!owner.stagingDocument_) {
+        owner.stagingDocument_ = owner.implementation.createHTMLDocument('');
+
+        // TODO(rafaelw): Remove when fix for
+        // https://codereview.chromium.org/164803002/
+        // makes it to Chrome release.
+        var base = owner.stagingDocument_.createElement('base');
+        base.href = document.baseURI;
+        owner.stagingDocument_.head.appendChild(base);
+
+        owner.stagingDocument_.stagingDocument_ = owner.stagingDocument_;
+      }
+
+      template.stagingDocument_ = owner.stagingDocument_;
+    }
+
+    return template.stagingDocument_;
+  }
+
+  // For non-template browsers, the parser will disallow <template> in certain
+  // locations, so we allow "attribute templates" which combine the template
+  // element with the top-level container node of the content, e.g.
+  //
+  //   <tr template repeat="{{ foo }}"" class="bar"><td>Bar</td></tr>
+  //
+  // becomes
+  //
+  //   <template repeat="{{ foo }}">
+  //   + #document-fragment
+  //     + <tr class="bar">
+  //       + <td>Bar</td>
+  //
+  function extractTemplateFromAttributeTemplate(el) {
+    var template = el.ownerDocument.createElement('template');
+    el.parentNode.insertBefore(template, el);
+
+    var attribs = el.attributes;
+    var count = attribs.length;
+    while (count-- > 0) {
+      var attrib = attribs[count];
+      if (templateAttributeDirectives[attrib.name]) {
+        if (attrib.name !== 'template')
+          template.setAttribute(attrib.name, attrib.value);
+        el.removeAttribute(attrib.name);
+      }
+    }
+
+    return template;
+  }
+
+  function extractTemplateFromSVGTemplate(el) {
+    var template = el.ownerDocument.createElement('template');
+    el.parentNode.insertBefore(template, el);
+
+    var attribs = el.attributes;
+    var count = attribs.length;
+    while (count-- > 0) {
+      var attrib = attribs[count];
+      template.setAttribute(attrib.name, attrib.value);
+      el.removeAttribute(attrib.name);
+    }
+
+    el.parentNode.removeChild(el);
+    return template;
+  }
+
+  function liftNonNativeTemplateChildrenIntoContent(template, el, useRoot) {
+    var content = template.content;
+    if (useRoot) {
+      content.appendChild(el);
+      return;
+    }
+
+    var child;
+    while (child = el.firstChild) {
+      content.appendChild(child);
+    }
+  }
+
+  var templateObserver;
+  if (typeof MutationObserver == 'function') {
+    templateObserver = new MutationObserver(function(records) {
+      for (var i = 0; i < records.length; i++) {
+        records[i].target.refChanged_();
+      }
+    });
+  }
+
+  /**
+   * Ensures proper API and content model for template elements.
+   * @param {HTMLTemplateElement} opt_instanceRef The template element which
+   *     |el| template element will return as the value of its ref(), and whose
+   *     content will be used as source when createInstance() is invoked.
+   */
+  HTMLTemplateElement.decorate = function(el, opt_instanceRef) {
+    if (el.templateIsDecorated_)
+      return false;
+
+    var templateElement = el;
+    templateElement.templateIsDecorated_ = true;
+
+    var isNativeHTMLTemplate = isHTMLTemplate(templateElement) &&
+                               hasTemplateElement;
+    var bootstrapContents = isNativeHTMLTemplate;
+    var liftContents = !isNativeHTMLTemplate;
+    var liftRoot = false;
+
+    if (!isNativeHTMLTemplate) {
+      if (isAttributeTemplate(templateElement)) {
+        assert(!opt_instanceRef);
+        templateElement = extractTemplateFromAttributeTemplate(el);
+        templateElement.templateIsDecorated_ = true;
+        isNativeHTMLTemplate = hasTemplateElement;
+        liftRoot = true;
+      } else if (isSVGTemplate(templateElement)) {
+        templateElement = extractTemplateFromSVGTemplate(el);
+        templateElement.templateIsDecorated_ = true;
+        isNativeHTMLTemplate = hasTemplateElement;
+      }
+    }
+
+    if (!isNativeHTMLTemplate) {
+      fixTemplateElementPrototype(templateElement);
+      var doc = getOrCreateTemplateContentsOwner(templateElement);
+      templateElement.content_ = doc.createDocumentFragment();
+    }
+
+    if (opt_instanceRef) {
+      // template is contained within an instance, its direct content must be
+      // empty
+      templateElement.instanceRef_ = opt_instanceRef;
+    } else if (liftContents) {
+      liftNonNativeTemplateChildrenIntoContent(templateElement,
+                                               el,
+                                               liftRoot);
+    } else if (bootstrapContents) {
+      bootstrapTemplatesRecursivelyFrom(templateElement.content);
+    }
+
+    return true;
+  };
+
+  // TODO(rafaelw): This used to decorate recursively all templates from a given
+  // node. This happens by default on 'DOMContentLoaded', but may be needed
+  // in subtrees not descendent from document (e.g. ShadowRoot).
+  // Review whether this is the right public API.
+  HTMLTemplateElement.bootstrap = bootstrapTemplatesRecursivelyFrom;
+
+  var htmlElement = global.HTMLUnknownElement || HTMLElement;
+
+  var contentDescriptor = {
+    get: function() {
+      return this.content_;
+    },
+    enumerable: true,
+    configurable: true
+  };
+
+  if (!hasTemplateElement) {
+    // Gecko is more picky with the prototype than WebKit. Make sure to use the
+    // same prototype as created in the constructor.
+    HTMLTemplateElement.prototype = Object.create(htmlElement.prototype);
+
+    Object.defineProperty(HTMLTemplateElement.prototype, 'content',
+                          contentDescriptor);
+  }
+
+  function fixTemplateElementPrototype(el) {
+    if (hasProto)
+      el.__proto__ = HTMLTemplateElement.prototype;
+    else
+      mixin(el, HTMLTemplateElement.prototype);
+  }
+
+  function ensureSetModelScheduled(template) {
+    if (!template.setModelFn_) {
+      template.setModelFn_ = function() {
+        template.setModelFnScheduled_ = false;
+        var map = getBindings(template,
+            template.delegate_ && template.delegate_.prepareBinding);
+        processBindings(template, map, template.model_);
+      };
+    }
+
+    if (!template.setModelFnScheduled_) {
+      template.setModelFnScheduled_ = true;
+      Observer.runEOM_(template.setModelFn_);
+    }
+  }
+
+  mixin(HTMLTemplateElement.prototype, {
+    bind: function(name, value, oneTime) {
+      if (name != 'ref')
+        return Element.prototype.bind.call(this, name, value, oneTime);
+
+      var self = this;
+      var ref = oneTime ? value : value.open(function(ref) {
+        self.setAttribute('ref', ref);
+        self.refChanged_();
+      });
+
+      this.setAttribute('ref', ref);
+      this.refChanged_();
+      if (oneTime)
+        return;
+
+      if (!this.bindings_) {
+        this.bindings_ = { ref: value };
+      } else {
+        this.bindings_.ref = value;
+      }
+
+      return value;
+    },
+
+    processBindingDirectives_: function(directives) {
+      if (this.iterator_)
+        this.iterator_.closeDeps();
+
+      if (!directives.if && !directives.bind && !directives.repeat) {
+        if (this.iterator_) {
+          this.iterator_.close();
+          this.iterator_ = undefined;
+        }
+
+        return;
+      }
+
+      if (!this.iterator_) {
+        this.iterator_ = new TemplateIterator(this);
+      }
+
+      this.iterator_.updateDependencies(directives, this.model_);
+
+      if (templateObserver) {
+        templateObserver.observe(this, { attributes: true,
+                                         attributeFilter: ['ref'] });
+      }
+
+      return this.iterator_;
+    },
+
+    createInstance: function(model, bindingDelegate, delegate_) {
+      if (bindingDelegate)
+        delegate_ = this.newDelegate_(bindingDelegate);
+
+      if (!this.refContent_)
+        this.refContent_ = this.ref_.content;
+      var content = this.refContent_;
+      if (content.firstChild === null)
+        return emptyInstance;
+
+      var map = this.bindingMap_;
+      if (!map || map.content !== content) {
+        // TODO(rafaelw): Setup a MutationObserver on content to detect
+        // when the instanceMap is invalid.
+        map = createInstanceBindingMap(content,
+            delegate_ && delegate_.prepareBinding) || [];
+        map.content = content;
+        this.bindingMap_ = map;
+      }
+
+      var stagingDocument = getTemplateStagingDocument(this);
+      var instance = stagingDocument.createDocumentFragment();
+      instance.templateCreator_ = this;
+      instance.protoContent_ = content;
+      instance.bindings_ = [];
+      instance.terminator_ = null;
+      var instanceRecord = instance.templateInstance_ = {
+        firstNode: null,
+        lastNode: null,
+        model: model
+      };
+
+      var i = 0;
+      var collectTerminator = false;
+      for (var child = content.firstChild; child; child = child.nextSibling) {
+        // The terminator of the instance is the clone of the last child of the
+        // content. If the last child is an active template, it may produce
+        // instances as a result of production, so simply collecting the last
+        // child of the instance after it has finished producing may be wrong.
+        if (child.nextSibling === null)
+          collectTerminator = true;
+
+        var clone = cloneAndBindInstance(child, instance, stagingDocument,
+                                         map.children[i++],
+                                         model,
+                                         delegate_,
+                                         instance.bindings_);
+        clone.templateInstance_ = instanceRecord;
+        if (collectTerminator)
+          instance.terminator_ = clone;
+      }
+
+      instanceRecord.firstNode = instance.firstChild;
+      instanceRecord.lastNode = instance.lastChild;
+      instance.templateCreator_ = undefined;
+      instance.protoContent_ = undefined;
+      return instance;
+    },
+
+    get model() {
+      return this.model_;
+    },
+
+    set model(model) {
+      this.model_ = model;
+      ensureSetModelScheduled(this);
+    },
+
+    get bindingDelegate() {
+      return this.delegate_ && this.delegate_.raw;
+    },
+
+    refChanged_: function() {
+      if (!this.iterator_ || this.refContent_ === this.ref_.content)
+        return;
+
+      this.refContent_ = undefined;
+      this.iterator_.valueChanged();
+      this.iterator_.updateIteratedValue();
+    },
+
+    clear: function() {
+      this.model_ = undefined;
+      this.delegate_ = undefined;
+      if (this.bindings_ && this.bindings_.ref)
+        this.bindings_.ref.close()
+      this.refContent_ = undefined;
+      if (!this.iterator_)
+        return;
+      this.iterator_.valueChanged();
+      this.iterator_.close()
+      this.iterator_ = undefined;
+    },
+
+    setDelegate_: function(delegate) {
+      this.delegate_ = delegate;
+      this.bindingMap_ = undefined;
+      if (this.iterator_) {
+        this.iterator_.instancePositionChangedFn_ = undefined;
+        this.iterator_.instanceModelFn_ = undefined;
+      }
+    },
+
+    newDelegate_: function(bindingDelegate) {
+      if (!bindingDelegate)
+        return {};
+
+      function delegateFn(name) {
+        var fn = bindingDelegate && bindingDelegate[name];
+        if (typeof fn != 'function')
+          return;
+
+        return function() {
+          return fn.apply(bindingDelegate, arguments);
+        };
+      }
+
+      return {
+        raw: bindingDelegate,
+        prepareBinding: delegateFn('prepareBinding'),
+        prepareInstanceModel: delegateFn('prepareInstanceModel'),
+        prepareInstancePositionChanged:
+            delegateFn('prepareInstancePositionChanged')
+      };
+    },
+
+    // TODO(rafaelw): Assigning .bindingDelegate always succeeds. It may
+    // make sense to issue a warning or even throw if the template is already
+    // "activated", since this would be a strange thing to do.
+    set bindingDelegate(bindingDelegate) {
+      if (this.delegate_) {
+        throw Error('Template must be cleared before a new bindingDelegate ' +
+                    'can be assigned');
+      }
+
+      this.setDelegate_(this.newDelegate_(bindingDelegate));
+    },
+
+    get ref_() {
+      var ref = searchRefId(this, this.getAttribute('ref'));
+      if (!ref)
+        ref = this.instanceRef_;
+
+      if (!ref)
+        return this;
+
+      var nextRef = ref.ref_;
+      return nextRef ? nextRef : ref;
+    }
+  });
+
+  // Returns
+  //   a) undefined if there are no mustaches.
+  //   b) [TEXT, (ONE_TIME?, PATH, DELEGATE_FN, TEXT)+] if there is at least one mustache.
+  function parseMustaches(s, name, node, prepareBindingFn) {
+    if (!s || !s.length)
+      return;
+
+    var tokens;
+    var length = s.length;
+    var startIndex = 0, lastIndex = 0, endIndex = 0;
+    var onlyOneTime = true;
+    while (lastIndex < length) {
+      var startIndex = s.indexOf('{{', lastIndex);
+      var oneTimeStart = s.indexOf('[[', lastIndex);
+      var oneTime = false;
+      var terminator = '}}';
+
+      if (oneTimeStart >= 0 &&
+          (startIndex < 0 || oneTimeStart < startIndex)) {
+        startIndex = oneTimeStart;
+        oneTime = true;
+        terminator = ']]';
+      }
+
+      endIndex = startIndex < 0 ? -1 : s.indexOf(terminator, startIndex + 2);
+
+      if (endIndex < 0) {
+        if (!tokens)
+          return;
+
+        tokens.push(s.slice(lastIndex)); // TEXT
+        break;
+      }
+
+      tokens = tokens || [];
+      tokens.push(s.slice(lastIndex, startIndex)); // TEXT
+      var pathString = s.slice(startIndex + 2, endIndex).trim();
+      tokens.push(oneTime); // ONE_TIME?
+      onlyOneTime = onlyOneTime && oneTime;
+      var delegateFn = prepareBindingFn &&
+                       prepareBindingFn(pathString, name, node);
+      // Don't try to parse the expression if there's a prepareBinding function
+      if (delegateFn == null) {
+        tokens.push(Path.get(pathString)); // PATH
+      } else {
+        tokens.push(null);
+      }
+      tokens.push(delegateFn); // DELEGATE_FN
+      lastIndex = endIndex + 2;
+    }
+
+    if (lastIndex === length)
+      tokens.push(''); // TEXT
+
+    tokens.hasOnePath = tokens.length === 5;
+    tokens.isSimplePath = tokens.hasOnePath &&
+                          tokens[0] == '' &&
+                          tokens[4] == '';
+    tokens.onlyOneTime = onlyOneTime;
+
+    tokens.combinator = function(values) {
+      var newValue = tokens[0];
+
+      for (var i = 1; i < tokens.length; i += 4) {
+        var value = tokens.hasOnePath ? values : values[(i - 1) / 4];
+        if (value !== undefined)
+          newValue += value;
+        newValue += tokens[i + 3];
+      }
+
+      return newValue;
+    }
+
+    return tokens;
+  };
+
+  function processOneTimeBinding(name, tokens, node, model) {
+    if (tokens.hasOnePath) {
+      var delegateFn = tokens[3];
+      var value = delegateFn ? delegateFn(model, node, true) :
+                               tokens[2].getValueFrom(model);
+      return tokens.isSimplePath ? value : tokens.combinator(value);
+    }
+
+    var values = [];
+    for (var i = 1; i < tokens.length; i += 4) {
+      var delegateFn = tokens[i + 2];
+      values[(i - 1) / 4] = delegateFn ? delegateFn(model, node) :
+          tokens[i + 1].getValueFrom(model);
+    }
+
+    return tokens.combinator(values);
+  }
+
+  function processSinglePathBinding(name, tokens, node, model) {
+    var delegateFn = tokens[3];
+    var observer = delegateFn ? delegateFn(model, node, false) :
+        new PathObserver(model, tokens[2]);
+
+    return tokens.isSimplePath ? observer :
+        new ObserverTransform(observer, tokens.combinator);
+  }
+
+  function processBinding(name, tokens, node, model) {
+    if (tokens.onlyOneTime)
+      return processOneTimeBinding(name, tokens, node, model);
+
+    if (tokens.hasOnePath)
+      return processSinglePathBinding(name, tokens, node, model);
+
+    var observer = new CompoundObserver();
+
+    for (var i = 1; i < tokens.length; i += 4) {
+      var oneTime = tokens[i];
+      var delegateFn = tokens[i + 2];
+
+      if (delegateFn) {
+        var value = delegateFn(model, node, oneTime);
+        if (oneTime)
+          observer.addPath(value)
+        else
+          observer.addObserver(value);
+        continue;
+      }
+
+      var path = tokens[i + 1];
+      if (oneTime)
+        observer.addPath(path.getValueFrom(model))
+      else
+        observer.addPath(model, path);
+    }
+
+    return new ObserverTransform(observer, tokens.combinator);
+  }
+
+  function processBindings(node, bindings, model, instanceBindings) {
+    for (var i = 0; i < bindings.length; i += 2) {
+      var name = bindings[i]
+      var tokens = bindings[i + 1];
+      var value = processBinding(name, tokens, node, model);
+      var binding = node.bind(name, value, tokens.onlyOneTime);
+      if (binding && instanceBindings)
+        instanceBindings.push(binding);
+    }
+
+    if (!bindings.isTemplate)
+      return;
+
+    node.model_ = model;
+    var iter = node.processBindingDirectives_(bindings);
+    if (instanceBindings && iter)
+      instanceBindings.push(iter);
+  }
+
+  function parseWithDefault(el, name, prepareBindingFn) {
+    var v = el.getAttribute(name);
+    return parseMustaches(v == '' ? '{{}}' : v, name, el, prepareBindingFn);
+  }
+
+  function parseAttributeBindings(element, prepareBindingFn) {
+    assert(element);
+
+    var bindings = [];
+    var ifFound = false;
+    var bindFound = false;
+
+    for (var i = 0; i < element.attributes.length; i++) {
+      var attr = element.attributes[i];
+      var name = attr.name;
+      var value = attr.value;
+
+      // Allow bindings expressed in attributes to be prefixed with underbars.
+      // We do this to allow correct semantics for browsers that don't implement
+      // <template> where certain attributes might trigger side-effects -- and
+      // for IE which sanitizes certain attributes, disallowing mustache
+      // replacements in their text.
+      while (name[0] === '_') {
+        name = name.substring(1);
+      }
+
+      if (isTemplate(element) &&
+          (name === IF || name === BIND || name === REPEAT)) {
+        continue;
+      }
+
+      var tokens = parseMustaches(value, name, element,
+                                  prepareBindingFn);
+      if (!tokens)
+        continue;
+
+      bindings.push(name, tokens);
+    }
+
+    if (isTemplate(element)) {
+      bindings.isTemplate = true;
+      bindings.if = parseWithDefault(element, IF, prepareBindingFn);
+      bindings.bind = parseWithDefault(element, BIND, prepareBindingFn);
+      bindings.repeat = parseWithDefault(element, REPEAT, prepareBindingFn);
+
+      if (bindings.if && !bindings.bind && !bindings.repeat)
+        bindings.bind = parseMustaches('{{}}', BIND, element, prepareBindingFn);
+    }
+
+    return bindings;
+  }
+
+  function getBindings(node, prepareBindingFn) {
+    if (node.nodeType === Node.ELEMENT_NODE)
+      return parseAttributeBindings(node, prepareBindingFn);
+
+    if (node.nodeType === Node.TEXT_NODE) {
+      var tokens = parseMustaches(node.data, 'textContent', node,
+                                  prepareBindingFn);
+      if (tokens)
+        return ['textContent', tokens];
+    }
+
+    return [];
+  }
+
+  function cloneAndBindInstance(node, parent, stagingDocument, bindings, model,
+                                delegate,
+                                instanceBindings,
+                                instanceRecord) {
+    var clone = parent.appendChild(stagingDocument.importNode(node, false));
+
+    var i = 0;
+    for (var child = node.firstChild; child; child = child.nextSibling) {
+      cloneAndBindInstance(child, clone, stagingDocument,
+                            bindings.children[i++],
+                            model,
+                            delegate,
+                            instanceBindings);
+    }
+
+    if (bindings.isTemplate) {
+      HTMLTemplateElement.decorate(clone, node);
+      if (delegate)
+        clone.setDelegate_(delegate);
+    }
+
+    processBindings(clone, bindings, model, instanceBindings);
+    return clone;
+  }
+
+  function createInstanceBindingMap(node, prepareBindingFn) {
+    var map = getBindings(node, prepareBindingFn);
+    map.children = {};
+    var index = 0;
+    for (var child = node.firstChild; child; child = child.nextSibling) {
+      map.children[index++] = createInstanceBindingMap(child, prepareBindingFn);
+    }
+
+    return map;
+  }
+
+  Object.defineProperty(Node.prototype, 'templateInstance', {
+    get: function() {
+      var instance = this.templateInstance_;
+      return instance ? instance :
+          (this.parentNode ? this.parentNode.templateInstance : undefined);
+    }
+  });
+
+  var emptyInstance = document.createDocumentFragment();
+  emptyInstance.bindings_ = [];
+  emptyInstance.terminator_ = null;
+
+  function TemplateIterator(templateElement) {
+    this.closed = false;
+    this.templateElement_ = templateElement;
+    this.instances = [];
+    this.deps = undefined;
+    this.iteratedValue = [];
+    this.presentValue = undefined;
+    this.arrayObserver = undefined;
+  }
+
+  TemplateIterator.prototype = {
+    closeDeps: function() {
+      var deps = this.deps;
+      if (deps) {
+        if (deps.ifOneTime === false)
+          deps.ifValue.close();
+        if (deps.oneTime === false)
+          deps.value.close();
+      }
+    },
+
+    updateDependencies: function(directives, model) {
+      this.closeDeps();
+
+      var deps = this.deps = {};
+      var template = this.templateElement_;
+
+      if (directives.if) {
+        deps.hasIf = true;
+        deps.ifOneTime = directives.if.onlyOneTime;
+        deps.ifValue = processBinding(IF, directives.if, template, model);
+
+        // oneTime if & predicate is false. nothing else to do.
+        if (deps.ifOneTime && !deps.ifValue) {
+          this.updateIteratedValue();
+          return;
+        }
+
+        if (!deps.ifOneTime)
+          deps.ifValue.open(this.updateIteratedValue, this);
+      }
+
+      if (directives.repeat) {
+        deps.repeat = true;
+        deps.oneTime = directives.repeat.onlyOneTime;
+        deps.value = processBinding(REPEAT, directives.repeat, template, model);
+      } else {
+        deps.repeat = false;
+        deps.oneTime = directives.bind.onlyOneTime;
+        deps.value = processBinding(BIND, directives.bind, template, model);
+      }
+
+      if (!deps.oneTime)
+        deps.value.open(this.updateIteratedValue, this);
+
+      this.updateIteratedValue();
+    },
+
+    updateIteratedValue: function() {
+      if (this.deps.hasIf) {
+        var ifValue = this.deps.ifValue;
+        if (!this.deps.ifOneTime)
+          ifValue = ifValue.discardChanges();
+        if (!ifValue) {
+          this.valueChanged();
+          return;
+        }
+      }
+
+      var value = this.deps.value;
+      if (!this.deps.oneTime)
+        value = value.discardChanges();
+      if (!this.deps.repeat)
+        value = [value];
+      var observe = this.deps.repeat &&
+                    !this.deps.oneTime &&
+                    Array.isArray(value);
+      this.valueChanged(value, observe);
+    },
+
+    valueChanged: function(value, observeValue) {
+      if (!Array.isArray(value))
+        value = [];
+
+      if (value === this.iteratedValue)
+        return;
+
+      this.unobserve();
+      this.presentValue = value;
+      if (observeValue) {
+        this.arrayObserver = new ArrayObserver(this.presentValue);
+        this.arrayObserver.open(this.handleSplices, this);
+      }
+
+      this.handleSplices(ArrayObserver.calculateSplices(this.presentValue,
+                                                        this.iteratedValue));
+    },
+
+    getLastInstanceNode: function(index) {
+      if (index == -1)
+        return this.templateElement_;
+      var instance = this.instances[index];
+      var terminator = instance.terminator_;
+      if (!terminator)
+        return this.getLastInstanceNode(index - 1);
+
+      if (terminator.nodeType !== Node.ELEMENT_NODE ||
+          this.templateElement_ === terminator) {
+        return terminator;
+      }
+
+      var subtemplateIterator = terminator.iterator_;
+      if (!subtemplateIterator)
+        return terminator;
+
+      return subtemplateIterator.getLastTemplateNode();
+    },
+
+    getLastTemplateNode: function() {
+      return this.getLastInstanceNode(this.instances.length - 1);
+    },
+
+    insertInstanceAt: function(index, fragment) {
+      var previousInstanceLast = this.getLastInstanceNode(index - 1);
+      var parent = this.templateElement_.parentNode;
+      this.instances.splice(index, 0, fragment);
+
+      parent.insertBefore(fragment, previousInstanceLast.nextSibling);
+    },
+
+    extractInstanceAt: function(index) {
+      var previousInstanceLast = this.getLastInstanceNode(index - 1);
+      var lastNode = this.getLastInstanceNode(index);
+      var parent = this.templateElement_.parentNode;
+      var instance = this.instances.splice(index, 1)[0];
+
+      while (lastNode !== previousInstanceLast) {
+        var node = previousInstanceLast.nextSibling;
+        if (node == lastNode)
+          lastNode = previousInstanceLast;
+
+        instance.appendChild(parent.removeChild(node));
+      }
+
+      return instance;
+    },
+
+    getDelegateFn: function(fn) {
+      fn = fn && fn(this.templateElement_);
+      return typeof fn === 'function' ? fn : null;
+    },
+
+    handleSplices: function(splices) {
+      if (this.closed || !splices.length)
+        return;
+
+      var template = this.templateElement_;
+
+      if (!template.parentNode) {
+        this.close();
+        return;
+      }
+
+      ArrayObserver.applySplices(this.iteratedValue, this.presentValue,
+                                 splices);
+
+      var delegate = template.delegate_;
+      if (this.instanceModelFn_ === undefined) {
+        this.instanceModelFn_ =
+            this.getDelegateFn(delegate && delegate.prepareInstanceModel);
+      }
+
+      if (this.instancePositionChangedFn_ === undefined) {
+        this.instancePositionChangedFn_ =
+            this.getDelegateFn(delegate &&
+                               delegate.prepareInstancePositionChanged);
+      }
+
+      // Instance Removals
+      var instanceCache = new Map;
+      var removeDelta = 0;
+      for (var i = 0; i < splices.length; i++) {
+        var splice = splices[i];
+        var removed = splice.removed;
+        for (var j = 0; j < removed.length; j++) {
+          var model = removed[j];
+          var instance = this.extractInstanceAt(splice.index + removeDelta);
+          if (instance !== emptyInstance) {
+            instanceCache.set(model, instance);
+          }
+        }
+
+        removeDelta -= splice.addedCount;
+      }
+
+      // Instance Insertions
+      for (var i = 0; i < splices.length; i++) {
+        var splice = splices[i];
+        var addIndex = splice.index;
+        for (; addIndex < splice.index + splice.addedCount; addIndex++) {
+          var model = this.iteratedValue[addIndex];
+          var instance = instanceCache.get(model);
+          if (instance) {
+            instanceCache.delete(model);
+          } else {
+            if (this.instanceModelFn_) {
+              model = this.instanceModelFn_(model);
+            }
+
+            if (model === undefined) {
+              instance = emptyInstance;
+            } else {
+              instance = template.createInstance(model, undefined, delegate);
+            }
+          }
+
+          this.insertInstanceAt(addIndex, instance);
+        }
+      }
+
+      instanceCache.forEach(function(instance) {
+        this.closeInstanceBindings(instance);
+      }, this);
+
+      if (this.instancePositionChangedFn_)
+        this.reportInstancesMoved(splices);
+    },
+
+    reportInstanceMoved: function(index) {
+      var instance = this.instances[index];
+      if (instance === emptyInstance)
+        return;
+
+      this.instancePositionChangedFn_(instance.templateInstance_, index);
+    },
+
+    reportInstancesMoved: function(splices) {
+      var index = 0;
+      var offset = 0;
+      for (var i = 0; i < splices.length; i++) {
+        var splice = splices[i];
+        if (offset != 0) {
+          while (index < splice.index) {
+            this.reportInstanceMoved(index);
+            index++;
+          }
+        } else {
+          index = splice.index;
+        }
+
+        while (index < splice.index + splice.addedCount) {
+          this.reportInstanceMoved(index);
+          index++;
+        }
+
+        offset += splice.addedCount - splice.removed.length;
+      }
+
+      if (offset == 0)
+        return;
+
+      var length = this.instances.length;
+      while (index < length) {
+        this.reportInstanceMoved(index);
+        index++;
+      }
+    },
+
+    closeInstanceBindings: function(instance) {
+      var bindings = instance.bindings_;
+      for (var i = 0; i < bindings.length; i++) {
+        bindings[i].close();
+      }
+    },
+
+    unobserve: function() {
+      if (!this.arrayObserver)
+        return;
+
+      this.arrayObserver.close();
+      this.arrayObserver = undefined;
+    },
+
+    close: function() {
+      if (this.closed)
+        return;
+      this.unobserve();
+      for (var i = 0; i < this.instances.length; i++) {
+        this.closeInstanceBindings(this.instances[i]);
+      }
+
+      this.instances.length = 0;
+      this.closeDeps();
+      this.templateElement_.iterator_ = undefined;
+      this.closed = true;
+    }
+  };
+
+  // Polyfill-specific API.
+  HTMLTemplateElement.forAllTemplatesFrom_ = forAllTemplatesFrom;
+})(this);
+
+/*
+  Copyright (C) 2013 Ariya Hidayat <ariya.hidayat@gmail.com>
+  Copyright (C) 2013 Thaddee Tyl <thaddee.tyl@gmail.com>
+  Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
+  Copyright (C) 2012 Mathias Bynens <mathias@qiwi.be>
+  Copyright (C) 2012 Joost-Wim Boekesteijn <joost-wim@boekesteijn.nl>
+  Copyright (C) 2012 Kris Kowal <kris.kowal@cixar.com>
+  Copyright (C) 2012 Yusuke Suzuki <utatane.tea@gmail.com>
+  Copyright (C) 2012 Arpad Borsos <arpad.borsos@googlemail.com>
+  Copyright (C) 2011 Ariya Hidayat <ariya.hidayat@gmail.com>
+
+  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.
+
+  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 <COPYRIGHT HOLDER> 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.
+*/
+
+(function (global) {
+    'use strict';
+
+    var Token,
+        TokenName,
+        Syntax,
+        Messages,
+        source,
+        index,
+        length,
+        delegate,
+        lookahead,
+        state;
+
+    Token = {
+        BooleanLiteral: 1,
+        EOF: 2,
+        Identifier: 3,
+        Keyword: 4,
+        NullLiteral: 5,
+        NumericLiteral: 6,
+        Punctuator: 7,
+        StringLiteral: 8
+    };
+
+    TokenName = {};
+    TokenName[Token.BooleanLiteral] = 'Boolean';
+    TokenName[Token.EOF] = '<end>';
+    TokenName[Token.Identifier] = 'Identifier';
+    TokenName[Token.Keyword] = 'Keyword';
+    TokenName[Token.NullLiteral] = 'Null';
+    TokenName[Token.NumericLiteral] = 'Numeric';
+    TokenName[Token.Punctuator] = 'Punctuator';
+    TokenName[Token.StringLiteral] = 'String';
+
+    Syntax = {
+        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'
+    };
+
+    // Error messages should be identical to V8.
+    Messages = {
+        UnexpectedToken:  'Unexpected token %0',
+        UnknownLabel: 'Undefined label \'%0\'',
+        Redeclaration: '%0 \'%1\' has already been declared'
+    };
+
+    // Ensure the condition is true, otherwise throw an error.
+    // This is only to have a better contract semantic, i.e. another safety net
+    // to catch a logic error. The condition shall be fulfilled in normal case.
+    // Do NOT use this to enforce a certain condition on any user input.
+
+    function assert(condition, message) {
+        if (!condition) {
+            throw new Error('ASSERT: ' + message);
+        }
+    }
+
+    function isDecimalDigit(ch) {
+        return (ch >= 48 && ch <= 57);   // 0..9
+    }
+
+
+    // 7.2 White Space
+
+    function isWhiteSpace(ch) {
+        return (ch === 32) ||  // space
+            (ch === 9) ||      // tab
+            (ch === 0xB) ||
+            (ch === 0xC) ||
+            (ch === 0xA0) ||
+            (ch >= 0x1680 && '\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\uFEFF'.indexOf(String.fromCharCode(ch)) > 0);
+    }
+
+    // 7.3 Line Terminators
+
+    function isLineTerminator(ch) {
+        return (ch === 10) || (ch === 13) || (ch === 0x2028) || (ch === 0x2029);
+    }
+
+    // 7.6 Identifier Names and Identifiers
+
+    function isIdentifierStart(ch) {
+        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)
+            (ch >= 65 && ch <= 90) ||         // A..Z
+            (ch >= 97 && ch <= 122);          // a..z
+    }
+
+    function isIdentifierPart(ch) {
+        return (ch === 36) || (ch === 95) ||  // $ (dollar) and _ (underscore)
+            (ch >= 65 && ch <= 90) ||         // A..Z
+            (ch >= 97 && ch <= 122) ||        // a..z
+            (ch >= 48 && ch <= 57);           // 0..9
+    }
+
+    // 7.6.1.1 Keywords
+
+    function isKeyword(id) {
+        return (id === 'this')
+    }
+
+    // 7.4 Comments
+
+    function skipWhitespace() {
+        while (index < length && isWhiteSpace(source.charCodeAt(index))) {
+           ++index;
+        }
+    }
+
+    function getIdentifier() {
+        var start, ch;
+
+        start = index++;
+        while (index < length) {
+            ch = source.charCodeAt(index);
+            if (isIdentifierPart(ch)) {
+                ++index;
+            } else {
+                break;
+            }
+        }
+
+        return source.slice(start, index);
+    }
+
+    function scanIdentifier() {
+        var start, id, type;
+
+        start = index;
+
+        id = getIdentifier();
+
+        // There is no keyword or literal with only one character.
+        // Thus, it must be an identifier.
+        if (id.length === 1) {
+            type = Token.Identifier;
+        } else if (isKeyword(id)) {
+            type = Token.Keyword;
+        } else if (id === 'null') {
+            type = Token.NullLiteral;
+        } else if (id === 'true' || id === 'false') {
+            type = Token.BooleanLiteral;
+        } else {
+            type = Token.Identifier;
+        }
+
+        return {
+            type: type,
+            value: id,
+            range: [start, index]
+        };
+    }
+
+
+    // 7.7 Punctuators
+
+    function scanPunctuator() {
+        var start = index,
+            code = source.charCodeAt(index),
+            code2,
+            ch1 = source[index],
+            ch2;
+
+        switch (code) {
+
+        // Check for most common single-character punctuators.
+        case 46:   // . dot
+        case 40:   // ( open bracket
+        case 41:   // ) close bracket
+        case 59:   // ; semicolon
+        case 44:   // , comma
+        case 123:  // { open curly brace
+        case 125:  // } close curly brace
+        case 91:   // [
+        case 93:   // ]
+        case 58:   // :
+        case 63:   // ?
+            ++index;
+            return {
+                type: Token.Punctuator,
+                value: String.fromCharCode(code),
+                range: [start, index]
+            };
+
+        default:
+            code2 = source.charCodeAt(index + 1);
+
+            // '=' (char #61) marks an assignment or comparison operator.
+            if (code2 === 61) {
+                switch (code) {
+                case 37:  // %
+                case 38:  // &
+                case 42:  // *:
+                case 43:  // +
+                case 45:  // -
+                case 47:  // /
+                case 60:  // <
+                case 62:  // >
+                case 124: // |
+                    index += 2;
+                    return {
+                        type: Token.Punctuator,
+                        value: String.fromCharCode(code) + String.fromCharCode(code2),
+                        range: [start, index]
+                    };
+
+                case 33: // !
+                case 61: // =
+                    index += 2;
+
+                    // !== and ===
+                    if (source.charCodeAt(index) === 61) {
+                        ++index;
+                    }
+                    return {
+                        type: Token.Punctuator,
+                        value: source.slice(start, index),
+                        range: [start, index]
+                    };
+                default:
+                    break;
+                }
+            }
+            break;
+        }
+
+        // Peek more characters.
+
+        ch2 = source[index + 1];
+
+        // Other 2-character punctuators: && ||
+
+        if (ch1 === ch2 && ('&|'.indexOf(ch1) >= 0)) {
+            index += 2;
+            return {
+                type: Token.Punctuator,
+                value: ch1 + ch2,
+                range: [start, index]
+            };
+        }
+
+        if ('<>=!+-*%&|^/'.indexOf(ch1) >= 0) {
+            ++index;
+            return {
+                type: Token.Punctuator,
+                value: ch1,
+                range: [start, index]
+            };
+        }
+
+        throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+    }
+
+    // 7.8.3 Numeric Literals
+    function scanNumericLiteral() {
+        var number, start, ch;
+
+        ch = source[index];
+        assert(isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'),
+            'Numeric literal must start with a decimal digit or a decimal point');
+
+        start = index;
+        number = '';
+        if (ch !== '.') {
+            number = source[index++];
+            ch = source[index];
+
+            // Hex number starts with '0x'.
+            // Octal number starts with '0'.
+            if (number === '0') {
+                // decimal number starts with '0' such as '09' is illegal.
+                if (ch && isDecimalDigit(ch.charCodeAt(0))) {
+                    throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+                }
+            }
+
+            while (isDecimalDigit(source.charCodeAt(index))) {
+                number += source[index++];
+            }
+            ch = source[index];
+        }
+
+        if (ch === '.') {
+            number += source[index++];
+            while (isDecimalDigit(source.charCodeAt(index))) {
+                number += source[index++];
+            }
+            ch = source[index];
+        }
+
+        if (ch === 'e' || ch === 'E') {
+            number += source[index++];
+
+            ch = source[index];
+            if (ch === '+' || ch === '-') {
+                number += source[index++];
+            }
+            if (isDecimalDigit(source.charCodeAt(index))) {
+                while (isDecimalDigit(source.charCodeAt(index))) {
+                    number += source[index++];
+                }
+            } else {
+                throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+            }
+        }
+
+        if (isIdentifierStart(source.charCodeAt(index))) {
+            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+        }
+
+        return {
+            type: Token.NumericLiteral,
+            value: parseFloat(number),
+            range: [start, index]
+        };
+    }
+
+    // 7.8.4 String Literals
+
+    function scanStringLiteral() {
+        var str = '', quote, start, ch, octal = false;
+
+        quote = source[index];
+        assert((quote === '\'' || quote === '"'),
+            'String literal must starts with a quote');
+
+        start = index;
+        ++index;
+
+        while (index < length) {
+            ch = source[index++];
+
+            if (ch === quote) {
+                quote = '';
+                break;
+            } else if (ch === '\\') {
+                ch = source[index++];
+                if (!ch || !isLineTerminator(ch.charCodeAt(0))) {
+                    switch (ch) {
+                    case 'n':
+                        str += '\n';
+                        break;
+                    case 'r':
+                        str += '\r';
+                        break;
+                    case 't':
+                        str += '\t';
+                        break;
+                    case 'b':
+                        str += '\b';
+                        break;
+                    case 'f':
+                        str += '\f';
+                        break;
+                    case 'v':
+                        str += '\x0B';
+                        break;
+
+                    default:
+                        str += ch;
+                        break;
+                    }
+                } else {
+                    if (ch ===  '\r' && source[index] === '\n') {
+                        ++index;
+                    }
+                }
+            } else if (isLineTerminator(ch.charCodeAt(0))) {
+                break;
+            } else {
+                str += ch;
+            }
+        }
+
+        if (quote !== '') {
+            throwError({}, Messages.UnexpectedToken, 'ILLEGAL');
+        }
+
+        return {
+            type: Token.StringLiteral,
+            value: str,
+            octal: octal,
+            range: [start, index]
+        };
+    }
+
+    function isIdentifierName(token) {
+        return token.type === Token.Identifier ||
+            token.type === Token.Keyword ||
+            token.type === Token.BooleanLiteral ||
+            token.type === Token.NullLiteral;
+    }
+
+    function advance() {
+        var ch;
+
+        skipWhitespace();
+
+        if (index >= length) {
+            return {
+                type: Token.EOF,
+                range: [index, index]
+            };
+        }
+
+        ch = source.charCodeAt(index);
+
+        // Very common: ( and ) and ;
+        if (ch === 40 || ch === 41 || ch === 58) {
+            return scanPunctuator();
+        }
+
+        // String literal starts with single quote (#39) or double quote (#34).
+        if (ch === 39 || ch === 34) {
+            return scanStringLiteral();
+        }
+
+        if (isIdentifierStart(ch)) {
+            return scanIdentifier();
+        }
+
+        // Dot (.) char #46 can also start a floating-point number, hence the need
+        // to check the next character.
+        if (ch === 46) {
+            if (isDecimalDigit(source.charCodeAt(index + 1))) {
+                return scanNumericLiteral();
+            }
+            return scanPunctuator();
+        }
+
+        if (isDecimalDigit(ch)) {
+            return scanNumericLiteral();
+        }
+
+        return scanPunctuator();
+    }
+
+    function lex() {
+        var token;
+
+        token = lookahead;
+        index = token.range[1];
+
+        lookahead = advance();
+
+        index = token.range[1];
+
+        return token;
+    }
+
+    function peek() {
+        var pos;
+
+        pos = index;
+        lookahead = advance();
+        index = pos;
+    }
+
+    // Throw an exception
+
+    function throwError(token, messageFormat) {
+        var error,
+            args = Array.prototype.slice.call(arguments, 2),
+            msg = messageFormat.replace(
+                /%(\d)/g,
+                function (whole, index) {
+                    assert(index < args.length, 'Message reference must be in range');
+                    return args[index];
+                }
+            );
+
+        error = new Error(msg);
+        error.index = index;
+        error.description = msg;
+        throw error;
+    }
+
+    // Throw an exception because of the token.
+
+    function throwUnexpected(token) {
+        throwError(token, Messages.UnexpectedToken, token.value);
+    }
+
+    // Expect the next token to match the specified punctuator.
+    // If not, an exception will be thrown.
+
+    function expect(value) {
+        var token = lex();
+        if (token.type !== Token.Punctuator || token.value !== value) {
+            throwUnexpected(token);
+        }
+    }
+
+    // Return true if the next token matches the specified punctuator.
+
+    function match(value) {
+        return lookahead.type === Token.Punctuator && lookahead.value === value;
+    }
+
+    // Return true if the next token matches the specified keyword
+
+    function matchKeyword(keyword) {
+        return lookahead.type === Token.Keyword && lookahead.value === keyword;
+    }
+
+    function consumeSemicolon() {
+        // Catch the very common case first: immediately a semicolon (char #59).
+        if (source.charCodeAt(index) === 59) {
+            lex();
+            return;
+        }
+
+        skipWhitespace();
+
+        if (match(';')) {
+            lex();
+            return;
+        }
+
+        if (lookahead.type !== Token.EOF && !match('}')) {
+            throwUnexpected(lookahead);
+        }
+    }
+
+    // 11.1.4 Array Initialiser
+
+    function parseArrayInitialiser() {
+        var elements = [];
+
+        expect('[');
+
+        while (!match(']')) {
+            if (match(',')) {
+                lex();
+                elements.push(null);
+            } else {
+                elements.push(parseExpression());
+
+                if (!match(']')) {
+                    expect(',');
+                }
+            }
+        }
+
+        expect(']');
+
+        return delegate.createArrayExpression(elements);
+    }
+
+    // 11.1.5 Object Initialiser
+
+    function parseObjectPropertyKey() {
+        var token;
+
+        skipWhitespace();
+        token = lex();
+
+        // Note: This function is called only from parseObjectProperty(), where
+        // EOF and Punctuator tokens are already filtered out.
+        if (token.type === Token.StringLiteral || token.type === Token.NumericLiteral) {
+            return delegate.createLiteral(token);
+        }
+
+        return delegate.createIdentifier(token.value);
+    }
+
+    function parseObjectProperty() {
+        var token, key;
+
+        token = lookahead;
+        skipWhitespace();
+
+        if (token.type === Token.EOF || token.type === Token.Punctuator) {
+            throwUnexpected(token);
+        }
+
+        key = parseObjectPropertyKey();
+        expect(':');
+        return delegate.createProperty('init', key, parseExpression());
+    }
+
+    function parseObjectInitialiser() {
+        var properties = [];
+
+        expect('{');
+
+        while (!match('}')) {
+            properties.push(parseObjectProperty());
+
+            if (!match('}')) {
+                expect(',');
+            }
+        }
+
+        expect('}');
+
+        return delegate.createObjectExpression(properties);
+    }
+
+    // 11.1.6 The Grouping Operator
+
+    function parseGroupExpression() {
+        var expr;
+
+        expect('(');
+
+        expr = parseExpression();
+
+        expect(')');
+
+        return expr;
+    }
+
+
+    // 11.1 Primary Expressions
+
+    function parsePrimaryExpression() {
+        var type, token, expr;
+
+        if (match('(')) {
+            return parseGroupExpression();
+        }
+
+        type = lookahead.type;
+
+        if (type === Token.Identifier) {
+            expr = delegate.createIdentifier(lex().value);
+        } else if (type === Token.StringLiteral || type === Token.NumericLiteral) {
+            expr = delegate.createLiteral(lex());
+        } else if (type === Token.Keyword) {
+            if (matchKeyword('this')) {
+                lex();
+                expr = delegate.createThisExpression();
+            }
+        } else if (type === Token.BooleanLiteral) {
+            token = lex();
+            token.value = (token.value === 'true');
+            expr = delegate.createLiteral(token);
+        } else if (type === Token.NullLiteral) {
+            token = lex();
+            token.value = null;
+            expr = delegate.createLiteral(token);
+        } else if (match('[')) {
+            expr = parseArrayInitialiser();
+        } else if (match('{')) {
+            expr = parseObjectInitialiser();
+        }
+
+        if (expr) {
+            return expr;
+        }
+
+        throwUnexpected(lex());
+    }
+
+    // 11.2 Left-Hand-Side Expressions
+
+    function parseArguments() {
+        var args = [];
+
+        expect('(');
+
+        if (!match(')')) {
+            while (index < length) {
+                args.push(parseExpression());
+                if (match(')')) {
+                    break;
+                }
+                expect(',');
+            }
+        }
+
+        expect(')');
+
+        return args;
+    }
+
+    function parseNonComputedProperty() {
+        var token;
+
+        token = lex();
+
+        if (!isIdentifierName(token)) {
+            throwUnexpected(token);
+        }
+
+        return delegate.createIdentifier(token.value);
+    }
+
+    function parseNonComputedMember() {
+        expect('.');
+
+        return parseNonComputedProperty();
+    }
+
+    function parseComputedMember() {
+        var expr;
+
+        expect('[');
+
+        expr = parseExpression();
+
+        expect(']');
+
+        return expr;
+    }
+
+    function parseLeftHandSideExpression() {
+        var expr, property;
+
+        expr = parsePrimaryExpression();
+
+        while (match('.') || match('[')) {
+            if (match('[')) {
+                property = parseComputedMember();
+                expr = delegate.createMemberExpression('[', expr, property);
+            } else {
+                property = parseNonComputedMember();
+                expr = delegate.createMemberExpression('.', expr, property);
+            }
+        }
+
+        return expr;
+    }
+
+    // 11.3 Postfix Expressions
+
+    var parsePostfixExpression = parseLeftHandSideExpression;
+
+    // 11.4 Unary Operators
+
+    function parseUnaryExpression() {
+        var token, expr;
+
+        if (lookahead.type !== Token.Punctuator && lookahead.type !== Token.Keyword) {
+            expr = parsePostfixExpression();
+        } else if (match('+') || match('-') || match('!')) {
+            token = lex();
+            expr = parseUnaryExpression();
+            expr = delegate.createUnaryExpression(token.value, expr);
+        } else if (matchKeyword('delete') || matchKeyword('void') || matchKeyword('typeof')) {
+            throwError({}, Messages.UnexpectedToken);
+        } else {
+            expr = parsePostfixExpression();
+        }
+
+        return expr;
+    }
+
+    function binaryPrecedence(token) {
+        var prec = 0;
+
+        if (token.type !== Token.Punctuator && token.type !== Token.Keyword) {
+            return 0;
+        }
+
+        switch (token.value) {
+        case '||':
+            prec = 1;
+            break;
+
+        case '&&':
+            prec = 2;
+            break;
+
+        case '==':
+        case '!=':
+        case '===':
+        case '!==':
+            prec = 6;
+            break;
+
+        case '<':
+        case '>':
+        case '<=':
+        case '>=':
+        case 'instanceof':
+            prec = 7;
+            break;
+
+        case 'in':
+            prec = 7;
+            break;
+
+        case '+':
+        case '-':
+            prec = 9;
+            break;
+
+        case '*':
+        case '/':
+        case '%':
+            prec = 11;
+            break;
+
+        default:
+            break;
+        }
+
+        return prec;
+    }
+
+    // 11.5 Multiplicative Operators
+    // 11.6 Additive Operators
+    // 11.7 Bitwise Shift Operators
+    // 11.8 Relational Operators
+    // 11.9 Equality Operators
+    // 11.10 Binary Bitwise Operators
+    // 11.11 Binary Logical Operators
+
+    function parseBinaryExpression() {
+        var expr, token, prec, stack, right, operator, left, i;
+
+        left = parseUnaryExpression();
+
+        token = lookahead;
+        prec = binaryPrecedence(token);
+        if (prec === 0) {
+            return left;
+        }
+        token.prec = prec;
+        lex();
+
+        right = parseUnaryExpression();
+
+        stack = [left, token, right];
+
+        while ((prec = binaryPrecedence(lookahead)) > 0) {
+
+            // Reduce: make a binary expression from the three topmost entries.
+            while ((stack.length > 2) && (prec <= stack[stack.length - 2].prec)) {
+                right = stack.pop();
+                operator = stack.pop().value;
+                left = stack.pop();
+                expr = delegate.createBinaryExpression(operator, left, right);
+                stack.push(expr);
+            }
+
+            // Shift.
+            token = lex();
+            token.prec = prec;
+            stack.push(token);
+            expr = parseUnaryExpression();
+            stack.push(expr);
+        }
+
+        // Final reduce to clean-up the stack.
+        i = stack.length - 1;
+        expr = stack[i];
+        while (i > 1) {
+            expr = delegate.createBinaryExpression(stack[i - 1].value, stack[i - 2], expr);
+            i -= 2;
+        }
+
+        return expr;
+    }
+
+
+    // 11.12 Conditional Operator
+
+    function parseConditionalExpression() {
+        var expr, consequent, alternate;
+
+        expr = parseBinaryExpression();
+
+        if (match('?')) {
+            lex();
+            consequent = parseConditionalExpression();
+            expect(':');
+            alternate = parseConditionalExpression();
+
+            expr = delegate.createConditionalExpression(expr, consequent, alternate);
+        }
+
+        return expr;
+    }
+
+    // Simplification since we do not support AssignmentExpression.
+    var parseExpression = parseConditionalExpression;
+
+    // Polymer Syntax extensions
+
+    // Filter ::
+    //   Identifier
+    //   Identifier "(" ")"
+    //   Identifier "(" FilterArguments ")"
+
+    function parseFilter() {
+        var identifier, args;
+
+        identifier = lex();
+
+        if (identifier.type !== Token.Identifier) {
+            throwUnexpected(identifier);
+        }
+
+        args = match('(') ? parseArguments() : [];
+
+        return delegate.createFilter(identifier.value, args);
+    }
+
+    // Filters ::
+    //   "|" Filter
+    //   Filters "|" Filter
+
+    function parseFilters() {
+        while (match('|')) {
+            lex();
+            parseFilter();
+        }
+    }
+
+    // TopLevel ::
+    //   LabelledExpressions
+    //   AsExpression
+    //   InExpression
+    //   FilterExpression
+
+    // AsExpression ::
+    //   FilterExpression as Identifier
+
+    // InExpression ::
+    //   Identifier, Identifier in FilterExpression
+    //   Identifier in FilterExpression
+
+    // FilterExpression ::
+    //   Expression
+    //   Expression Filters
+
+    function parseTopLevel() {
+        skipWhitespace();
+        peek();
+
+        var expr = parseExpression();
+        if (expr) {
+            if (lookahead.value === ',' || lookahead.value == 'in' &&
+                       expr.type === Syntax.Identifier) {
+                parseInExpression(expr);
+            } else {
+                parseFilters();
+                if (lookahead.value === 'as') {
+                    parseAsExpression(expr);
+                } else {
+                    delegate.createTopLevel(expr);
+                }
+            }
+        }
+
+        if (lookahead.type !== Token.EOF) {
+            throwUnexpected(lookahead);
+        }
+    }
+
+    function parseAsExpression(expr) {
+        lex();  // as
+        var identifier = lex().value;
+        delegate.createAsExpression(expr, identifier);
+    }
+
+    function parseInExpression(identifier) {
+        var indexName;
+        if (lookahead.value === ',') {
+            lex();
+            if (lookahead.type !== Token.Identifier)
+                throwUnexpected(lookahead);
+            indexName = lex().value;
+        }
+
+        lex();  // in
+        var expr = parseExpression();
+        parseFilters();
+        delegate.createInExpression(identifier.name, indexName, expr);
+    }
+
+    function parse(code, inDelegate) {
+        delegate = inDelegate;
+        source = code;
+        index = 0;
+        length = source.length;
+        lookahead = null;
+        state = {
+            labelSet: {}
+        };
+
+        return parseTopLevel();
+    }
+
+    global.esprima = {
+        parse: parse
+    };
+})(this);
+
+// 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 (global) {
+  'use strict';
+
+  // JScript does not have __proto__. We wrap all object literals with
+  // createObject which uses Object.create, Object.defineProperty and
+  // Object.getOwnPropertyDescriptor to create a new object that does the exact
+  // same thing. The main downside to this solution is that we have to extract
+  // all those property descriptors for IE.
+  var createObject = ('__proto__' in {}) ?
+      function(obj) { return obj; } :
+      function(obj) {
+        var proto = obj.__proto__;
+        if (!proto)
+          return obj;
+        var newObject = Object.create(proto);
+        Object.getOwnPropertyNames(obj).forEach(function(name) {
+          Object.defineProperty(newObject, name,
+                               Object.getOwnPropertyDescriptor(obj, name));
+        });
+        return newObject;
+      };
+
+  function prepareBinding(expressionText, name, node, filterRegistry) {
+    var expression;
+    try {
+      expression = getExpression(expressionText);
+      if (expression.scopeIdent &&
+          (node.nodeType !== Node.ELEMENT_NODE ||
+           node.tagName !== 'TEMPLATE' ||
+           (name !== 'bind' && name !== 'repeat'))) {
+        throw Error('as and in can only be used within <template bind/repeat>');
+      }
+    } catch (ex) {
+      console.error('Invalid expression syntax: ' + expressionText, ex);
+      return;
+    }
+
+    return function(model, node, oneTime) {
+      var binding = expression.getBinding(model, filterRegistry, oneTime);
+      if (expression.scopeIdent && binding) {
+        node.polymerExpressionScopeIdent_ = expression.scopeIdent;
+        if (expression.indexIdent)
+          node.polymerExpressionIndexIdent_ = expression.indexIdent;
+      }
+
+      return binding;
+    }
+  }
+
+  // TODO(rafaelw): Implement simple LRU.
+  var expressionParseCache = Object.create(null);
+
+  function getExpression(expressionText) {
+    var expression = expressionParseCache[expressionText];
+    if (!expression) {
+      var delegate = new ASTDelegate();
+      esprima.parse(expressionText, delegate);
+      expression = new Expression(delegate);
+      expressionParseCache[expressionText] = expression;
+    }
+    return expression;
+  }
+
+  function Literal(value) {
+    this.value = value;
+    this.valueFn_ = undefined;
+  }
+
+  Literal.prototype = {
+    valueFn: function() {
+      if (!this.valueFn_) {
+        var value = this.value;
+        this.valueFn_ = function() {
+          return value;
+        }
+      }
+
+      return this.valueFn_;
+    }
+  }
+
+  function IdentPath(name) {
+    this.name = name;
+    this.path = Path.get(name);
+  }
+
+  IdentPath.prototype = {
+    valueFn: function() {
+      if (!this.valueFn_) {
+        var name = this.name;
+        var path = this.path;
+        this.valueFn_ = function(model, observer) {
+          if (observer)
+            observer.addPath(model, path);
+
+          return path.getValueFrom(model);
+        }
+      }
+
+      return this.valueFn_;
+    },
+
+    setValue: function(model, newValue) {
+      if (this.path.length == 1);
+        model = findScope(model, this.path[0]);
+
+      return this.path.setValueFrom(model, newValue);
+    }
+  };
+
+  function MemberExpression(object, property, accessor) {
+    // convert literal computed property access where literal value is a value
+    // path to ident dot-access.
+    if (accessor == '[' &&
+        property instanceof Literal &&
+        Path.get(property.value).valid) {
+      accessor = '.';
+      property = new IdentPath(property.value);
+    }
+
+    this.dynamicDeps = typeof object == 'function' || object.dynamic;
+
+    this.dynamic = typeof property == 'function' ||
+                   property.dynamic ||
+                   accessor == '[';
+
+    this.simplePath =
+        !this.dynamic &&
+        !this.dynamicDeps &&
+        property instanceof IdentPath &&
+        (object instanceof MemberExpression || object instanceof IdentPath);
+
+    this.object = this.simplePath ? object : getFn(object);
+    this.property = accessor == '.' ? property : getFn(property);
+  }
+
+  MemberExpression.prototype = {
+    get fullPath() {
+      if (!this.fullPath_) {
+        var last = this.object instanceof IdentPath ?
+            this.object.name : this.object.fullPath;
+        this.fullPath_ = Path.get(last + '.' + this.property.name);
+      }
+
+      return this.fullPath_;
+    },
+
+    valueFn: function() {
+      if (!this.valueFn_) {
+        var object = this.object;
+
+        if (this.simplePath) {
+          var path = this.fullPath;
+
+          this.valueFn_ = function(model, observer) {
+            if (observer)
+              observer.addPath(model, path);
+
+            return path.getValueFrom(model);
+          };
+        } else if (this.property instanceof IdentPath) {
+          var path = Path.get(this.property.name);
+
+          this.valueFn_ = function(model, observer) {
+            var context = object(model, observer);
+
+            if (observer)
+              observer.addPath(context, path);
+
+            return path.getValueFrom(context);
+          }
+        } else {
+          // Computed property.
+          var property = this.property;
+
+          this.valueFn_ = function(model, observer) {
+            var context = object(model, observer);
+            var propName = property(model, observer);
+            if (observer)
+              observer.addPath(context, propName);
+
+            return context ? context[propName] : undefined;
+          };
+        }
+      }
+      return this.valueFn_;
+    },
+
+    setValue: function(model, newValue) {
+      if (this.simplePath) {
+        this.fullPath.setValueFrom(model, newValue);
+        return newValue;
+      }
+
+      var object = this.object(model);
+      var propName = this.property instanceof IdentPath ? this.property.name :
+          this.property(model);
+      return object[propName] = newValue;
+    }
+  };
+
+  function Filter(name, args) {
+    this.name = name;
+    this.args = [];
+    for (var i = 0; i < args.length; i++) {
+      this.args[i] = getFn(args[i]);
+    }
+  }
+
+  Filter.prototype = {
+    transform: function(value, toModelDirection, filterRegistry, model,
+                        observer) {
+      var fn = filterRegistry[this.name];
+      var context = model;
+      if (fn) {
+        context = undefined;
+      } else {
+        fn = context[this.name];
+        if (!fn) {
+          console.error('Cannot find filter: ' + this.name);
+          return;
+        }
+      }
+
+      // If toModelDirection is falsey, then the "normal" (dom-bound) direction
+      // is used. Otherwise, it looks for a 'toModel' property function on the
+      // object.
+      if (toModelDirection) {
+        fn = fn.toModel;
+      } else if (typeof fn.toDOM == 'function') {
+        fn = fn.toDOM;
+      }
+
+      if (typeof fn != 'function') {
+        console.error('No ' + (toModelDirection ? 'toModel' : 'toDOM') +
+                      ' found on' + this.name);
+        return;
+      }
+
+      var args = [value];
+      for (var i = 0; i < this.args.length; i++) {
+        args[i + 1] = getFn(this.args[i])(model, observer);
+      }
+
+      return fn.apply(context, args);
+    }
+  };
+
+  function notImplemented() { throw Error('Not Implemented'); }
+
+  var unaryOperators = {
+    '+': function(v) { return +v; },
+    '-': function(v) { return -v; },
+    '!': function(v) { return !v; }
+  };
+
+  var binaryOperators = {
+    '+': function(l, r) { return l+r; },
+    '-': function(l, r) { return l-r; },
+    '*': function(l, r) { return l*r; },
+    '/': function(l, r) { return l/r; },
+    '%': function(l, r) { return l%r; },
+    '<': function(l, r) { return l<r; },
+    '>': function(l, r) { return l>r; },
+    '<=': function(l, r) { return l<=r; },
+    '>=': function(l, r) { return l>=r; },
+    '==': function(l, r) { return l==r; },
+    '!=': function(l, r) { return l!=r; },
+    '===': function(l, r) { return l===r; },
+    '!==': function(l, r) { return l!==r; },
+    '&&': function(l, r) { return l&&r; },
+    '||': function(l, r) { return l||r; },
+  };
+
+  function getFn(arg) {
+    return typeof arg == 'function' ? arg : arg.valueFn();
+  }
+
+  function ASTDelegate() {
+    this.expression = null;
+    this.filters = [];
+    this.deps = {};
+    this.currentPath = undefined;
+    this.scopeIdent = undefined;
+    this.indexIdent = undefined;
+    this.dynamicDeps = false;
+  }
+
+  ASTDelegate.prototype = {
+    createUnaryExpression: function(op, argument) {
+      if (!unaryOperators[op])
+        throw Error('Disallowed operator: ' + op);
+
+      argument = getFn(argument);
+
+      return function(model, observer) {
+        return unaryOperators[op](argument(model, observer));
+      };
+    },
+
+    createBinaryExpression: function(op, left, right) {
+      if (!binaryOperators[op])
+        throw Error('Disallowed operator: ' + op);
+
+      left = getFn(left);
+      right = getFn(right);
+
+      return function(model, observer) {
+        return binaryOperators[op](left(model, observer),
+                                   right(model, observer));
+      };
+    },
+
+    createConditionalExpression: function(test, consequent, alternate) {
+      test = getFn(test);
+      consequent = getFn(consequent);
+      alternate = getFn(alternate);
+
+      return function(model, observer) {
+        return test(model, observer) ?
+            consequent(model, observer) : alternate(model, observer);
+      }
+    },
+
+    createIdentifier: function(name) {
+      var ident = new IdentPath(name);
+      ident.type = 'Identifier';
+      return ident;
+    },
+
+    createMemberExpression: function(accessor, object, property) {
+      var ex = new MemberExpression(object, property, accessor);
+      if (ex.dynamicDeps)
+        this.dynamicDeps = true;
+      return ex;
+    },
+
+    createLiteral: function(token) {
+      return new Literal(token.value);
+    },
+
+    createArrayExpression: function(elements) {
+      for (var i = 0; i < elements.length; i++)
+        elements[i] = getFn(elements[i]);
+
+      return function(model, observer) {
+        var arr = []
+        for (var i = 0; i < elements.length; i++)
+          arr.push(elements[i](model, observer));
+        return arr;
+      }
+    },
+
+    createProperty: function(kind, key, value) {
+      return {
+        key: key instanceof IdentPath ? key.name : key.value,
+        value: value
+      };
+    },
+
+    createObjectExpression: function(properties) {
+      for (var i = 0; i < properties.length; i++)
+        properties[i].value = getFn(properties[i].value);
+
+      return function(model, observer) {
+        var obj = {};
+        for (var i = 0; i < properties.length; i++)
+          obj[properties[i].key] = properties[i].value(model, observer);
+        return obj;
+      }
+    },
+
+    createFilter: function(name, args) {
+      this.filters.push(new Filter(name, args));
+    },
+
+    createAsExpression: function(expression, scopeIdent) {
+      this.expression = expression;
+      this.scopeIdent = scopeIdent;
+    },
+
+    createInExpression: function(scopeIdent, indexIdent, expression) {
+      this.expression = expression;
+      this.scopeIdent = scopeIdent;
+      this.indexIdent = indexIdent;
+    },
+
+    createTopLevel: function(expression) {
+      this.expression = expression;
+    },
+
+    createThisExpression: notImplemented
+  }
+
+  function ConstantObservable(value) {
+    this.value_ = value;
+  }
+
+  ConstantObservable.prototype = {
+    open: function() { return this.value_; },
+    discardChanges: function() { return this.value_; },
+    deliver: function() {},
+    close: function() {},
+  }
+
+  function Expression(delegate) {
+    this.scopeIdent = delegate.scopeIdent;
+    this.indexIdent = delegate.indexIdent;
+
+    if (!delegate.expression)
+      throw Error('No expression found.');
+
+    this.expression = delegate.expression;
+    getFn(this.expression); // forces enumeration of path dependencies
+
+    this.filters = delegate.filters;
+    this.dynamicDeps = delegate.dynamicDeps;
+  }
+
+  Expression.prototype = {
+    getBinding: function(model, filterRegistry, oneTime) {
+      if (oneTime)
+        return this.getValue(model, undefined, filterRegistry);
+
+      var observer = new CompoundObserver();
+      // captures deps.
+      var firstValue = this.getValue(model, observer, filterRegistry);
+      var firstTime = true;
+      var self = this;
+
+      function valueFn() {
+        // deps cannot have changed on first value retrieval.
+        if (firstTime) {
+          firstTime = false;
+          return firstValue;
+        }
+
+        if (self.dynamicDeps)
+          observer.startReset();
+
+        var value = self.getValue(model,
+                                  self.dynamicDeps ? observer : undefined,
+                                  filterRegistry);
+        if (self.dynamicDeps)
+          observer.finishReset();
+
+        return value;
+      }
+
+      function setValueFn(newValue) {
+        self.setValue(model, newValue, filterRegistry);
+        return newValue;
+      }
+
+      return new ObserverTransform(observer, valueFn, setValueFn, true);
+    },
+
+    getValue: function(model, observer, filterRegistry) {
+      var value = getFn(this.expression)(model, observer);
+      for (var i = 0; i < this.filters.length; i++) {
+        value = this.filters[i].transform(value, false, filterRegistry, model,
+                                          observer);
+      }
+
+      return value;
+    },
+
+    setValue: function(model, newValue, filterRegistry) {
+      var count = this.filters ? this.filters.length : 0;
+      while (count-- > 0) {
+        newValue = this.filters[count].transform(newValue, true, filterRegistry,
+                                                 model);
+      }
+
+      if (this.expression.setValue)
+        return this.expression.setValue(model, newValue);
+    }
+  }
+
+  /**
+   * Converts a style property name to a css property name. For example:
+   * "WebkitUserSelect" to "-webkit-user-select"
+   */
+  function convertStylePropertyName(name) {
+    return String(name).replace(/[A-Z]/g, function(c) {
+      return '-' + c.toLowerCase();
+    });
+  }
+
+  function isEventHandler(name) {
+    return name[0] === 'o' &&
+           name[1] === 'n' &&
+           name[2] === '-';
+  }
+
+  var mixedCaseEventTypes = {};
+  [
+    'webkitAnimationStart',
+    'webkitAnimationEnd',
+    'webkitTransitionEnd',
+    'DOMFocusOut',
+    'DOMFocusIn',
+    'DOMMouseScroll'
+  ].forEach(function(e) {
+    mixedCaseEventTypes[e.toLowerCase()] = e;
+  });
+
+  var parentScopeName = '@' + Math.random().toString(36).slice(2);
+
+  // Single ident paths must bind directly to the appropriate scope object.
+  // I.e. Pushed values in two-bindings need to be assigned to the actual model
+  // object.
+  function findScope(model, prop) {
+    while (model[parentScopeName] &&
+           !Object.prototype.hasOwnProperty.call(model, prop)) {
+      model = model[parentScopeName];
+    }
+
+    return model;
+  }
+
+  function resolveEventReceiver(model, path, node) {
+    if (path.length == 0)
+      return undefined;
+
+    if (path.length == 1)
+      return findScope(model, path[0]);
+
+    for (var i = 0; model != null && i < path.length - 1; i++) {
+      model = model[path[i]];
+    }
+
+    return model;
+  }
+
+  function prepareEventBinding(path, name, polymerExpressions) {
+    var eventType = name.substring(3);
+    eventType = mixedCaseEventTypes[eventType] || eventType;
+
+    return function(model, node, oneTime) {
+      var fn, receiver, handler;
+      if (typeof polymerExpressions.resolveEventHandler == 'function') {
+        handler = function(e) {
+          fn = fn || polymerExpressions.resolveEventHandler(model, path, node);
+          fn(e, e.detail, e.currentTarget);
+
+          if (Platform && typeof Platform.flush == 'function')
+            Platform.flush();
+        };
+      } else {
+        handler = function(e) {
+          fn = fn || path.getValueFrom(model);
+          receiver = receiver || resolveEventReceiver(model, path, node);
+
+          fn.apply(receiver, [e, e.detail, e.currentTarget]);
+
+          if (Platform && typeof Platform.flush == 'function')
+            Platform.flush();
+        };
+      }
+
+      node.addEventListener(eventType, handler);
+
+      if (oneTime)
+        return;
+
+      function bindingValue() {
+        return '{{ ' + path + ' }}';
+      }
+
+      return {
+        open: bindingValue,
+        discardChanges: bindingValue,
+        close: function() {
+          node.removeEventListener(eventType, handler);
+        }
+      };
+    }
+  }
+
+  function isLiteralExpression(pathString) {
+    switch (pathString) {
+      case '':
+        return false;
+
+      case 'false':
+      case 'null':
+      case 'true':
+        return true;
+    }
+
+    if (!isNaN(Number(pathString)))
+      return true;
+
+    return false;
+  };
+
+  function PolymerExpressions() {}
+
+  PolymerExpressions.prototype = {
+    // "built-in" filters
+    styleObject: function(value) {
+      var parts = [];
+      for (var key in value) {
+        parts.push(convertStylePropertyName(key) + ': ' + value[key]);
+      }
+      return parts.join('; ');
+    },
+
+    tokenList: function(value) {
+      var tokens = [];
+      for (var key in value) {
+        if (value[key])
+          tokens.push(key);
+      }
+      return tokens.join(' ');
+    },
+
+    // binding delegate API
+    prepareInstancePositionChanged: function(template) {
+      var indexIdent = template.polymerExpressionIndexIdent_;
+      if (!indexIdent)
+        return;
+
+      return function(templateInstance, index) {
+        templateInstance.model[indexIdent] = index;
+      };
+    },
+
+    prepareBinding: function(pathString, name, node) {
+      var path = Path.get(pathString);
+      if (isEventHandler(name)) {
+        if (!path.valid) {
+          console.error('on-* bindings must be simple path expressions');
+          return;
+        }
+
+        return prepareEventBinding(path, name, this);
+      }
+
+      if (!isLiteralExpression(pathString) && path.valid) {
+        if (path.length == 1) {
+          return function(model, node, oneTime) {
+            if (oneTime)
+              return path.getValueFrom(model);
+
+            var scope = findScope(model, path[0]);
+            return new PathObserver(scope, path);
+          };
+        }
+        return; // bail out early if pathString is simple path.
+      }
+
+      return prepareBinding(pathString, name, node, this);
+    },
+
+    prepareInstanceModel: function(template) {
+      var scopeName = template.polymerExpressionScopeIdent_;
+      if (!scopeName)
+        return;
+
+      var parentScope = template.templateInstance ?
+          template.templateInstance.model :
+          template.model;
+
+      var indexName = template.polymerExpressionIndexIdent_;
+
+      return function(model) {
+        var scope = Object.create(parentScope);
+        scope[scopeName] = model;
+        scope[indexName] = undefined;
+        scope[parentScopeName] = parentScope;
+        return scope;
+      };
+    }
+  };
+
+  global.PolymerExpressions = PolymerExpressions;
+  if (global.exposeGetExpression)
+    global.getExpression_ = getExpression;
+
+  global.PolymerExpressions.prepareEventBinding = prepareEventBinding;
+})(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.
+ */
+(function(scope) {
+
+// inject style sheet
+var style = document.createElement('style');
+style.textContent = 'template {display: none !important;} /* injected by platform.js */';
+var head = document.querySelector('head');
+head.insertBefore(style, head.firstChild);
+
+// flush (with logging)
+var flushing;
+function flush() {
+  if (!flushing) {
+    flushing = true;
+    scope.endOfMicrotask(function() {
+      flushing = false;
+      logFlags.data && console.group('Platform.flush()');
+      scope.performMicrotaskCheckpoint();
+      logFlags.data && console.groupEnd();
+    });
+  }
+};
+
+// polling dirty checker
+// flush periodically if platform does not have object observe.
+if (!Observer.hasObjectObserve) {
+  var FLUSH_POLL_INTERVAL = 125;
+  window.addEventListener('WebComponentsReady', function() {
+    flush();
+    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);
+  });
+} else {
+  // make flush a no-op when we have Object.observe
+  flush = function() {};
+}
+
+if (window.CustomElements && !CustomElements.useNative) {
+  var originalImportNode = Document.prototype.importNode;
+  Document.prototype.importNode = function(node, deep) {
+    var imported = originalImportNode.call(this, node, deep);
+    CustomElements.upgradeAll(imported);
+    return imported;
+  }
+}
+
+// exports
+scope.flush = flush;
+
+})(window.Platform);
+
+
+//# sourceMappingURL=platform.concat.js.map
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.concat.js.map b/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.concat.js.map
new file mode 100644
index 0000000..93e18ca
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.concat.js.map
@@ -0,0 +1,210 @@
+{
+  "version": 3,
+  "file": "platform.concat.js",
+  "sources": [
+    "../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/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/Element.js",
+    "../ShadowDOM/src/wrappers/HTMLElement.js",
+    "../ShadowDOM/src/wrappers/HTMLCanvasElement.js",
+    "../ShadowDOM/src/wrappers/HTMLContentElement.js",
+    "../ShadowDOM/src/wrappers/HTMLImageElement.js",
+    "../ShadowDOM/src/wrappers/HTMLShadowElement.js",
+    "../ShadowDOM/src/wrappers/HTMLTemplateElement.js",
+    "../ShadowDOM/src/wrappers/HTMLMediaElement.js",
+    "../ShadowDOM/src/wrappers/HTMLAudioElement.js",
+    "../ShadowDOM/src/wrappers/HTMLOptionElement.js",
+    "../ShadowDOM/src/wrappers/HTMLSelectElement.js",
+    "../ShadowDOM/src/wrappers/HTMLTableElement.js",
+    "../ShadowDOM/src/wrappers/HTMLTableSectionElement.js",
+    "../ShadowDOM/src/wrappers/HTMLTableRowElement.js",
+    "../ShadowDOM/src/wrappers/HTMLUnknownElement.js",
+    "../ShadowDOM/src/wrappers/SVGElement.js",
+    "../ShadowDOM/src/wrappers/SVGUseElement.js",
+    "../ShadowDOM/src/wrappers/SVGElementInstance.js",
+    "../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js",
+    "../ShadowDOM/src/wrappers/WebGLRenderingContext.js",
+    "../ShadowDOM/src/wrappers/Range.js",
+    "../ShadowDOM/src/wrappers/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/override-constructors.js",
+    "src/patches-shadowdom-polyfill.js",
+    "src/ShadowCSS.js",
+    "build/else.js",
+    "src/patches-shadowdom-native.js",
+    "build/end-if.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",
+    "../PointerEvents/src/boot.js",
+    "../PointerEvents/src/touch-action.js",
+    "../PointerEvents/src/PointerEvent.js",
+    "../PointerEvents/src/pointermap.js",
+    "../PointerEvents/src/dispatcher.js",
+    "../PointerEvents/src/installer.js",
+    "../PointerEvents/src/mouse.js",
+    "../PointerEvents/src/touch.js",
+    "../PointerEvents/src/ms.js",
+    "../PointerEvents/src/platform-events.js",
+    "../PointerEvents/src/capture.js",
+    "../PointerGestures/src/PointerGestureEvent.js",
+    "../PointerGestures/src/initialize.js",
+    "../PointerGestures/src/pointermap.js",
+    "../PointerGestures/src/dispatcher.js",
+    "../PointerGestures/src/hold.js",
+    "../PointerGestures/src/track.js",
+    "../PointerGestures/src/flick.js",
+    "../PointerGestures/src/pinch.js",
+    "../PointerGestures/src/tap.js",
+    "../PointerGestures/src/registerScopes.js",
+    "../NodeBind/src/NodeBind.js",
+    "../TemplateBinding/src/TemplateBinding.js",
+    "../polymer-expressions/third_party/esprima/esprima.js",
+    "../polymer-expressions/src/polymer-expressions.js",
+    "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;;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;;ACzjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5YA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC3tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;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;AACA;AACA;AACA;AACA;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;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;;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;;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;;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;;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;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;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;;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;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;ACjUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oB;ACjuBA,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;AACA;AACA,K;AC9CA,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;;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,oB;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,E;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;;AC7LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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,W;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AClHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;ACzdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC1JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzsCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5gCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
+  "sourcesContent": [
+    "/*\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 document has CSP securityPolicy object and we can see that\n    // eval is not supported. This avoids an error message in console even when the exception\n    // is caught\n    if (global.document &&\n        'securityPolicy' in global.document &&\n        !global.document.securityPolicy.allowsEval) {\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 isNaN(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 ident = identStart + '+' + identPart + '*';\n  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';\n  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';\n  var path = '(?:' + identOrElementIndex + ')(?:\\\\s*\\\\.\\\\s*' + identOrElementIndex + ')*';\n  var pathRegExp = new RegExp('^' + path + '$');\n\n  function isPathValid(s) {\n    if (typeof s != 'string')\n      return false;\n    s = s.trim();\n\n    if (s == '')\n      return true;\n\n    if (s[0] == '.')\n      return false;\n\n    return pathRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(s, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (s.trim() == '')\n      return this;\n\n    if (isIndex(s)) {\n      this.push(s);\n      return this;\n    }\n\n    s.split(/\\s*\\.\\s*/).filter(function(part) {\n      return part;\n    }).forEach(function(part) {\n      this.push(part);\n    }, this);\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)\n      pathString = '';\n\n    if (typeof pathString !== 'string')\n      pathString = String(pathString);\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n    if (!isPathValid(pathString))\n      return invalidPath;\n    var path = new Path(pathString, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      return this.join('.');\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);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var accessors = this.map(function(ident) {\n        return isIndex(ident) ? '[\"' + ident + '\"]' : '.' + ident;\n      });\n\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      for (; i < (this.length - 1); i++) {\n        var ident = this[i];\n        pathString += accessors[i];\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      pathString += accessors[i];\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  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 emptyArray = [];\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observers = [];\n    var observerCount = 0;\n    var objects = [];\n    var toRemove = emptyArray;\n    var resetNeeded = false;\n    var resetScheduled = false;\n\n    function observe(obj) {\n      if (!obj)\n        return;\n\n      var index = toRemove.indexOf(obj);\n      if (index >= 0) {\n        toRemove[index] = undefined;\n        objects.push(obj);\n      } else if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj));\n    }\n\n    function reset() {\n      var objs = toRemove === emptyArray ? [] : toRemove;\n      toRemove = objects;\n      objects = objs;\n\n      var observer;\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.iterateObjects_(observe);\n      }\n\n      for (var i = 0; i < toRemove.length; i++) {\n        var obj = toRemove[i];\n        if (obj)\n          Object.unobserve(obj, callback);\n      }\n\n      toRemove.length = 0;\n    }\n\n    function scheduledReset() {\n      resetScheduled = false;\n      if (!resetNeeded)\n        return;\n\n      reset();\n    }\n\n    function scheduleReset() {\n      if (resetScheduled)\n        return;\n\n      resetNeeded = true;\n      resetScheduled = true;\n      runEOM(scheduledReset);\n    }\n\n    function callback() {\n      reset();\n\n      var observer;\n\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.check_();\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs) {\n        observers[obs.id_] = obs;\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        var anyLeft = false;\n\n        observers[obs.id_] = undefined;\n        observerCount--;\n\n        if (observerCount) {\n          scheduleReset();\n          return;\n        }\n        resetNeeded = false;\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        observedSetCache.push(this);\n      },\n      reset: scheduleReset\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);\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.state_ = OPENED;\n      this.connect_();\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.state_ = CLOSED;\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = path instanceof Path ? path : getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\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]);\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() {\n    Observer.call(this);\n\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      this.check_(undefined, true);\n\n      if (!hasObserve)\n        return;\n\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 (this.directObserver_) {\n        if (needsDirectObserver) {\n          this.directObserver_.reset();\n          return;\n        }\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n        return;\n      }\n\n      if (needsDirectObserver)\n        this.directObserver_ = getObservedSet(this, object);\n    },\n\n    closeObservers_: 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    },\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      this.closeObservers_();\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      this.observed_.push(object, path instanceof Path ? path : getPath(path));\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      observer.open(this.deliver, this);\n      this.observed_.push(observerSentinel, observer);\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.closeObservers_();\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 pathOrObserver = this.observed_[i+1];\n        var object = this.observed_[i];\n        var value = object === observerSentinel ?\n            pathOrObserver.discardChanges() :\n            pathOrObserver.getValueFrom(object)\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 notifyFunction(object, name) {\n    if (typeof Object.observe !== 'function')\n      return;\n\n    var notifier = Object.getNotifier(object);\n    return function(type, oldValue) {\n      var changeRecord = {\n        object: object,\n        type: type,\n        name: name\n      };\n      if (arguments.length === 2)\n        changeRecord.oldValue = oldValue;\n      notifier.notify(changeRecord);\n    }\n  }\n\n  Observer.defineComputedProperty = function(target, name, observable) {\n    var notify = notifyFunction(target, name);\n    var value = observable.open(function(newValue, oldValue) {\n      value = newValue;\n      if (notify)\n        notify('update', oldValue);\n    });\n\n    Object.defineProperty(target, name, {\n      get: function() {\n        observable.deliver();\n        return value;\n      },\n      set: function(newValue) {\n        observable.setValue(newValue);\n        return newValue;\n      },\n      configurable: true\n    });\n\n    return {\n      close: function() {\n        observable.close();\n        Object.defineProperty(target, name, {\n          value: value,\n          writable: true,\n          configurable: true\n        });\n      }\n    };\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.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",
+    "// prepoulate window.Platform.flags for default controls\r\nwindow.Platform = window.Platform || {};\r\n// prepopulate window.logFlags if necessary\r\nwindow.logFlags = window.logFlags || {};\r\n// process flags\r\n(function(scope){\r\n  // import\r\n  var flags = scope.flags || {};\r\n  // populate flags from location\r\n  location.search.slice(1).split('&').forEach(function(o) {\r\n    o = o.split('=');\r\n    o[0] && (flags[o[0]] = o[1] || true);\r\n  });\r\n  var entryPoint = document.currentScript ||\r\n      document.querySelector('script[src*=\"platform.js\"]');\r\n  if (entryPoint) {\r\n    var a = entryPoint.attributes;\r\n    for (var i = 0, n; i < a.length; i++) {\r\n      n = a[i];\r\n      if (n.name !== 'src') {\r\n        flags[n.name] = n.value || true;\r\n      }\r\n    }\r\n  }\r\n  if (flags.log) {\r\n    flags.log.split(',').forEach(function(f) {\r\n      window.logFlags[f] = true;\r\n    });\r\n  }\r\n  // If any of these flags match 'native', then force native ShadowDOM; any\r\n  // other truthy value, or failure to detect native\r\n  // ShadowDOM, results in polyfill\r\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\r\n  if (flags.shadow === 'native') {\r\n    flags.shadow = false;\r\n  } else {\r\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\r\n  }\r\n\r\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\r\n    console.warn('platform.js is not the first script on the page. ' +\r\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\r\n        'for details.');\r\n  }\r\n\r\n  // CustomElements polyfill flag\r\n  if (flags.register) {\r\n    window.CustomElements = window.CustomElements || {flags: {}};\r\n    window.CustomElements.flags.register = flags.register;\r\n  }\r\n\r\n  if (flags.imports) {\r\n    window.HTMLImports = window.HTMLImports || {flags: {}};\r\n    window.HTMLImports.flags.imports = flags.imports;\r\n  }\r\n\r\n  // export\r\n  scope.flags = flags;\r\n})(Platform);\r\n\r\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  // Don't test for eval if document has CSP securityPolicy object and we can\n  // see that eval is not supported. This avoids an error message in console\n  // even when the exception is caught\n  var hasEval = !('securityPolicy' in document) ||\n      document.securityPolicy.allowsEval;\n  if (hasEval) {\n    try {\n      var f = new Function('', 'return true;');\n      hasEval = f();\n    } catch (ex) {\n      hasEval = false;\n    }\n  }\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    getOwnPropertyNames(from).forEach(function(name) {\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    });\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    getOwnPropertyNames(from).forEach(function(name) {\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          return;\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  // 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    defineProperty(wrapperPrototype, 'constructor', {\n      value: wrapperConstructor,\n      configurable: true,\n      enumerable: false,\n      writable: true\n    });\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  function defineGetter(constructor, name, getter) {\n    defineProperty(constructor.prototype, name, {\n      get: getter,\n      configurable: true,\n      enumerable: true\n    });\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   * @constructor\n   */\n  function TreeScope(root, parent) {\n    this.root = root;\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.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 isInsertionPoint(node) {\n    var localName = node.localName;\n    return localName === 'content' || localName === 'shadow';\n  }\n\n  function isShadowHost(node) {\n    return !!node.shadowRoot;\n  }\n\n  function getEventParent(node) {\n    var dv;\n    return node.parentNode || (dv = node.defaultView) && wrap(dv) || null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-parent\n  function calculateParents(node, context, ancestors) {\n    if (ancestors.length)\n      return ancestors.shift();\n\n    // 1.\n    if (isShadowRoot(node))\n      return getInsertionParent(node) || node.host;\n\n    // 2.\n    var eventParents = scope.eventParentsTable.get(node);\n    if (eventParents) {\n      // Copy over the remaining event parents for next iteration.\n      for (var i = 1; i < eventParents.length; i++) {\n        ancestors[i - 1] = eventParents[i];\n      }\n      return eventParents[0];\n    }\n\n    // 3.\n    if (context && isInsertionPoint(node)) {\n      var parentNode = node.parentNode;\n      if (parentNode && isShadowHost(parentNode)) {\n        var trees = scope.getShadowTrees(parentNode);\n        var p = getInsertionParent(context);\n        for (var i = 0; i < trees.length; i++) {\n          if (trees[i].contains(p))\n            return p;\n        }\n      }\n    }\n\n    return getEventParent(node);\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#event-retargeting\n  function retarget(node) {\n    var stack = [];  // 1.\n    var ancestor = node;  // 2.\n    var targets = [];\n    var ancestors = [];\n    while (ancestor) {  // 3.\n      var context = null;  // 3.2.\n      // TODO(arv): Change order of these. If the stack is empty we always end\n      // up pushing ancestor, no matter what.\n      if (isInsertionPoint(ancestor)) {  // 3.1.\n        context = topMostNotInsertionPoint(stack);  // 3.1.1.\n        var top = stack[stack.length - 1] || ancestor;  // 3.1.2.\n        stack.push(top);\n      } else if (!stack.length) {\n        stack.push(ancestor);  // 3.3.\n      }\n      var target = stack[stack.length - 1];  // 3.4.\n      targets.push({target: target, currentTarget: ancestor});  // 3.5.\n      if (isShadowRoot(ancestor))  // 3.6.\n        stack.pop();  // 3.6.1.\n\n      ancestor = calculateParents(ancestor, context, ancestors);  // 3.7.\n    }\n    return targets;\n  }\n\n  function topMostNotInsertionPoint(stack) {\n    for (var i = stack.length - 1; i >= 0; i--) {\n      if (!isInsertionPoint(stack[i]))\n        return stack[i];\n    }\n    return null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-related-target\n  function adjustRelatedTarget(target, related) {\n    var ancestors = [];\n    while (target) {  // 3.\n      var stack = [];  // 3.1.\n      var ancestor = related;  // 3.2.\n      var last = undefined;  // 3.3. Needs to be reset every iteration.\n      while (ancestor) {\n        var context = null;\n        if (!stack.length) {\n          stack.push(ancestor);\n        } else {\n          if (isInsertionPoint(ancestor)) {  // 3.4.3.\n            context = topMostNotInsertionPoint(stack);\n            // isDistributed is more general than checking whether last is\n            // assigned into ancestor.\n            if (isDistributed(last)) {  // 3.4.3.2.\n              var head = stack[stack.length - 1];\n              stack.push(head);\n            }\n          }\n        }\n\n        if (inSameTree(ancestor, target))  // 3.4.4.\n          return stack[stack.length - 1];\n\n        if (isShadowRoot(ancestor))  // 3.4.5.\n          stack.pop();\n\n        last = ancestor;  // 3.4.6.\n        ancestor = calculateParents(ancestor, context, ancestors);  // 3.4.7.\n      }\n      if (isShadowRoot(target))  // 3.5.\n        target = target.host;\n      else\n        target = target.parentNode;  // 3.6.\n    }\n  }\n\n  function getInsertionParent(node) {\n    return scope.insertionParentTable.get(node);\n  }\n\n  function isDistributed(node) {\n    return getInsertionParent(node);\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\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  }\n\n  function isLoadLikeEvent(event) {\n    switch (event.type) {\n      case 'beforeunload':\n      case 'load':\n      case 'unload':\n        return true;\n    }\n    return false;\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError')\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath = retarget(originalWrapperTarget);\n\n    // For window \"load\" events the \"load\" event is dispatched at the window but\n    // the target is set to the document.\n    //\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    //\n    // TODO(arv): Find a less hacky way to do this.\n    if (eventPath.length === 2 &&\n        eventPath[0].target instanceof wrappers.Document &&\n        isLoadLikeEvent(event)) {\n      eventPath.shift();\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath)) {\n      if (dispatchAtTarget(event, eventPath)) {\n        dispatchBubbling(event, eventPath);\n      }\n    }\n\n    eventPhaseTable.set(event, Event.NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath) {\n    var phase;\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        continue;\n\n      phase = Event.CAPTURING_PHASE;\n      if (!invoke(eventPath[i], event, phase))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath) {\n    var phase = Event.AT_TARGET;\n    return invoke(eventPath[0], event, phase);\n  }\n\n  function dispatchBubbling(event, eventPath) {\n    var bubbles = event.bubbles;\n    var phase;\n\n    for (var i = 1; i < eventPath.length; i++) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        phase = Event.AT_TARGET;\n      else if (bubbles && !stopImmediatePropagationTable.get(event))\n        phase = Event.BUBBLING_PHASE;\n      else\n        continue;\n\n      if (!invoke(eventPath[i], event, phase))\n        return;\n    }\n  }\n\n  function invoke(tuple, event, phase) {\n    var target = tuple.target;\n    var currentTarget = tuple.currentTarget;\n\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\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 = adjustRelatedTarget(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    currentTargetTable.set(event, currentTarget);\n\n    for (var i = 0; i < listeners.length; 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 === Event.CAPTURING_PHASE ||\n          listener.capture && phase === Event.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 (window.onerror)\n          window.onerror(ex.message);\n        else\n          console.error(ex, ex.stack);\n      }\n    }\n\n    if (anyRemoved) {\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 nodeList = new wrappers.NodeList();\n      var eventPath = eventPathTable.get(this);\n      if (eventPath) {\n        var index = 0;\n        var lastIndex = eventPath.length - 1;\n        var baseRoot = getTreeScope(currentTargetTable.get(this));\n\n        for (var i = 0; i <= lastIndex; i++) {\n          var currentTarget = eventPath[i].currentTarget;\n          var currentRoot = getTreeScope(currentTarget);\n          if (currentRoot.contains(baseRoot) &&\n              // Make sure we do not add Window to the path.\n              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {\n            nodeList[index++] = currentTarget;\n          }\n        }\n        nodeList.length = index;\n      }\n      return nodeList;\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        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    var targets = retarget(element, this)\n    for (var i = 0; i < targets.length; i++) {\n      var target = targets[i];\n      if (target.currentTarget === self)\n        return target.target;\n    }\n    return null;\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.adjustRelatedTarget = adjustRelatedTarget;\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",
+    "// 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  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, {enumerable: false});\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\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  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 findAll(node, selector, results) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        results[results.length++] = el;\n      findAll(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\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 findAll(this, selector, new NodeList())\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(tagName) {\n      // TODO(arv): Check tagName?\n      return this.querySelectorAll(tagName);\n    },\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n    getElementsByTagNameNS: function(ns, tagName) {\n      if (ns === '*')\n        return this.getElementsByTagName(tagName);\n\n      // TODO(arv): Check tagName?\n      var result = new NodeList;\n      var els = this.getElementsByTagName(tagName);\n      for (var i = 0, j = 0; i < els.length; i++) {\n        if (els[i].namespaceURI === ns)\n          result[j++] = els[i];\n      }\n      result.length = j;\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 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 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 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 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  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    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\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  /**\n   * Useful for generating the accessor pair for a property that reflects an\n   * attribute.\n   */\n  function setterDirtiesAttribute(prototype, propertyName, opt_attrName) {\n    var attrName = opt_attrName || propertyName;\n    Object.defineProperty(prototype, propertyName, {\n      get: function() {\n        return this.impl[propertyName];\n      },\n      set: function(v) {\n        this.impl[propertyName] = v;\n        invalidateRendererBasedOnAttribute(this, attrName);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  setterDirtiesAttribute(Element.prototype, 'id');\n  setterDirtiesAttribute(Element.prototype, 'className', 'class');\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  // TODO(arv): Export setterDirtiesAttribute and apply it to more bindings\n  // that reflect attributes.\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    // TODO: attribute boolean resetStyleInheritance;\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var 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  mixin(HTMLShadowElement.prototype, {\n    // TODO: attribute boolean resetStyleInheritance;\n  });\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 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  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    this.treeScope_ = new TreeScope(this, getTreeScope(hostWrapper));\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\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 distributedChildNodesTable = new WeakMap();\n  var eventParentsTable = new WeakMap();\n  var insertionParentTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function distributeChildToInsertionPoint(child, insertionPoint) {\n    getDistributedChildNodes(insertionPoint).push(child);\n    assignToInsertionPoint(child, insertionPoint);\n\n    var eventParents = eventParentsTable.get(child);\n    if (!eventParents)\n      eventParentsTable.set(child, eventParents = []);\n    eventParents.push(insertionPoint);\n  }\n\n  function resetDistributedChildNodes(insertionPoint) {\n    distributedChildNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedChildNodes(insertionPoint) {\n    var rv = distributedChildNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedChildNodesTable.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  /**\n   * Visits all nodes in the tree that fulfils the |predicate|. If the |visitor|\n   * function returns |false| the traversal is aborted.\n   * @param {!Node} tree\n   * @param {function(!Node) : boolean} predicate\n   * @param {function(!Node) : *} visitor\n   */\n  function visit(tree, predicate, visitor) {\n    // This operates on logical DOM.\n    for (var node = tree.firstChild; node; node = node.nextSibling) {\n      if (predicate(node)) {\n        if (visitor(node) === false)\n          return;\n      } else {\n        visit(node, predicate, visitor);\n      }\n    }\n  }\n\n  // Matching Insertion Points\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#matching-insertion-points\n\n  // TODO(arv): Verify this... I don't remember why I picked this regexp.\n  var selectorMatchRegExp = /^[*.:#[a-zA-Z_|]/;\n\n  var allowedPseudoRegExp = new RegExp('^:(' + [\n    'link',\n    'visited',\n    'target',\n    'enabled',\n    'disabled',\n    'checked',\n    'indeterminate',\n    'nth-child',\n    'nth-last-child',\n    'nth-of-type',\n    'nth-last-of-type',\n    'first-child',\n    'last-child',\n    'first-of-type',\n    'last-of-type',\n    'only-of-type',\n  ].join('|') + ')');\n\n\n  /**\n   * @param {Element} node\n   * @oaram {Element} point The insertion point element.\n   * @return {boolean} Whether the node matches the insertion point.\n   */\n  function matchesCriteria(node, point) {\n    var select = point.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    // The native matches function in IE9 does not correctly work with elements\n    // that are not in the document.\n    // TODO(arv): Implement matching in JS.\n    // https://github.com/Polymer/ShadowDOM/issues/361\n    if (select === '*' || select === node.localName)\n      return true;\n\n    // TODO(arv): This does not seem right. Need to check for a simple selector.\n    if (!selectorMatchRegExp.test(select))\n      return false;\n\n    // TODO(arv): This no longer matches the spec.\n    if (select[0] === ':' && !allowedPseudoRegExp.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  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      this.treeComposition();\n\n      var host = this.host;\n      var shadowRoot = host.shadowRoot;\n\n      this.associateNode(host);\n      var topMostRenderer = !renderNode;\n      var renderNode = opt_renderNode || new RenderNode(host);\n\n      for (var node = shadowRoot.firstChild; node; node = node.nextSibling) {\n        this.renderNode(shadowRoot, renderNode, node, false);\n      }\n\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    renderNode: function(shadowRoot, renderNode, node, isNested) {\n      if (isShadowHost(node)) {\n        renderNode = renderNode.append(node);\n        var renderer = getRendererForHost(node);\n        renderer.dirty = true;  // Need to rerender due to reprojection.\n        renderer.render(renderNode);\n      } else if (isInsertionPoint(node)) {\n        this.renderInsertionPoint(shadowRoot, renderNode, node, isNested);\n      } else if (isShadowInsertionPoint(node)) {\n        this.renderShadowInsertionPoint(shadowRoot, renderNode, node);\n      } else {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, isNested);\n      }\n    },\n\n    renderAsAnyDomTree: function(shadowRoot, renderNode, node, isNested) {\n      renderNode = renderNode.append(node);\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderNode.skip = !renderer.dirty;\n        renderer.render(renderNode);\n      } else {\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          this.renderNode(shadowRoot, renderNode, child, isNested);\n        }\n      }\n    },\n\n    renderInsertionPoint: function(shadowRoot, renderNode, insertionPoint,\n                                   isNested) {\n      var distributedChildNodes = getDistributedChildNodes(insertionPoint);\n      if (distributedChildNodes.length) {\n        this.associateNode(insertionPoint);\n\n        for (var i = 0; i < distributedChildNodes.length; i++) {\n          var child = distributedChildNodes[i];\n          if (isInsertionPoint(child) && isNested)\n            this.renderInsertionPoint(shadowRoot, renderNode, child, isNested);\n          else\n            this.renderAsAnyDomTree(shadowRoot, renderNode, child, isNested);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode, insertionPoint);\n      }\n      this.associateNode(insertionPoint.parentNode);\n    },\n\n    renderShadowInsertionPoint: function(shadowRoot, renderNode,\n                                         shadowInsertionPoint) {\n      var nextOlderTree = shadowRoot.olderShadowRoot;\n      if (nextOlderTree) {\n        assignToInsertionPoint(nextOlderTree, shadowInsertionPoint);\n        this.associateNode(shadowInsertionPoint.parentNode);\n        for (var node = nextOlderTree.firstChild;\n             node;\n             node = node.nextSibling) {\n          this.renderNode(nextOlderTree, renderNode, node, true);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode,\n                                   shadowInsertionPoint);\n      }\n    },\n\n    renderFallbackContent: function(shadowRoot, renderNode, fallbackHost) {\n      this.associateNode(fallbackHost);\n      this.associateNode(fallbackHost.parentNode);\n      for (var node = fallbackHost.firstChild; node; node = node.nextSibling) {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, false);\n      }\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    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-distribution-algorithm\n    distribute: function(tree, pool) {\n      var self = this;\n\n      visit(tree, isActiveInsertionPoint,\n          function(insertionPoint) {\n            resetDistributedChildNodes(insertionPoint);\n            self.updateDependentAttributes(\n                insertionPoint.getAttribute('select'));\n\n            for (var i = 0; i < pool.length; i++) {  // 1.2\n              var node = pool[i];  // 1.2.1\n              if (node === undefined)  // removed\n                continue;\n              if (matchesCriteria(node, insertionPoint)) {  // 1.2.2\n                distributeChildToInsertionPoint(node, insertionPoint);  // 1.2.2.1\n                pool[i] = undefined;  // 1.2.2.2\n              }\n            }\n          });\n    },\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-tree-composition\n    treeComposition: function () {\n      var shadowHost = this.host;\n      var tree = shadowHost.shadowRoot;  // 1.\n      var pool = [];  // 2.\n\n      for (var child = shadowHost.firstChild;\n           child;\n           child = child.nextSibling) {  // 3.\n        if (isInsertionPoint(child)) {  // 3.2.\n          var reprojected = getDistributedChildNodes(child);  // 3.2.1.\n          // if reprojected is undef... reset it?\n          if (!reprojected || !reprojected.length)  // 3.2.2.\n            reprojected = getChildNodesSnapshot(child);\n          pool.push.apply(pool, reprojected);  // 3.2.3.\n        } else {\n          pool.push(child); // 3.3.\n        }\n      }\n\n      var shadowInsertionPoint, point;\n      while (tree) {  // 4.\n        // 4.1.\n        shadowInsertionPoint = undefined;  // Reset every iteration.\n        visit(tree, isActiveShadowInsertionPoint, function(point) {\n          shadowInsertionPoint = point;\n          return false;\n        });\n        point = shadowInsertionPoint;\n\n        this.distribute(tree, pool);  // 4.2.\n        if (point) {  // 4.3.\n          var nextOlderTree = tree.olderShadowRoot;  // 4.3.1.\n          if (!nextOlderTree) {\n            break;  // 4.3.1.1.\n          } else {\n            tree = nextOlderTree;  // 4.3.2.2.\n            assignToInsertionPoint(tree, point);  // 4.3.2.2.\n            continue;  // 4.3.2.3.\n          }\n        } else {\n          break;  // 4.4.\n        }\n      }\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  function isInsertionPoint(node) {\n    // Should this include <shadow>?\n    return node instanceof HTMLContentElement;\n  }\n\n  function isActiveInsertionPoint(node) {\n    // <content> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLContentElement;\n  }\n\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isActiveShadowInsertionPoint(node) {\n    // <shadow> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\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 assignToInsertionPoint(tree, point) {\n    insertionParentTable.set(tree, point);\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\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 = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedChildNodes(this);\n  };\n\n  HTMLShadowElement.prototype.nodeIsInserted_ =\n  HTMLContentElement.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.eventParentsTable = eventParentsTable;\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.insertionParentTable = insertionParentTable;\n  scope.renderAllPending = renderAllPending;\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  });\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    '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\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\n  registerWrapper(OriginalWindow, Window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n",
+    "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n  };\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n",
+    "/*\n * Copyright 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  // 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",
+    "/*\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\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertCombinators(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    for (var i=0; i < combinatorsRe.length; i++) {\n      cssText = cssText.replace(combinatorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText)) {\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 if (rule.cssText) {\n          cssText += rule.cssText + '\\n\\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.applySimpleSelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\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  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    combinatorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n      }\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);",
+    "} else {",
+    "/*\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  // poor man's adapter for template.content on various platform scenarios\n  window.templateContent = window.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n\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  window.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})();",
+    "}",
+    "/* 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 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// 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);",
+    "// Copyright 2011 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(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 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// poor man's adapter for template.content on various platform scenarios\nwindow.templateContent = window.templateContent || function(inTemplate) {\n  return inTemplate.content;\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\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(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",
+    "(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        module = dependsOrFactory.apply(this);\n        break;\n      default:\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  scope.module = module;\n  scope.using = using;\n\n})(window);",
+    "/*\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\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\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) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, 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      if (attr && attr.value &&\n         (attr.value.search(URL_TEMPLATE_SEARCH) < 0)) {\n        var urlPath = resolveRelativeUrl(url, attr.value);\n        attr.value = urlPath;\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'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url) {\n  var u = new URL(url, baseUrl);\n  return makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = 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.pathname, u.pathname);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(source, target) {\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('/');\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) {\n          this.receive(url, elt, err, resource);\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) {\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 (!err) {\n          this.onload(url, p, resource);\n        //}\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          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, url);\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  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    this.parseNext();\n  },\n  parseImport: function(elt) {\n    elt.import.__importParsed = true;\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    // 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.markParsingComplete(elt);\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    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n",
+    "/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      // go async to ensure parser isn't stuck on a script tag\n      requestAnimationFrame(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')) :\n      link.__importParsed;\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.whenImportsReady = whenImportsReady;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\n\n})(window.HTMLImports);\n",
+    " /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\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  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\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// TODO(sorvell): See https://github.com/Polymer/polymer/issues/399\n// we'll address this by defaulting to CE polyfill in the presence of the SD\n// polyfill. This will avoid spamming excess attached/detached callbacks.\n// If there is a compelling need to run CE native with SD polyfill,\n// we'll need to fix this issue.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill;\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        nativePrototype = Object.getPrototypeOf(inst);\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        var ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n    }\n    // cache this in case of mixin\n    definition.native = nativePrototype;\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    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 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\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 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(function(scope) {\n  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.regex = regex;\n  }\n  Loader.prototype = {\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      this.fetch(matches, {}, callback);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, map, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback(map);\n      }\n\n      var done = function() {\n        if (--inflight === 0) {\n          callback(map);\n        }\n      };\n\n      // map url -> responseText\n      var handleXhr = function(err, request) {\n        var match = request.match;\n        var key = match.url;\n        // handle errors with an empty string\n        if (err) {\n          map[key] = '';\n          return done();\n        }\n        var response = request.response || request.responseText;\n        map[key] = response;\n        this.fetch(this.extractUrls(response, key), map, done);\n      };\n\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        // if this url has already been requested, skip requesting it again\n        if (map[url]) {\n          // Async call to done to simplify the inflight logic\n          endOfMicrotask(done);\n          continue;\n        }\n        req = this.xhr(url, handleXhr, this);\n        req.match = m;\n        // tag the map with an XHR request to deduplicate at the same level\n        map[url] = req;\n      }\n    },\n    xhr: function(url, callback, scope) {\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onload = function() {\n        callback.call(scope, null, request);\n      };\n      request.onerror = function() {\n        callback.call(scope, null, request);\n      };\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\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(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, callback) {\n    var text = style.textContent;\n    var url = style.ownerDocument.baseURI;\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\n      intermediate = urlResolver.resolveCssText(map[url], url);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, url, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, 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, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\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  scope = scope || {};\n  scope.external = scope.external || {};\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      if (inRoot) {\n        var t = inRoot.elementFromPoint(x, y);\n        var st, sr, os;\n        // is element a shadow host?\n        sr = this.targetingShadow(t);\n        while (sr) {\n          // find the the element inside the shadow root\n          st = sr.elementFromPoint(x, y);\n          if (!st) {\n            // check for older shadows\n            sr = this.olderShadow(sr);\n          } else {\n            // shadowed element may contain a shadow root\n            var ssr = this.targetingShadow(st);\n            return this.searchRoot(ssr, x, y) || st;\n          }\n        }\n        // light dom element is the target\n        return t;\n      }\n    },\n    owner: function(element) {\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      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  };\n  scope.targetFinding = target;\n  scope.findTarget = target.findTarget.bind(target);\n\n  window.PointerEventsPolyfill = scope;\n})(window.PointerEventsPolyfill);\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  function shadowSelector(v) {\n    return 'body /shadow-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 + '; touch-action-delay: none; }';\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  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var head = document.head;\n  var hasNativePE = window.PointerEvent || window.MSPointerEvent;\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasNativePE) {\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 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 * 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  function PointerEvent(inType, inDict) {\n    inDict = inDict || Object.create(null);\n\n    var e = document.createEvent('Event');\n    e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n\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    return e;\n  }\n\n  // attach to window\n  if (!scope.PointerEvent) {\n    scope.PointerEvent = PointerEvent;\n  }\n})(window);\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 * 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.PointerEventsPolyfill);\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  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  ];\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  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\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    captureInfo: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\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    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    contains: scope.external.contains || function(container, contained) {\n      return container.contains(contained);\n    },\n    // EVENTS\n    down: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerdown', inEvent);\n    },\n    move: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointermove', inEvent);\n    },\n    up: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerup', inEvent);\n    },\n    enter: function(inEvent) {\n      inEvent.bubbles = false;\n      this.fireEvent('pointerenter', inEvent);\n    },\n    leave: function(inEvent) {\n      inEvent.bubbles = false;\n      this.fireEvent('pointerleave', inEvent);\n    },\n    over: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerover', inEvent);\n    },\n    out: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerout', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointercancel', inEvent);\n    },\n    leaveOut: function(event) {\n      this.out(event);\n      if (!this.contains(event.target, event.relatedTarget)) {\n        this.leave(event);\n      }\n    },\n    enterOver: function(event) {\n      this.over(event);\n      if (!this.contains(event.target, event.relatedTarget)) {\n        this.enter(event);\n      }\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of pointerevents 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._handledByPE) {\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._handledByPE = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      events.forEach(function(e) {\n        this.addEvent(target, e);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      events.forEach(function(e) {\n        this.removeEvent(target, e);\n      }, this);\n    },\n    addEvent: scope.external.addEvent || function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: scope.external.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      // relatedTarget must be null if pointer is captured\n      if (this.captureInfo[inEvent.pointerId]) {\n        inEvent.relatedTarget = null;\n      }\n      var e = new PointerEvent(inType, inEvent);\n      if (inEvent.preventDefault) {\n        e.preventDefault = inEvent.preventDefault;\n      }\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 (HAS_SVG_INSTANCE && (p === 'target' || p === 'relatedTarget')) {\n          if (eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      if (inEvent.preventDefault) {\n        eventCopy.preventDefault = function() {\n          inEvent.preventDefault();\n        };\n      }\n      return eventCopy;\n    },\n    getTarget: function(inEvent) {\n      // if pointer capture is set, route all events for the specified pointerId\n      // to the capture target\n      return this.captureInfo[inEvent.pointerId] || inEvent._target;\n    },\n    setCapture: function(inPointerId, inTarget) {\n      if (this.captureInfo[inPointerId]) {\n        this.releaseCapture(inPointerId);\n      }\n      this.captureInfo[inPointerId] = inTarget;\n      var e = document.createEvent('Event');\n      e.initEvent('gotpointercapture', true, false);\n      e.pointerId = inPointerId;\n      this.implicitRelease = this.releaseCapture.bind(this, inPointerId);\n      document.addEventListener('pointerup', this.implicitRelease);\n      document.addEventListener('pointercancel', this.implicitRelease);\n      e._target = inTarget;\n      this.asyncDispatchEvent(e);\n    },\n    releaseCapture: function(inPointerId) {\n      var t = this.captureInfo[inPointerId];\n      if (t) {\n        var e = document.createEvent('Event');\n        e.initEvent('lostpointercapture', true, false);\n        e.pointerId = inPointerId;\n        this.captureInfo[inPointerId] = undefined;\n        document.removeEventListener('pointerup', this.implicitRelease);\n        document.removeEventListener('pointercancel', this.implicitRelease);\n        e._target = t;\n        this.asyncDispatchEvent(e);\n      }\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: scope.external.dispatchEvent || function(inEvent) {\n      var t = this.getTarget(inEvent);\n      if (t) {\n        return t.dispatchEvent(inEvent);\n      }\n    },\n    asyncDispatchEvent: function(inEvent) {\n      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent));\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = dispatcher.register.bind(dispatcher);\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n})(window.PointerEventsPolyfill);\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 * 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('PointerEventsPolyfill: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PointerEventsPolyfill);\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  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      'mouseover',\n      'mouseout'\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      // forward mouse preventDefault\n      var pd = e.preventDefault;\n      e.preventDefault = function() {\n        inEvent.preventDefault();\n        pd();\n      };\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\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.cancel(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        pointermap.set(this.POINTER_ID, inEvent);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.get(this.POINTER_ID);\n        if (p && p.button === inEvent.button) {\n          var e = this.prepareEvent(inEvent);\n          dispatcher.up(e);\n          this.cleanupMouse();\n        }\n      }\n    },\n    mouseover: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.enterOver(e);\n      }\n    },\n    mouseout: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.leaveOut(e);\n      }\n    },\n    cancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.cancel(e);\n      this.cleanupMouse();\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PointerEventsPolyfill);\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  var dispatcher = scope.dispatcher;\n  var captureInfo = dispatcher.captureInfo;\n  var findTarget = scope.findTarget;\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 ATTRIB = 'touch-action';\n  var INSTALLER;\n  // The presence of touch event handlers blocks scrolling, and so we must be careful to\n  // avoid adding handlers unnecessarily.  Chrome plans to add a touch-action-delay property\n  // (crbug.com/329559) to address this, and once we have that we can opt-in to a simpler\n  // handler registration mechanism.  Rather than try to predict how exactly to opt-in to\n  // that we'll just leave this disabled until there is a build of Chrome to test.\n  var HAS_TOUCH_ACTION_DELAY = 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 (HAS_TOUCH_ACTION_DELAY) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (HAS_TOUCH_ACTION_DELAY) {\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$/\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 = false;\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    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 = captureInfo[id] || findTarget(e);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.button = 0;\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      // 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; i < tl.length; i++) {\n        t = tl[i];\n        inFunction.call(this, this.touchToPointer(t));\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 = inEvent.currentTarget._scrollType;\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        this.firstXY = null;\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.out;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(this.cancelOut, this);\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.overDown);\n      }\n    },\n    overDown: function(inPointer) {\n      var p = pointermap.set(inPointer.pointerId, {\n        target: inPointer.target,\n        out: inPointer,\n        outTarget: inPointer.target\n      });\n      dispatcher.over(inPointer);\n      dispatcher.enter(inPointer);\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (!this.scrolling) {\n        if (this.shouldScroll(inEvent)) {\n          this.scrolling = true;\n          this.touchcancel(inEvent);\n        } else {\n          inEvent.preventDefault();\n          this.processTouches(inEvent, this.moveOverOut);\n        }\n      }\n    },\n    moveOverOut: function(inPointer) {\n      var event = inPointer;\n      var pointer = pointermap.get(event.pointerId);\n      // a finger drifted off the screen, ignore it\n      if (!pointer) {\n        return;\n      }\n      var outEvent = pointer.out;\n      var outTarget = pointer.outTarget;\n      dispatcher.move(event);\n      if (outEvent && outTarget !== event.target) {\n        outEvent.relatedTarget = event.target;\n        event.relatedTarget = outTarget;\n        // recover from retargeting by shadow\n        outEvent.target = outTarget;\n        if (event.target) {\n          dispatcher.leaveOut(outEvent);\n          dispatcher.enterOver(event);\n        } else {\n          // clean up case when finger leaves the screen\n          event.target = outTarget;\n          event.relatedTarget = null;\n          this.cancelOut(event);\n        }\n      }\n      pointer.out = event;\n      pointer.outTarget = event.target;\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.upOut);\n    },\n    upOut: function(inPointer) {\n      if (!this.scrolling) {\n        dispatcher.up(inPointer);\n        dispatcher.out(inPointer);\n        dispatcher.leave(inPointer);\n      }\n      this.cleanUpPointer(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      this.processTouches(inEvent, this.cancelOut);\n    },\n    cancelOut: function(inPointer) {\n      dispatcher.cancel(inPointer);\n      dispatcher.out(inPointer);\n      dispatcher.leave(inPointer);\n      this.cleanUpPointer(inPointer);\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 (!HAS_TOUCH_ACTION_DELAY) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PointerEventsPolyfill);\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  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      'MSPointerOut',\n      'MSPointerOver',\n      'MSPointerCancel',\n      'MSGotPointerCapture',\n      'MSLostPointerCapture'\n    ],\n    register: function(target) {\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      if (HAS_BITMAP_TYPE) {\n        e = dispatcher.cloneEvent(inEvent);\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      pointermap.set(inEvent.pointerId, inEvent);\n      var e = this.prepareEvent(inEvent);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerOut: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.leaveOut(e);\n    },\n    MSPointerOver: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.enterOver(e);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSLostPointerCapture: function(inEvent) {\n      var e = dispatcher.makeEvent('lostpointercapture', inEvent);\n      dispatcher.dispatchEvent(e);\n    },\n    MSGotPointerCapture: function(inEvent) {\n      var e = dispatcher.makeEvent('gotpointercapture', inEvent);\n      dispatcher.dispatchEvent(e);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PointerEventsPolyfill);\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 * 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  // only activate if this platform does not have pointer events\n  if (window.PointerEvent !== scope.PointerEvent) {\n\n    if (window.navigator.msPointerEnabled) {\n      var tp = window.navigator.msMaxTouchPoints;\n      Object.defineProperty(window.navigator, 'maxTouchPoints', {\n        value: tp,\n        enumerable: true\n      });\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  }\n})(window.PointerEventsPolyfill);\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  var dispatcher = scope.dispatcher;\n  var n = window.navigator;\n  var s, r;\n  function assertDown(id) {\n    if (!dispatcher.pointermap.has(id)) {\n      throw new Error('InvalidPointerId');\n    }\n  }\n  if (n.msPointerEnabled) {\n    s = function(pointerId) {\n      assertDown(pointerId);\n      this.msSetPointerCapture(pointerId);\n    };\n    r = function(pointerId) {\n      assertDown(pointerId);\n      this.msReleasePointerCapture(pointerId);\n    };\n  } else {\n    s = function setPointerCapture(pointerId) {\n      assertDown(pointerId);\n      dispatcher.setCapture(pointerId, this);\n    };\n    r = function releasePointerCapture(pointerId) {\n      assertDown(pointerId);\n      dispatcher.releaseCapture(pointerId, this);\n    };\n  }\n  if (window.Element && !Element.prototype.setPointerCapture) {\n    Object.defineProperties(Element.prototype, {\n      'setPointerCapture': {\n        value: s\n      },\n      'releasePointerCapture': {\n        value: r\n      }\n    });\n  }\n})(window.PointerEventsPolyfill);\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 * PointerGestureEvent is the constructor for all PointerGesture events.\n *\n * @module PointerGestures\n * @class PointerGestureEvent\n * @extends UIEvent\n * @constructor\n * @param {String} inType Event type\n * @param {Object} [inDict] Dictionary of properties to initialize on the event\n */\n\nfunction PointerGestureEvent(inType, inDict) {\n  var dict = inDict || {};\n  var e = document.createEvent('Event');\n  var props = {\n    bubbles: Boolean(dict.bubbles) === dict.bubbles || true,\n    cancelable: Boolean(dict.cancelable) === dict.cancelable || true\n  };\n\n  e.initEvent(inType, props.bubbles, props.cancelable);\n\n  var keys = Object.keys(dict), k;\n  for (var i = 0; i < keys.length; i++) {\n    k = keys[i];\n    e[k] = dict[k];\n  }\n\n  e.preventTap = this.preventTap;\n\n  return e;\n}\n\n/**\n * Allows for any gesture to prevent the tap gesture.\n *\n * @method preventTap\n */\nPointerGestureEvent.prototype.preventTap = function() {\n  this.tapPrevented = true;\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 */\n\n(function(scope) {\n  /**\n   * This class contains the gesture recognizers that create the PointerGesture\n   * events.\n   *\n   * @class PointerGestures\n   * @static\n   */\n  scope = scope || {};\n  scope.utils = {\n    LCA: {\n      // Determines the lowest node in the ancestor chain of a and b\n      find: function(a, b) {\n        if (a === b) {\n          return a;\n        }\n        // fast case, a is a direct descendant of b or vice versa\n        if (a.contains) {\n          if (a.contains(b)) {\n            return a;\n          }\n          if (b.contains(a)) {\n            return b;\n          }\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 = this.walk(a, 1);\n          b = this.walk(b, 1);\n        }\n        return a;\n      },\n      walk: function(n, u) {\n        for (var i = 0; i < u; i++) {\n          n = n.parentNode;\n        }\n        return n;\n      },\n      depth: function(n) {\n        var d = 0;\n        while(n) {\n          d++;\n          n = n.parentNode;\n        }\n        return d;\n      }\n    }\n  };\n  scope.findLCA = function(a, b) {\n    return scope.utils.LCA.find(a, b);\n  }\n  window.PointerGestures = scope;\n})(window.PointerGestures);\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 * 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.PointerGestures);\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  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    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'tapPrevented'\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  ];\n\n  var dispatcher = {\n    handledEvents: new WeakMap(),\n    targets: new WeakMap(),\n    handlers: {},\n    recognizers: {},\n    events: {},\n    // Add a new gesture recognizer to the event listeners.\n    // Recognizer needs an `events` property.\n    registerRecognizer: function(inName, inRecognizer) {\n      var r = inRecognizer;\n      this.recognizers[inName] = r;\n      r.events.forEach(function(e) {\n        if (r[e]) {\n          this.events[e] = true;\n          var f = r[e].bind(r);\n          this.addHandler(e, f);\n        }\n      }, this);\n    },\n    addHandler: function(inEvent, inFn) {\n      var e = inEvent;\n      if (!this.handlers[e]) {\n        this.handlers[e] = [];\n      }\n      this.handlers[e].push(inFn);\n    },\n    // add event listeners for inTarget\n    registerTarget: function(inTarget) {\n      this.listen(Object.keys(this.events), inTarget);\n    },\n    // remove event listeners for inTarget\n    unregisterTarget: function(inTarget) {\n      this.unlisten(Object.keys(this.events), inTarget);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      if (this.handledEvents.get(inEvent)) {\n        return;\n      }\n      var type = inEvent.type, fns = this.handlers[type];\n      if (fns) {\n        this.makeQueue(fns, inEvent);\n      }\n      this.handledEvents.set(inEvent, true);\n    },\n    // queue event for async dispatch\n    makeQueue: function(inHandlerFns, inEvent) {\n      // must clone events to keep the (possibly shadowed) target correct for\n      // async dispatching\n      var e = this.cloneEvent(inEvent);\n      requestAnimationFrame(this.runQueue.bind(this, inHandlerFns, e));\n    },\n    // Dispatch the queued events\n    runQueue: function(inHandlers, inEvent) {\n      this.currentPointerId = inEvent.pointerId;\n      for (var i = 0, f, l = inHandlers.length; (i < l) && (f = inHandlers[i]); i++) {\n        f(inEvent);\n      }\n      this.currentPointerId = 0;\n    },\n    // set up event listeners\n    listen: function(inEvents, inTarget) {\n      inEvents.forEach(function(e) {\n        this.addEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(inEvents) {\n      inEvents.forEach(function(e) {\n        this.removeEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    addEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.addEventListener(inEventName, inEventHandler, inCapture);\n    },\n    removeEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.removeEventListener(inEventName, inEventHandler, inCapture);\n    },\n    // EVENT CREATION AND TRACKING\n    // Creates a new Event of type `inType`, based on the information in\n    // `inEvent`.\n    makeEvent: function(inType, inDict) {\n      return new PointerGestureEvent(inType, inDict);\n    },\n    /*\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @method cloneEvent\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 = {}, 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      }\n      return eventCopy;\n    },\n    // Dispatches the event to its target.\n    dispatchEvent: function(inEvent, inTarget) {\n      var t = inTarget || this.targets.get(inEvent);\n      if (t) {\n        t.dispatchEvent(inEvent);\n        if (inEvent.tapPrevented) {\n          this.preventTap(this.currentPointerId);\n        }\n      }\n    },\n    asyncDispatchEvent: function(inEvent, inTarget) {\n      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent, inTarget));\n    },\n    preventTap: function(inPointerId) {\n      var t = this.recognizers.tap;\n      if (t){\n        t.preventTap(inPointerId);\n      }\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  // recognizers call into the dispatcher and load later\n  // solve the chicken and egg problem by having registerScopes module run last\n  dispatcher.registerQueue = [];\n  dispatcher.immediateRegister = false;\n  scope.dispatcher = dispatcher;\n  /**\n   * Enable gesture events for a given scope, typically\n   * [ShadowRoots](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-root-object).\n   *\n   * @for PointerGestures\n   * @method register\n   * @param {ShadowRoot} scope A top level scope to enable gesture\n   * support on.\n   */\n  scope.register = function(inScope) {\n    if (dispatcher.immediateRegister) {\n      var pe = window.PointerEventsPolyfill;\n      if (pe) {\n        pe.register(inScope);\n      }\n      scope.dispatcher.registerTarget(inScope);\n    } else {\n      dispatcher.registerQueue.push(inScope);\n    }\n  };\n  scope.register(document);\n})(window.PointerGestures);\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 * 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 released\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\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      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\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    pointerdown: 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    pointerup: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    pointercancel: function(inEvent) {\n      this.cancel();\n    },\n    pointermove: 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        pointerType: this.heldPointer.pointerType,\n        clientX: this.heldPointer.clientX,\n        clientY: this.heldPointer.clientY\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = dispatcher.makeEvent(inType, p);\n      dispatcher.dispatchEvent(e, this.target);\n      if (e.tapPrevented) {\n        dispatcher.preventTap(this.heldPointer.pointerId);\n      }\n    }\n  };\n  dispatcher.registerRecognizer('hold', hold);\n})(window.PointerGestures);\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 * 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 pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'pointerdown',\n       'pointermove',\n       'pointerup',\n       'pointercancel'\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 trackData = {\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.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.target,\n         pointerType: inEvent.pointerType\n       };\n       var e = dispatcher.makeEvent(inType, trackData);\n       t.lastMoveEvent = inEvent;\n       dispatcher.dispatchEvent(e, t.downTarget);\n     },\n     pointerdown: 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     pointermove: 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       }\n     },\n     pointerup: 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     pointercancel: function(inEvent) {\n       this.pointerup(inEvent);\n     }\n   };\n   dispatcher.registerRecognizer('track', track);\n })(window.PointerGestures);\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 * This event denotes a rapid down/move/up sequence from a pointer.\n *\n * The event is sent to the first element the pointer went down on.\n *\n * @module PointerGestures\n * @submodule Events\n * @class flick\n */\n/**\n * Signed velocity of the flick in the x direction.\n * @property xVelocity\n * @type Number\n */\n/**\n * Signed velocity of the flick in the y direction.\n * @type Number\n * @property yVelocity\n */\n/**\n * Unsigned total velocity of the flick.\n * @type Number\n * @property velocity\n */\n/**\n * Angle of the flick in degrees, with 0 along the\n * positive x axis.\n * @type Number\n * @property angle\n */\n/**\n * Axis with the greatest absolute velocity. Denoted\n * with 'x' or 'y'.\n * @type String\n * @property majorAxis\n */\n/**\n * Type of the pointer that made the flick.\n * @type String\n * @property pointerType\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var flick = {\n    // TODO(dfreedman): value should be low enough for low speed flicks, but\n    // high enough to remove accidental flicks\n    MIN_VELOCITY: 0.5 /* px/ms */,\n    MAX_QUEUE: 4,\n    moveQueue: [],\n    target: null,\n    pointerId: null,\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    pointerdown: function(inEvent) {\n      if (inEvent.isPrimary && !this.pointerId) {\n        this.pointerId = inEvent.pointerId;\n        this.target = inEvent.target;\n        this.addMove(inEvent);\n      }\n    },\n    pointermove: function(inEvent) {\n      if (inEvent.pointerId === this.pointerId) {\n        this.addMove(inEvent);\n      }\n    },\n    pointerup: function(inEvent) {\n      if (inEvent.pointerId === this.pointerId) {\n        this.fireFlick(inEvent);\n      }\n      this.cleanup();\n    },\n    pointercancel: function(inEvent) {\n      this.cleanup();\n    },\n    cleanup: function() {\n      this.moveQueue = [];\n      this.target = null;\n      this.pointerId = null;\n    },\n    addMove: function(inEvent) {\n      if (this.moveQueue.length >= this.MAX_QUEUE) {\n        this.moveQueue.shift();\n      }\n      this.moveQueue.push(inEvent);\n    },\n    fireFlick: function(inEvent) {\n      var e = inEvent;\n      var l = this.moveQueue.length;\n      var dt, dx, dy, tx, ty, tv, x = 0, y = 0, v = 0;\n      // flick based off the fastest segment of movement\n      for (var i = 0, m; i < l && (m = this.moveQueue[i]); i++) {\n        dt = e.timeStamp - m.timeStamp;\n        dx = e.clientX - m.clientX, dy = e.clientY - m.clientY;\n        tx = dx / dt, ty = dy / dt, tv = Math.sqrt(tx * tx + ty * ty);\n        if (tv > v) {\n          x = tx, y = ty, v = tv;\n        }\n      }\n      var ma = Math.abs(x) > Math.abs(y) ? 'x' : 'y';\n      var a = this.calcAngle(x, y);\n      if (Math.abs(v) >= this.MIN_VELOCITY) {\n        var ev = dispatcher.makeEvent('flick', {\n          xVelocity: x,\n          yVelocity: y,\n          velocity: v,\n          angle: a,\n          majorAxis: ma,\n          pointerType: inEvent.pointerType\n        });\n        dispatcher.dispatchEvent(ev, this.target);\n      }\n    },\n    calcAngle: function(inX, inY) {\n      return (Math.atan2(inY, inX) * 180 / Math.PI);\n    }\n  };\n  dispatcher.registerRecognizer('flick', flick);\n})(window.PointerGestures);\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 * Basic strategy: find the farthest apart points, use as diameter of circle\n * react to size change and rotation of the chord\n */\n\n/**\n * @module PointerGestures\n * @submodule Events\n * @class pinch\n */\n/**\n * Scale of the pinch zoom gesture\n * @property scale\n * @type Number\n */\n/**\n * Center X position of pointers causing pinch\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing pinch\n * @property centerY\n * @type Number\n */\n\n/**\n * @module PointerGestures\n * @submodule Events\n * @class rotate\n */\n/**\n * Angle (in degrees) of rotation. Measured from starting positions of pointers.\n * @property angle\n * @type Number\n */\n/**\n * Center X position of pointers causing rotation\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing rotation\n * @property centerY\n * @type Number\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = new scope.PointerMap();\n  var RAD_TO_DEG = 180 / Math.PI;\n  var pinch = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    reference: {},\n    pointerdown: function(ev) {\n      pointermap.set(ev.pointerId, ev);\n      if (pointermap.pointers() == 2) {\n        var points = this.calcChord();\n        var angle = this.calcAngle(points);\n        this.reference = {\n          angle: angle,\n          diameter: points.diameter,\n          target: scope.findLCA(points.a.target, points.b.target)\n        };\n      }\n    },\n    pointerup: function(ev) {\n      pointermap.delete(ev.pointerId);\n    },\n    pointermove: function(ev) {\n      if (pointermap.has(ev.pointerId)) {\n        pointermap.set(ev.pointerId, ev);\n        if (pointermap.pointers() > 1) {\n          this.calcPinchRotate();\n        }\n      }\n    },\n    pointercancel: function(ev) {\n      this.pointerup(ev);\n    },\n    dispatchPinch: function(diameter, points) {\n      var zoom = diameter / this.reference.diameter;\n      var ev = dispatcher.makeEvent('pinch', {\n        scale: zoom,\n        centerX: points.center.x,\n        centerY: points.center.y\n      });\n      dispatcher.dispatchEvent(ev, this.reference.target);\n    },\n    dispatchRotate: function(angle, points) {\n      var diff = Math.round((angle - this.reference.angle) % 360);\n      var ev = dispatcher.makeEvent('rotate', {\n        angle: diff,\n        centerX: points.center.x,\n        centerY: points.center.y\n      });\n      dispatcher.dispatchEvent(ev, this.reference.target);\n    },\n    calcPinchRotate: function() {\n      var points = this.calcChord();\n      var diameter = points.diameter;\n      var angle = this.calcAngle(points);\n      if (diameter != this.reference.diameter) {\n        this.dispatchPinch(diameter, points);\n      }\n      if (angle != this.reference.angle) {\n        this.dispatchRotate(angle, points);\n      }\n    },\n    calcChord: function() {\n      var pointers = [];\n      pointermap.forEach(function(p) {\n        pointers.push(p);\n      });\n      var dist = 0;\n      // start with at least two pointers\n      var points = {a: pointers[0], b: pointers[1]};\n      var x, y, d;\n      for (var i = 0; i < pointers.length; i++) {\n        var a = pointers[i];\n        for (var j = i + 1; j < pointers.length; j++) {\n          var b = pointers[j];\n          x = Math.abs(a.clientX - b.clientX);\n          y = Math.abs(a.clientY - b.clientY);\n          d = x + y;\n          if (d > dist) {\n            dist = d;\n            points = {a: a, b: b};\n          }\n        }\n      }\n      x = Math.abs(points.a.clientX + points.b.clientX) / 2;\n      y = Math.abs(points.a.clientY + points.b.clientY) / 2;\n      points.center = { x: x, y: y };\n      points.diameter = dist;\n      return points;\n    },\n    calcAngle: function(points) {\n      var x = points.a.clientX - points.b.clientX;\n      var y = points.a.clientY - points.b.clientY;\n      return (360 + Math.atan2(y, x) * RAD_TO_DEG) % 360;\n    },\n  };\n  dispatcher.registerRecognizer('pinch', pinch);\n})(window.PointerGestures);\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 * 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 pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel',\n      'keyup'\n    ],\n    pointerdown: 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    pointermove: function(inEvent) {\n      if (inEvent.isPrimary) {\n        var start = pointermap.get(inEvent.pointerId);\n        if (start) {\n          if (inEvent.tapPrevented) {\n            pointermap.delete(inEvent.pointerId);\n          }\n        }\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (!e.tapPrevented) {\n        if (e.pointerType === 'mouse') {\n          // only allow left click to tap for mouse\n          return downState.buttons === 1;\n        } else {\n          return true;\n        }\n      }\n    },\n    pointerup: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        var t = scope.findLCA(start.target, inEvent.target);\n        if (t) {\n          var e = dispatcher.makeEvent('tap', {\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType\n          });\n          dispatcher.dispatchEvent(e, t);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      pointermap.delete(inEvent.pointerId);\n    },\n    keyup: function(inEvent) {\n      var code = inEvent.keyCode;\n      // 32 == spacebar\n      if (code === 32) {\n        var t = inEvent.target;\n        if (!(t instanceof HTMLInputElement || t instanceof HTMLTextAreaElement)) {\n          dispatcher.dispatchEvent(dispatcher.makeEvent('tap', {\n            x: 0,\n            y: 0,\n            detail: 0,\n            pointerType: 'unavailable'\n          }), t);\n        }\n      }\n    },\n    preventTap: function(inPointerId) {\n      pointermap.delete(inPointerId);\n    }\n  };\n  dispatcher.registerRecognizer('tap', tap);\n})(window.PointerGestures);\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/**\n * Because recognizers are loaded after dispatcher, we have to wait to register\n * scopes until after all the recognizers.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  function registerScopes() {\n    dispatcher.immediateRegister = true;\n    var rq = dispatcher.registerQueue;\n    rq.forEach(scope.register);\n    rq.length = 0;\n  }\n  if (document.readyState === 'complete') {\n    registerScopes();\n  } else {\n    // register scopes after a steadystate is reached\n    // less MutationObserver churn\n    document.addEventListener('readystatechange', function() {\n      if (document.readyState === 'complete') {\n        registerScopes();\n      }\n    });\n  }\n})(window.PointerGestures);\n",
+    "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part 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  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\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\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 = this.bindingMap_;\n      if (!map || map.content !== content) {\n        // TODO(rafaelw): Setup a MutationObserver on content to detect\n        // when the instanceMap is invalid.\n        map = createInstanceBindingMap(content,\n            delegate_ && delegate_.prepareBinding) || [];\n        map.content = content;\n        this.bindingMap_ = map;\n      }\n\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        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    // TODO(rafaelw): Assigning .bindingDelegate always succeeds. It may\n    // make sense to issue a warning or even throw if the template is already\n    // \"activated\", since this would be a strange thing to do.\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    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  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) 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, property;\n\n        expr = parsePrimaryExpression();\n\n        while (match('.') || match('[')) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\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  // 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  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    // convert literal computed property access where literal value is a value\n    // path to ident dot-access.\n    if (accessor == '[' &&\n        property instanceof Literal &&\n        Path.get(property.value).valid) {\n      accessor = '.';\n      property = new IdentPath(property.value);\n    }\n\n    this.dynamicDeps = typeof object == 'function' || object.dynamic;\n\n    this.dynamic = typeof property == 'function' ||\n                   property.dynamic ||\n                   accessor == '[';\n\n    this.simplePath =\n        !this.dynamic &&\n        !this.dynamicDeps &&\n        property instanceof IdentPath &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = accessor == '.' ? property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n        var last = this.object instanceof IdentPath ?\n            this.object.name : this.object.fullPath;\n        this.fullPath_ = Path.get(last + '.' + this.property.name);\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.property instanceof IdentPath) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\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) {\n            var context = object(model, observer);\n            var propName = property(model, observer);\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(value, toModelDirection, filterRegistry, model,\n                        observer) {\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 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('No ' + (toModelDirection ? 'toModel' : 'toDOM') +\n                      ' found on' + this.name);\n        return;\n      }\n\n      var args = [value];\n      for (var i = 0; i < this.args.length; i++) {\n        args[i + 1] = getFn(this.args[i])(model, observer);\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) {\n        return unaryOperators[op](argument(model, observer));\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) {\n        return binaryOperators[op](left(model, observer),\n                                   right(model, observer));\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) {\n        return test(model, observer) ?\n            consequent(model, observer) : alternate(model, observer);\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    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) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer));\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) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] = properties[i].value(model, observer);\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);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(value, false, filterRegistry, model,\n                                          observer);\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(newValue, true, filterRegistry,\n                                                 model);\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  function isEventHandler(name) {\n    return name[0] === 'o' &&\n           name[1] === 'n' &&\n           name[2] === '-';\n  }\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 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 resolveEventReceiver(model, path, node) {\n    if (path.length == 0)\n      return undefined;\n\n    if (path.length == 1)\n      return findScope(model, path[0]);\n\n    for (var i = 0; model != null && i < path.length - 1; i++) {\n      model = model[path[i]];\n    }\n\n    return model;\n  }\n\n  function prepareEventBinding(path, name, polymerExpressions) {\n    var eventType = name.substring(3);\n    eventType = mixedCaseEventTypes[eventType] || eventType;\n\n    return function(model, node, oneTime) {\n      var fn, receiver, handler;\n      if (typeof polymerExpressions.resolveEventHandler == 'function') {\n        handler = function(e) {\n          fn = fn || polymerExpressions.resolveEventHandler(model, path, node);\n          fn(e, e.detail, e.currentTarget);\n\n          if (Platform && typeof Platform.flush == 'function')\n            Platform.flush();\n        };\n      } else {\n        handler = function(e) {\n          fn = fn || path.getValueFrom(model);\n          receiver = receiver || resolveEventReceiver(model, path, node);\n\n          fn.apply(receiver, [e, e.detail, e.currentTarget]);\n\n          if (Platform && typeof Platform.flush == 'function')\n            Platform.flush();\n        };\n      }\n\n      node.addEventListener(eventType, handler);\n\n      if (oneTime)\n        return;\n\n      function bindingValue() {\n        return '{{ ' + path + ' }}';\n      }\n\n      return {\n        open: bindingValue,\n        discardChanges: bindingValue,\n        close: function() {\n          node.removeEventListener(eventType, handler);\n        }\n      };\n    }\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      if (isEventHandler(name)) {\n        if (!path.valid) {\n          console.error('on-* bindings must be simple path expressions');\n          return;\n        }\n\n        return prepareEventBinding(path, name, this);\n      }\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        var scope = Object.create(parentScope);\n        scope[scopeName] = model;\n        scope[indexName] = undefined;\n        scope[parentScopeName] = parentScope;\n        return scope;\n      };\n    }\n  };\n\n  global.PolymerExpressions = PolymerExpressions;\n  if (global.exposeGetExpression)\n    global.getExpression_ = getExpression;\n\n  global.PolymerExpressions.prepareEventBinding = prepareEventBinding;\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 */\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"
+  ]
+}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.js b/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.js
new file mode 100644
index 0000000..b8a5c3f
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.js
@@ -0,0 +1,39 @@
+/**
+ * @license
+ * Copyright (c) 2012-2014 The Polymer 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.
+ */
+// @version: 0.2.2-ccb7c30
+function PointerGestureEvent(a,b){var c=b||{},d=document.createEvent("Event"),e={bubbles:Boolean(c.bubbles)===c.bubbles||!0,cancelable:Boolean(c.cancelable)===c.cancelable||!0};d.initEvent(a,e.bubbles,e.cancelable);for(var f,g=Object.keys(c),h=0;h<g.length;h++)f=g[h],d[f]=c[f];return d.preventTap=this.preventTap,d}"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(global.document&&"securityPolicy"in global.document&&!global.document.securityPolicy.allowsEval)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 isPathValid(a){return"string"!=typeof a?!1:(a=a.trim(),""==a?!0:"."==a[0]?!1:pathRegExp.test(a))}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");return""==a.trim()?this:isIndex(a)?(this.push(a),this):(a.split(/\s*\.\s*/).filter(function(a){return a}).forEach(function(a){this.push(a)},this),void(hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())))}function getPath(a){if(a instanceof Path)return a;null==a&&(a=""),"string"!=typeof a&&(a=String(a));var b=pathCache[a];if(b)return b;if(!isPathValid(a))return invalidPath;var b=new Path(a,constructorIsPrivate);return pathCache[a]=b,b}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){if(b){var c=i.indexOf(b);c>=0?(i[c]=void 0,h.push(b)):h.indexOf(b)<0&&(h.push(b),Object.observe(b,e)),a(Object.getPrototypeOf(b))}}function b(){var b=i===emptyArray?[]:i;i=h,h=b;var c;for(var d in f)c=f[d],c&&c.state_==OPENED&&c.iterateObjects_(a);for(var g=0;g<i.length;g++){var j=i[g];j&&Object.unobserve(j,e)}i.length=0}function c(){k=!1,j&&b()}function d(){k||(j=!0,k=!0,runEOM(c))}function e(){b();var a;for(var c in f)a=f[c],a&&a.state_==OPENED&&a.check_()}var f=[],g=0,h=[],i=emptyArray,j=!1,k=!1,l={object:void 0,objects:h,open:function(b){f[b.id_]=b,g++,b.iterateObjects_(a)},close:function(a){if(f[a.id_]=void 0,g--,g)return void d();j=!1;for(var b=0;b<h.length;b++)Object.unobserve(h[b],e),Observer.unobservedCount++;f.length=0,h.length=0,observedSetCache.push(this)},reset:d};return l}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a),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_=b instanceof Path?b:getPath(b),this.directObserver_=void 0}function CompoundObserver(){Observer.call(this),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 notifyFunction(a,b){if("function"==typeof Object.observe){var c=Object.getNotifier(a);return function(d,e){var f={object:a,type:d,name:b};2===arguments.length&&(f.oldValue=e),c.notify(f)}}}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]",ident=identStart+"+"+identPart+"*",elementIndex="(?:[0-9]|[1-9]+[0-9]+)",identOrElementIndex="(?:"+ident+"|"+elementIndex+")",path="(?:"+identOrElementIndex+")(?:\\s*\\.\\s*"+identOrElementIndex+")*",pathRegExp=new RegExp("^"+path+"$"),constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){return this.join(".")},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)}},compiledGetValueFromFn:function(){var a=this.map(function(a){return isIndex(a)?'["'+a+'"]':"."+a}),b="",c="obj";b+="if (obj != null";for(var d=0;d<this.length-1;d++){{this[d]}c+=a[d],b+=" &&\n     "+c+" != null"}return b+=")\n",c+=a[d],b+="  return "+c+";\nelse\n  return undefined;",new Function("obj",b)},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=[],emptyArray=[],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.state_=OPENED,this.connect_(),this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.state_=CLOSED,this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,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]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(this.check_(void 0,!0),hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}return this.directObserver_?b?void this.directObserver_.reset():(this.directObserver_.close(),void(this.directObserver_=void 0)):void(b&&(this.directObserver_=getObservedSet(this,a)))}},closeObservers_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0),this.closeObservers_()},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");this.observed_.push(a,b instanceof Path?b:getPath(b))},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");a.open(this.deliver,this),this.observed_.push(observerSentinel,a)},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.closeObservers_()},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=this.observed_[d+1],f=this.observed_[d],g=f===observerSentinel?e.discardChanges():e.getValueFrom(f);b?this.value_[d/2]=g:areSameValue(g,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=g)}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};Observer.defineComputedProperty=function(a,b,c){var d=notifyFunction(a,b),e=c.open(function(a,b){e=a,d&&d("update",b)});return Object.defineProperty(a,b,{get:function(){return c.deliver(),e},set:function(a){return c.setValue(a),a},configurable:!0}),{close:function(){c.close(),Object.defineProperty(a,b,{value:e,writable:!0,configurable:!0})}}};var 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.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),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),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(a){if(!a)throw new Error("Assertion failed")}function c(a,b){return L(b).forEach(function(c){K(a,c,M(b,c))}),a}function d(a,b){return L(b).forEach(function(c){switch(c){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":return}K(a,c,M(b,c))}),a}function e(a,b){for(var c=0;c<b.length;c++)if(b[c]in a)return b[c]}function f(a){var b=a.__proto__||Object.getPrototypeOf(a),c=E.get(b);if(c)return c;var d=f(b),e=t(d);return q(b,e,a),e}function g(a,b){o(a,b,!0)}function h(a,b){o(b,a,!1)}function i(a){return/^on[a-z]+$/.test(a)}function j(a){return/^\w[a-zA-Z_0-9]*$/.test(a)}function k(a){return H&&j(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function l(a){return H&&j(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function m(a){return H&&j(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function n(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return O}}function o(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])){N&&b.__lookupGetter__(g);var h,j,o=n(b,g);if(d&&"function"==typeof o.value)c[g]=m(g);else{var p=i(g);h=p?a.getEventHandlerGetter(g):k(g),(o.writable||o.set)&&(j=p?a.getEventHandlerSetter(g):l(g)),K(c,g,{get:h,set:j,configurable:o.configurable,enumerable:o.enumerable})}}}}function p(a,b,c){var e=a.prototype;q(e,b,c),d(b,a)}function q(a,c,d){var e=c.prototype;b(void 0===E.get(a)),E.set(a,c),F.set(e,a),g(a,e),d&&h(e,d),K(e,"constructor",{value:c,configurable:!0,enumerable:!1,writable:!0}),c.prototype=e}function r(a,b){return E.get(b.prototype)===a}function s(a){var b=Object.getPrototypeOf(a),c=f(b),d=t(c);return q(b,d,a),d}function t(a){function b(b){a.call(this,b)}var c=Object.create(a.prototype);return c.constructor=b,b.prototype=c,b}function u(a){return a instanceof G.EventTarget||a instanceof G.Event||a instanceof G.Range||a instanceof G.DOMImplementation||a instanceof G.CanvasRenderingContext2D||G.WebGLRenderingContext&&a instanceof G.WebGLRenderingContext}function v(a){return Q&&a instanceof Q||a instanceof S||a instanceof R||a instanceof T||a instanceof U||a instanceof P||a instanceof V||W&&a instanceof W||X&&a instanceof X}function w(a){return null===a?null:(b(v(a)),a.polymerWrapper_||(a.polymerWrapper_=new(f(a))(a)))}function x(a){return null===a?null:(b(u(a)),a.impl)}function y(a){return a&&u(a)?x(a):a}function z(a){return a&&!u(a)?w(a):a}function A(a,c){null!==c&&(b(v(a)),b(void 0===c||u(c)),a.polymerWrapper_=c)}function B(a,b,c){K(a.prototype,b,{get:c,configurable:!0,enumerable:!0})}function C(a,b){B(a,b,function(){return w(this.impl[b])})}function D(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=z(this);return a[b].apply(a,arguments)}})})}var E=new WeakMap,F=new WeakMap,G=Object.create(null),H=!("securityPolicy"in document)||document.securityPolicy.allowsEval;if(H)try{var I=new Function("","return true;");H=I()}catch(J){H=!1}var K=Object.defineProperty,L=Object.getOwnPropertyNames,M=Object.getOwnPropertyDescriptor;L(window);var N=/Firefox/.test(navigator.userAgent),O={get:function(){},set:function(){},configurable:!0,enumerable:!0},P=window.DOMImplementation,Q=window.EventTarget,R=window.Event,S=window.Node,T=window.Window,U=window.Range,V=window.CanvasRenderingContext2D,W=window.WebGLRenderingContext,X=window.SVGElementInstance;a.assert=b,a.constructorTable=E,a.defineGetter=B,a.defineWrapGetter=C,a.forwardMethodsToWrapper=D,a.isWrapper=u,a.isWrapperFor=r,a.mixin=c,a.nativePrototypeTable=F,a.oneOf=e,a.registerObject=s,a.registerWrapper=p,a.rewrap=A,a.unwrap=x,a.unwrapIfNeeded=y,a.wrap=w,a.wrapIfNeeded=z,a.wrappers=G}(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(a){if(a.treeScope_)return a.treeScope_;var c,e=a.parentNode;return c=e?d(e):new b(a,null),a.treeScope_=c}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){var b=a.localName;return"content"===b||"shadow"===b}function d(a){return!!a.shadowRoot}function e(a){var b;return a.parentNode||(b=a.defaultView)&&P(b)||null}function f(f,g,h){if(h.length)return h.shift();if(b(f))return j(f)||f.host;var i=a.eventParentsTable.get(f);if(i){for(var k=1;k<i.length;k++)h[k-1]=i[k];return i[0]}if(g&&c(f)){var l=f.parentNode;if(l&&d(l))for(var m=a.getShadowTrees(l),n=j(g),k=0;k<m.length;k++)if(m[k].contains(n))return n}return e(f)}function g(a){for(var d=[],e=a,g=[],i=[];e;){var j=null;if(c(e)){j=h(d);var k=d[d.length-1]||e;d.push(k)}else d.length||d.push(e);var l=d[d.length-1];g.push({target:l,currentTarget:e}),b(e)&&d.pop(),e=f(e,j,i)}return g}function h(a){for(var b=a.length-1;b>=0;b--)if(!c(a[b]))return a[b];return null}function i(a,d){for(var e=[];a;){for(var g=[],i=d,j=void 0;i;){var m=null;if(g.length){if(c(i)&&(m=h(g),k(j))){var n=g[g.length-1];g.push(n)}}else g.push(i);if(l(i,a))return g[g.length-1];b(i)&&g.pop(),j=i,i=f(i,m,e)}a=b(a)?a.host:a.parentNode}}function j(b){return a.insertionParentTable.get(b)}function k(a){return j(a)}function l(a,b){return L(a)===L(b)}function m(a){S.get(a)||(S.set(a,!0),o(P(a),P(a.target)))}function n(a){switch(a.type){case"beforeunload":case"load":case"unload":return!0}return!1}function o(b,c){if(T.get(b))throw new Error("InvalidStateError");T.set(b,!0),a.renderAllPending();var d=g(c);return 2===d.length&&d[0].target instanceof Q.Document&&n(b)&&d.shift(),_.set(b,d),p(b,d)&&q(b,d)&&r(b,d),X.set(b,u.NONE),V.delete(b,null),T.delete(b),b.defaultPrevented}function p(a,b){for(var c,d=b.length-1;d>0;d--){var e=b[d].target,f=b[d].currentTarget;if(e!==f&&(c=u.CAPTURING_PHASE,!s(b[d],a,c)))return!1}return!0}function q(a,b){var c=u.AT_TARGET;return s(b[0],a,c)}function r(a,b){for(var c,d=a.bubbles,e=1;e<b.length;e++){var f=b[e].target,g=b[e].currentTarget;if(f===g)c=u.AT_TARGET;else{if(!d||Z.get(a))continue;c=u.BUBBLING_PHASE}if(!s(b[e],a,c))return}}function s(a,b,c){var d=a.target,e=a.currentTarget,f=R.get(e);if(!f)return!0;if("relatedTarget"in b){var g=O(b),h=g.relatedTarget;if(h){if(h instanceof Object&&h.addEventListener){var j=P(h),k=i(e,j);if(k===d)return!0}else k=null;W.set(b,k)}}X.set(b,c);var l=b.type,m=!1;U.set(b,d),V.set(b,e);for(var n=0;n<f.length;n++){var o=f[n];if(o.removed)m=!0;else if(!(o.type!==l||!o.capture&&c===u.CAPTURING_PHASE||o.capture&&c===u.BUBBLING_PHASE))try{if("function"==typeof o.handler?o.handler.call(e,b):o.handler.handleEvent(b),Z.get(b))return!1}catch(p){window.onerror?window.onerror(p.message):console.error(p,p.stack)}}if(m){var q=f.slice();f.length=0;for(var n=0;n<q.length;n++)q[n].removed||f.push(q[n])}return!Y.get(b)}function t(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function u(a,b){if(!(a instanceof ab))return P(y(ab,"Event",a,b));
+var c=a;return lb||"beforeunload"!==c.type?void(this.impl=c):new z(c)}function v(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:O(a.relatedTarget)}}):a}function w(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void(this.impl=b):P(y(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 x(a,b){return function(){arguments[b]=O(arguments[b]);var c=O(this);c[a].apply(c,arguments)}}function y(a,b,c,d){if(jb)return new a(c,v(d));var e=O(document.createEvent(b)),f=ib[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 z(a){u.call(this,a)}function A(a){return"function"==typeof a?!0:a&&a.handleEvent}function B(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 C(a){this.impl=a}function D(a){return a instanceof Q.ShadowRoot&&(a=a.host),O(a)}function E(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 F(a,b){for(var c=O(a);c;c=c.parentNode)if(E(P(c),b))return!0;return!1}function G(a){K(a,nb)}function H(b,c,d,e){a.renderAllPending();for(var f=P(ob.call(c.impl,d,e)),h=g(f,this),i=0;i<h.length;i++){var j=h[i];if(j.currentTarget===b)return j.target}return null}function I(a){return function(){var b=$.get(this);return b&&b[a]&&b[a].value||null}}function J(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 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;t.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 ab=window.Event;ab.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},u.prototype={get target(){return U.get(this)},get currentTarget(){return V.get(this)},get eventPhase(){return X.get(this)},get path(){var a=new Q.NodeList,b=_.get(this);if(b){for(var c=0,d=b.length-1,e=L(V.get(this)),f=0;d>=f;f++){var g=b[f].currentTarget,h=L(g);h.contains(e)&&(f!==d||g instanceof Q.Node)&&(a[c++]=g)}a.length=c}return a},stopPropagation:function(){Y.set(this,!0)},stopImmediatePropagation:function(){Y.set(this,!0),Z.set(this,!0)}},N(ab,u,document.createEvent("Event"));var bb=w("UIEvent",u),cb=w("CustomEvent",u),db={get relatedTarget(){var a=W.get(this);return void 0!==a?a:P(O(this).relatedTarget)}},eb=M({initMouseEvent:x("initMouseEvent",14)},db),fb=M({initFocusEvent:x("initFocusEvent",5)},db),gb=w("MouseEvent",bb,eb),hb=w("FocusEvent",bb,fb),ib=Object.create(null),jb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!jb){var kb=function(a,b,c){if(c){var d=ib[c];b=M(M({},d),b)}ib[a]=b};kb("Event",{bubbles:!1,cancelable:!1}),kb("CustomEvent",{detail:null},"Event"),kb("UIEvent",{view:null,detail:0},"Event"),kb("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),kb("FocusEvent",{relatedTarget:null},"UIEvent")}var lb=window.BeforeUnloadEvent;z.prototype=Object.create(u.prototype),M(z.prototype,{get returnValue(){return this.impl.returnValue},set returnValue(a){this.impl.returnValue=a}}),lb&&N(lb,z);var mb=window.EventTarget,nb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;nb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),C.prototype={addEventListener:function(a,b,c){if(A(b)&&!B(a)){var d=new t(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=[],R.set(this,e);e.push(d);var g=D(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=D(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=O(b),d=c.type;S.set(c,!1),a.renderAllPending();var e;F(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return O(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},mb&&N(mb,C);var ob=document.elementFromPoint;a.adjustRelatedTarget=i,a.elementFromPoint=H,a.getEventHandlerGetter=I,a.getEventHandlerSetter=J,a.wrapEventTargetMethods=G,a.wrappers.BeforeUnloadEvent=z,a.wrappers.CustomEvent=cb,a.wrappers.Event=u,a.wrappers.EventTarget=C,a.wrappers.FocusEvent=hb,a.wrappers.MouseEvent=gb,a.wrappers.UIEvent=bb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,{enumerable:!1})}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;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]);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,cleanUpNodes(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,d){for(var e=a.firstElementChild;e;)e.matches(b)&&(d[d.length++]=e),c(e,b,d),e=e.nextElementSibling;return d}var d={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return c(this,a,new NodeList)}},e={getElementsByTagName:function(a){return this.querySelectorAll(a)},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){if("*"===a)return this.getElementsByTagName(b);for(var c=new NodeList,d=this.getElementsByTagName(b),e=0,f=0;e<d.length;e++)d[e].namespaceURI===a&&(c[f++]=d[e]);return c.length=f,c}};a.GetElementsByInterface=e,a.SelectorsInterface=d}(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,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){h.call(this,a)}function e(a,c,d){var e=d||c;Object.defineProperty(a,c,{get:function(){return this.impl[c]},set:function(a){this.impl[c]=a,b(this,e)},configurable:!0,enumerable:!0})}var f=a.ChildNodeInterface,g=a.GetElementsByInterface,h=a.wrappers.Node,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.wrappers,o=window.Element,p=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return o.prototype[a]}),q=p[0],r=o.prototype[q];d.prototype=Object.create(h.prototype),l(d.prototype,{createShadowRoot:function(){var b=new n.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 r.call(this.impl,a)}}),p.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),o.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),e(d.prototype,"id"),e(d.prototype,"className","class"),l(d.prototype,f),l(d.prototype,g),l(d.prototype,i),l(d.prototype,j),m(o,d,document.createElementNS(null,"x")),a.matchesNames=p,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" ":return"&nbsp;"}}function c(a){return a.replace(z,b)}function d(a){return a.replace(A,b)}function e(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}function f(a,b){switch(a.nodeType){case Node.ELEMENT_NODE:for(var e,f=a.tagName.toLowerCase(),h="<"+f,i=a.attributes,j=0;e=i[j];j++)h+=" "+e.name+'="'+c(e.value)+'"';return h+=">",B[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&C[b.localName]?k:d(k);case Node.COMMENT_NODE:return"<!--"+a.data+"-->";default:throw console.error(a),new Error("not implemented")}}function g(a){a instanceof y.HTMLTemplateElement&&(a=a.content);for(var b="",c=a.firstChild;c;c=c.nextSibling)b+=f(c,a);return b}function h(a,b,c){var d=c||"div";a.textContent="";var e=w(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(x(f))}function i(a){o.call(this,a)}function j(a,b){var c=w(a.cloneNode(!1));c.innerHTML=b;for(var d,e=w(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return x(e)}function k(b){return function(){return a.renderAllPending(),this.impl[b]}}function l(a){p(i,a,k(a))}function m(b){Object.defineProperty(i.prototype,b,{get:k(b),set:function(c){a.renderAllPending(),this.impl[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,arguments)},configurable:!0,enumerable:!0})}var o=a.wrappers.Element,p=a.defineGetter,q=a.enqueueMutation,r=a.mixin,s=a.nodesWereAdded,t=a.nodesWereRemoved,u=a.registerWrapper,v=a.snapshotNodeList,w=a.unwrap,x=a.wrap,y=a.wrappers,z=/[&\u00A0"]/g,A=/[&\u00A0<>]/g,B=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),C=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D=/MSIE/.test(navigator.userAgent),E=window.HTMLElement,F=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(D&&C[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof y.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!F&&this instanceof y.HTMLTemplateElement?h(this.content,a):this.impl.innerHTML=a;var c=v(this.childNodes);q(this,"childList",{addedNodes:c,removedNodes:b}),t(b),s(c,this)},get outerHTML(){return f(this,this.parentNode)},set outerHTML(a){var b=this.parentNode;if(b){b.invalidateShadowRenderer();var c=j(b,a);b.replaceChild(c,this)}},insertAdjacentHTML:function(a,b){var c,d;switch(String(a).toLowerCase()){case"beforebegin":c=this.parentNode,d=this;break;case"afterend":c=this.parentNode,d=this.nextSibling;break;case"afterbegin":c=this,d=this.firstChild;break;case"beforeend":c=this,d=null;break;default:return}var e=j(c,b);c.insertBefore(e,d)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(E,i,document.createElement("b")),a.wrappers.HTMLElement=i,a.getInnerHTML=g,a.setInnerHTML=h}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=a.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,b,document.createElement("canvas")),a.wrappers.HTMLCanvasElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLContentElement;b.prototype=Object.create(c.prototype),d(b.prototype,{get select(){return this.getAttribute("select")},set select(a){this.setAttribute("select",a)},setAttribute:function(a,b){c.prototype.setAttribute.call(this,a,b),"select"===String(a).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),f&&e(f,b),a.wrappers.HTMLContentElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){d.call(this,a)}function c(a,b){if(!(this instanceof c))throw new TypeError("DOM object constructor cannot be called as a function.");var e=f(document.createElement("img"));d.call(this,e),g(e,this),void 0!==a&&(e.width=a),void 0!==b&&(e.height=b)}var d=a.wrappers.HTMLElement,e=a.registerWrapper,f=a.unwrap,g=a.rewrap,h=window.HTMLImageElement;b.prototype=Object.create(d.prototype),e(h,b,document.createElement("img")),c.prototype=b.prototype,a.wrappers.HTMLImageElement=b,a.wrappers.Image=c}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){c.call(this,a)}var c=a.wrappers.HTMLElement,d=a.mixin,e=a.registerWrapper,f=window.HTMLShadowElement;b.prototype=Object.create(c.prototype),d(b.prototype,{}),f&&e(f,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.registerObject,c="http://www.w3.org/2000/svg",d=document.createElementNS(c,"title"),e=b(d),f=Object.getPrototypeOf(e.prototype).constructor;a.wrappers.SVGElement=f}(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),this.treeScope_=new d(this,g(a));var e=a.shadowRoot;m.set(this,e),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,b){g(b).push(a),x(a,b);var c=J.get(a);c||J.set(a,c=[]),c.push(b)}function f(a){I.set(a,[])}function g(a){var b=I.get(a);return b||I.set(a,b=[]),b}function h(a){for(var b=[],c=0,d=a.firstChild;d;d=d.nextSibling)b[c++]=d;return b}function i(a,b,c){for(var d=a.firstChild;d;d=d.nextSibling)if(b(d)){if(c(d)===!1)return}else i(d,b,c)}function j(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("*"===c||c===a.localName)return!0;if(!M.test(c))return!1;if(":"===c[0]&&!N.test(c))return!1;try{return a.matches(c)}catch(d){return!1}}function k(){for(var a=0;a<P.length;a++){var b=P[a],c=b.parentRenderer;c&&c.dirty||b.render()}P=[]}function l(){y=null,k()}function m(a){var b=L.get(a);return b||(b=new q(a),L.set(a,b)),b}function n(a){var b=E(a).root;return b instanceof D?b:null}function o(a){return m(a.host)}function p(a){this.skip=!1,this.node=a,this.childNodes=[]}function q(a){this.host=a,this.dirty=!1,this.invalidateAttributes(),this.associateNode(a)}function r(a){return a instanceof A}function s(a){return a instanceof A}function t(a){return a instanceof B}function u(a){return a instanceof B}function v(a){return a.shadowRoot}function w(a){for(var b=[],c=a.shadowRoot;c;c=c.olderShadowRoot)b.push(c);return b}function x(a,b){K.set(a,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=new WeakMap,M=/^[*.:#[a-zA-Z_|]/,N=new RegExp("^:("+["link","visited","target","enabled","disabled","checked","indeterminate","nth-child","nth-last-child","nth-of-type","nth-last-of-type","first-child","last-child","first-of-type","last-of-type","only-of-type"].join("|")+")"),O=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),P=[],Q=new ArraySplice;Q.equals=function(a,b){return G(a.node)===b},p.prototype={append:function(a){var b=new p(a);return this.childNodes.push(b),b},sync:function(a){if(!this.skip){for(var b=this.node,e=this.childNodes,f=h(G(b)),g=a||new WeakMap,i=Q.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(g);for(var o=n.removed.length,p=0;o>p;p++){var q=H(f[k++]);g.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),g.set(u,!0),t.sync(g)}l+=r}for(var m=l;m<e.length;m++)e[m].sync(g)}}},q.prototype={render:function(a){if(this.dirty){this.invalidateAttributes(),this.treeComposition();var b=this.host,c=b.shadowRoot;this.associateNode(b);for(var d=!e,e=a||new p(b),f=c.firstChild;f;f=f.nextSibling)this.renderNode(c,e,f,!1);d&&e.sync(),this.dirty=!1}},get parentRenderer(){return E(this.host).renderer},invalidate:function(){if(!this.dirty){if(this.dirty=!0,P.push(this),y)return;y=window[O](l,0)}},renderNode:function(a,b,c,d){if(v(c)){b=b.append(c);var e=m(c);e.dirty=!0,e.render(b)}else r(c)?this.renderInsertionPoint(a,b,c,d):t(c)?this.renderShadowInsertionPoint(a,b,c):this.renderAsAnyDomTree(a,b,c,d)},renderAsAnyDomTree:function(a,b,c,d){if(b=b.append(c),v(c)){var e=m(c);b.skip=!e.dirty,e.render(b)}else for(var f=c.firstChild;f;f=f.nextSibling)this.renderNode(a,b,f,d)},renderInsertionPoint:function(a,b,c,d){var e=g(c);if(e.length){this.associateNode(c);for(var f=0;f<e.length;f++){var h=e[f];r(h)&&d?this.renderInsertionPoint(a,b,h,d):this.renderAsAnyDomTree(a,b,h,d)}}else this.renderFallbackContent(a,b,c);this.associateNode(c.parentNode)},renderShadowInsertionPoint:function(a,b,c){var d=a.olderShadowRoot;if(d){x(d,c),this.associateNode(c.parentNode);for(var e=d.firstChild;e;e=e.nextSibling)this.renderNode(d,b,e,!0)}else this.renderFallbackContent(a,b,c)},renderFallbackContent:function(a,b,c){this.associateNode(c),this.associateNode(c.parentNode);for(var d=c.firstChild;d;d=d.nextSibling)this.renderAsAnyDomTree(a,b,d,!1)},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]},distribute:function(a,b){var c=this;i(a,s,function(a){f(a),c.updateDependentAttributes(a.getAttribute("select"));for(var d=0;d<b.length;d++){var g=b[d];void 0!==g&&j(g,a)&&(e(g,a),b[d]=void 0)}})},treeComposition:function(){for(var a=this.host,b=a.shadowRoot,c=[],d=a.firstChild;d;d=d.nextSibling)if(r(d)){var e=g(d);e&&e.length||(e=h(d)),c.push.apply(c,e)}else c.push(d);for(var f,j;b;){if(f=void 0,i(b,u,function(a){return f=a,!1}),j=f,this.distribute(b,c),j){var k=b.olderShadowRoot;if(k){b=k,x(b,j);continue}break}break}},associateNode:function(a){a.impl.polymerShadowRenderer_=this}},C.prototype.invalidateShadowRenderer=function(){var a=this.impl.polymerShadowRenderer_;return a?(a.invalidate(),!0):!1},A.prototype.getDistributedNodes=function(){return k(),g(this)},B.prototype.nodeIsInserted_=A.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var a,b=n(this);b&&(a=o(b)),this.impl.polymerShadowRenderer_=a,a&&a.invalidate()},a.eventParentsTable=J,a.getRendererForHost=m,a.getShadowTrees=w,a.insertionParentTable=K,a.renderAllPending=k,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)))}}),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","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)}}),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)))}}),f(k,b),a.wrappers.Window=b}(window.ShadowDOMPolyfill),function(a){"use strict";var b=a.unwrap,c=window.DataTransfer||window.Clipboard,d=c.prototype.setDragImage;c.prototype.setDragImage=function(a,c,e){d.call(this,b(a),c,e)}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){var b=c[a],d=window[b];if(d){var e=document.createElement(a),f=e.constructor;window[b]=f}}var c=(a.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(c).forEach(b),Object.getOwnPropertyNames(a.wrappers).forEach(function(b){window[b]=a.wrappers[b]})}(window.ShadowDOMPolyfill),function(){window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot}(),function(a){function b(a,b){var c="";return Array.prototype.forEach.call(a,function(a){c+=a.textContent+"\n\n"}),b||(c=c.replace(l,"")),c}function c(a){var b=document.createElement("style");return b.textContent=a,b}function d(a){var b=c(a);document.head.appendChild(b);var d=[];if(b.sheet)try{d=b.sheet.cssRules}catch(e){}else console.warn("sheet not found",b);return b.parentNode.removeChild(b),d}function e(){v.initialized=!0,document.body.appendChild(v);var a=v.contentDocument,b=a.createElement("base");b.href=document.baseURI,a.head.appendChild(b)}function f(a){v.initialized||e(),document.body.appendChild(v),a(v.contentDocument),document.body.removeChild(v)}function g(a,b){if(b){var e;if(a.match("@import")&&x){var g=c(a);f(function(a){a.head.appendChild(g.impl),e=g.sheet.cssRules,b(e)})}else e=d(a),b(e)}}function h(a){a&&j().appendChild(document.createTextNode(a))}function i(a,b){var d=c(a);d.setAttribute(b,""),d.setAttribute(z,""),document.head.appendChild(d)}function j(){return w||(w=document.createElement("style"),w.setAttribute(z,""),w[z]=!0),w}var k={strictStyling:!1,registry:{},shimStyling:function(a,c,d){var e=this.prepareRoot(a,c,d),f=this.isTypeExtension(d),g=this.makeScopeSelector(c,f),h=b(e,!0);h=this.scopeCssText(h,g),a&&(a.shimmedStyle=h),this.addCssToDocument(h,c)},shimStyle:function(a,b){return this.shimCssText(a.textContent,b)},shimCssText:function(a,b){return a=this.insertDirectives(a),this.scopeCssText(a,b)},makeScopeSelector:function(a,b){return a?b?"[is="+a+"]":a:""},isTypeExtension:function(a){return a&&a.indexOf("-")<0},prepareRoot:function(a,b,c){var d=this.registerRoot(a,b,c);return this.replaceTextInStyles(d.rootStyles,this.insertDirectives),this.removeStyles(a,d.rootStyles),this.strictStyling&&this.applyScopeToContent(a,b),d.scopeStyles},removeStyles:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)c.parentNode.removeChild(c)},registerRoot:function(a,b,c){var d=this.registry[b]={root:a,name:b,extendsName:c},e=this.findStyles(a);d.rootStyles=e,d.scopeStyles=d.rootStyles;var f=this.registry[d.extendsName];return f&&(d.scopeStyles=f.scopeStyles.concat(d.scopeStyles)),d},findStyles:function(a){if(!a)return[];var b=a.querySelectorAll("style");return Array.prototype.filter.call(b,function(a){return!a.hasAttribute(A)})},applyScopeToContent:function(a,b){a&&(Array.prototype.forEach.call(a.querySelectorAll("*"),function(a){a.setAttribute(b,"")}),Array.prototype.forEach.call(a.querySelectorAll("template"),function(a){this.applyScopeToContent(a.content,b)},this))},insertDirectives:function(a){return a=this.insertPolyfillDirectivesInCssText(a),this.insertPolyfillRulesInCssText(a)},insertPolyfillDirectivesInCssText:function(a){return a=a.replace(m,function(a,b){return b.slice(0,-2)+"{"}),a.replace(n,function(a,b){return b+" {"})},insertPolyfillRulesInCssText:function(a){return a=a.replace(o,function(a,b){return b.slice(0,-1)}),a.replace(p,function(a,b,c,d){var e=a.replace(b,"").replace(c,"");return d+e})},scopeCssText:function(a,b){var c=this.extractUnscopedRulesFromCssText(a);if(a=this.insertPolyfillHostInCssText(a),a=this.convertColonHost(a),a=this.convertColonHostContext(a),a=this.convertCombinators(a),b){var a,d=this;g(a,function(c){a=d.scopeRules(c,b)})}return a=a+"\n"+c,a.trim()},extractUnscopedRulesFromCssText:function(a){for(var b,c="";b=q.exec(a);)c+=b[1].slice(0,-1)+"\n\n";for(;b=r.exec(a);)c+=b[0].replace(b[2],"").replace(b[1],b[3])+"\n\n";return c},convertColonHost:function(a){return this.convertColonRule(a,cssColonHostRe,this.colonHostPartReplacer)},convertColonHostContext:function(a){return this.convertColonRule(a,cssColonHostContextRe,this.colonHostContextPartReplacer)},convertColonRule:function(a,b,c){return a.replace(b,function(a,b,d,e){if(b=polyfillHostNoCombinator,d){for(var f,g=d.split(","),h=[],i=0,j=g.length;j>i&&(f=g[i]);i++)f=f.trim(),h.push(c(b,f,e));return h.join(",")}return b+e})},colonHostContextPartReplacer:function(a,b,c){return b.match(s)?this.colonHostPartReplacer(a,b,c):a+b+c+", "+b+" "+a+c},colonHostPartReplacer:function(a,b,c){return a+b.replace(s,"")+c},convertCombinators:function(a){for(var b=0;b<combinatorsRe.length;b++)a=a.replace(combinatorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){a.selectorText&&a.style&&a.style.cssText?(c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n"):a.type===CSSRule.MEDIA_RULE?(c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n"):a.cssText&&(c+=a.cssText+"\n\n")},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.applySimpleSelectorScope(a,b)),d.push(a)},this),d.join(", ")},selectorNeedsScoping:function(a,b){var c=this.makeScopeMatcher(b);return!a.match(c)},makeScopeMatcher:function(a){return a=a.replace(/\[/g,"\\[").replace(/\[/g,"\\]"),new RegExp("^("+a+")"+selectorReSuffix,"m")},applySimpleSelectorScope:function(a,b){return a.match(polyfillHostRe)?(a=a.replace(polyfillHostNoCombinator,b),a.replace(polyfillHostRe,b+" ")):b+" "+a},applyStrictSelectorScope:function(a,b){b=b.replace(/\[is=([^\]]*)\]/g,"$1");var c=[" ",">","+","~"],d=a,e="["+b+"]";return c.forEach(function(a){var b=d.split(a);d=b.map(function(a){var b=a.trim().replace(polyfillHostRe,"");return b&&c.indexOf(b)<0&&b.indexOf(e)<0&&(a=b.replace(/([^:]*)(:*)(.*)/,"$1"+e+"$2$3")),a}).join(a)}),d},insertPolyfillHostInCssText:function(a){return a.replace(colonHostContextRe,t).replace(colonHostRe,s)},propertiesFromRule:function(a){var b=a.style.cssText;a.style.content&&!a.style.content.match(/['"]+|attr/)&&(b=b.replace(/content:[^;]*;/g,"content: '"+a.style.content+"';"));var c=a.style;for(var d in c)"initial"===c[d]&&(b+=d+": initial; ");return b},replaceTextInStyles:function(a,b){a&&b&&(a instanceof Array||(a=[a]),Array.prototype.forEach.call(a,function(a){a.textContent=b.call(this,a.textContent)},this))},addCssToDocument:function(a,b){a.match("@import")?i(a,b):h(a)}},l=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,m=/\/\*\s*@polyfill ([^*]*\*+([^/*][^*]*\*+)*\/)([^{]*?){/gim,n=/polyfill-next-selector[^}]*content\:[\s]*'([^']*)'[^}]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,s="-shadowcsshost",t="-shadowcsscontext",u=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)";cssColonHostRe=new RegExp("("+s+u,"gim"),cssColonHostContextRe=new RegExp("("+t+u,"gim"),selectorReSuffix="([>\\s~+[.,{:][\\s\\S]*)?$",colonHostRe=/\:host/gim,colonHostContextRe=/\:host-context/gim,polyfillHostNoCombinator=s+"-no-combinator",polyfillHostRe=new RegExp(s,"gim"),polyfillHostContextRe=new RegExp(t,"gim"),combinatorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//g];var v=document.createElement("iframe");v.style.display="none";var w,x=navigator.userAgent.match("Chrome"),y="shim-shadowdom",z="shim-shadowdom-css",A="no-shim";if(window.ShadowDOMPolyfill){h("style { display: none !important; }\n");var B=wrap(document),C=B.querySelector("head");C.insertBefore(j(),C.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){var b=a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var c="link[rel=stylesheet]["+y+"]",d="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+c,HTMLImports.importer.importsPreloadSelectors+=","+c,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,c,d].join(",");var e=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var c=a.__importElement||a;if(!c.hasAttribute(y))return void e.call(this,a);a.__resource?(c=a.ownerDocument.createElement("style"),c.textContent=b.resolveCssText(a.__resource,a.href)):b.resolveStyle(c),c.textContent=k.shimStyle(c),c.removeAttribute(y,""),c.setAttribute(z,""),c[z]=!0,c.parentNode!==C&&(a.parentNode===C?C.replaceChild(c,a):C.appendChild(c)),c.__importParsed=!0,this.markParsingComplete(a)}};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.templateContent=window.templateContent||function(a){return a.content},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}}}),window.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}}(),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),window.templateContent=window.templateContent||function(a){return a.content},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.module=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){return a.replace(d,function(a,d,e,f){var g=e.replace(/["']/g,"");return g=c(b,g),d+"'"+g+"'"+f})}function c(a,b){var c=new URL(b,a);return d(c.href)}function d(a){var b=document.baseURI,c=new URL(a,b);return c.host===b.host&&c.port===b.port&&c.protocol===b.protocol?e(b.pathname,c.pathname):a}function e(a,b){for(var c=a.split("/"),d=b.split("/");c.length&&c[0]===d[0];)c.shift(),d.shift();for(var e=0,f=c.length-1;f>e;e++)d.unshift("..");return d.join("/")}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){return a=b(a,c,g),b(a,c,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,b){b=b||a.ownerDocument.baseURI,i.forEach(function(d){var e=a.attributes[d];if(e&&e.value&&e.value.search(k)<0){var f=c(b,e.value);e.value=f}})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action"],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){this.receive(a,d,b,c)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d){this.cache[a]=d;for(var e,f=this.pending[a],g=0,h=f.length;h>g&&(e=f[g]);g++)this.onload(a,e,d),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(){4===f.readyState&&d.call(e,!b.ok(f)&&f,f.response||f.responseText,c)}),f.send(),f},loadDocument:function(a,b,c){this.load(a,b,c).responseType="document"}},a.xhr=b,a.Loader=d}(window.HTMLImports),function(a){function b(a){return"link"===a.localName&&a.rel===g}function c(a){var b,c=d(a);try{b=btoa(c)}catch(e){b=btoa(unescape(encodeURIComponent(c))),console.warn("Script contained non-latin characters that were forced to latin. Some characters may be wrong.",a)}return"data:text/javascript;base64,"+b}function d(a){return a.textContent+e(a)}function e(a){var b=a.__nodeUrl;if(!b){b=a.ownerDocument.baseURI;var c="["+Math.floor(1e3*(Math.random()+1))+"]",d=a.textContent.match(/Polymer\(['"]([^'"]*)/);c=d&&d[1]||c,b+="/"+c+".js"}return"\n//# sourceURL="+b+"\n"}function f(a){var b=a.ownerDocument.createElement("style");return b.textContent=a.textContent,n.resolveUrlsInStyle(b),b}var g="import",h=a.flags,i=/Trident/.test(navigator.userAgent),j=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document,k={documentSelectors:"link[rel="+g+"]",importsSelectors:["link[rel="+g+"]","link[rel=stylesheet]","style","script:not([type])",'script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},parseNext:function(){var a=this.nextToParse();a&&this.parse(a)},parse:function(a){if(this.isParsed(a))return void(h.parse&&console.log("[%s] is already parsed",a.localName));var b=this[this.map[a.localName]];b&&(this.markParsing(a),b.call(this,a))},markParsing:function(a){h.parse&&console.log("parsing",a),this.parsingElement=a},markParsingComplete:function(a){a.__importParsed=!0,a.__importElement&&(a.__importElement.__importParsed=!0),this.parsingElement=null,h.parse&&console.log("completed",a),this.parseNext()},parseImport:function(a){if(a.import.__importParsed=!0,HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(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.markParsingComplete(a)},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)};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,m)}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(m)),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||n,g(function(){h(a,b)},b)}function f(a){return"complete"===a.readyState||a.readyState===u}function g(a,b){if(f(b))a&&a();else{var c=function(){("complete"===b.readyState||b.readyState===u)&&(b.removeEventListener(v,c),g(a,b))};b.addEventListener(v,c)}}function h(a,b){function c(){f==g&&requestAnimationFrame(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 k?a.import&&"loading"!==a.import.readyState:a.__importParsed}var j="import"in document.createElement("link"),k=j,l=a.flags,m="import",n=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(k)var o={};else var p=(a.xhr,a.Loader),q=a.parser,o={documents:{},documentPreloadSelectors:"link[rel="+m+"]",importsPreloadSelectors:["link[rel="+m+"]"].join(","),loadNode:function(a){r.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);r.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===n?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e){if(l.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}q.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),q.parseNext()},loadedAll:function(){q.parseNext()}},r=new p(o.loaded.bind(o),o.loadedAll.bind(o));var s={get:function(){return HTMLImports.currentScript||document.currentScript},configurable:!0};if(Object.defineProperty(document,"_currentScript",s),Object.defineProperty(n,"_currentScript",s),!document.baseURI){var t={get:function(){return window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",t),Object.defineProperty(n,"baseURI",t)}var u=HTMLImports.isIE?"complete":"interactive",v="readystatechange";a.hasNative=j,a.useNative=k,a.importer=o,a.whenImportsReady=e,a.IMPORT_LINK_TYPE=m,a.isImportLoaded=i,a.importLoader=r}(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=0,g=a.length;g>e&&(b=a[e]);e++)d(b)&&f.loadNode(b),b.children&&b.children.length&&c(b.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=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);b=Object.getPrototypeOf(c)}for(var d,e=a.prototype;e&&e!==b;){var d=Object.getPrototypeOf(e);e.__proto__=d,e=d}}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){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;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.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);this.fetch(d,{},c)},fetch:function(a,b,d){var e=a.length;if(!e)return d(b);for(var f,g,h,i=function(){0===--e&&d(b)},j=function(a,c){var d=c.match,e=d.url;if(a)return b[e]="",i();
+var f=c.response||c.responseText;b[e]=f,this.fetch(this.extractUrls(f,e),b,i)},k=0;e>k;k++)f=a[k],h=f.url,b[h]?c(i):(g=this.xhr(h,j,this),g.match=f,b[h]=g)},xhr:function(a,b,c){var d=new XMLHttpRequest;return d.open("GET",a,!0),d.send(),d.onload=function(){b.call(c,null,d)},d.onerror=function(){b.call(c,null,d)},d}},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){var c=a.textContent,d=a.ownerDocument.baseURI,e=function(c){a.textContent=c,b(a)};this.resolve(c,d,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),g=this.flatten(g,f,d),a=a.replace(e.matched,g);return a},loadStyles:function(a,b){function c(){e++,e===f&&b&&b()}for(var d,e=0,f=a.length,g=0;f>g&&(d=a[g]);g++)this.resolveNode(d,c)}};var e=new b;a.styleResolver=e}(window.Platform),function(a){a=a||{},a.external=a.external||{};var b={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){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d}e=this.olderShadow(e)}return f}},owner:function(a){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){var b=a.clientX,c=a.clientY,d=this.owner(a.target);return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)}};a.targetFinding=b,a.findTarget=b.findTarget.bind(b),window.PointerEventsPolyfill=a}(window.PointerEventsPolyfill),function(){function a(a){return"body /shadow-deep/ "+b(a)}function b(a){return'[touch-action="'+a+'"]'}function c(a){return"{ -ms-touch-action: "+a+"; touch-action: "+a+"; touch-action-delay: none; }"}var d=["none","auto","pan-x","pan-y",{rule:"pan-x pan-y",selectors:["pan-x pan-y","pan-y pan-x"]}],e="",f=(document.head,window.PointerEvent||window.MSPointerEvent),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){function b(a,b){b=b||Object.create(null);var e=document.createEvent("Event");e.initEvent(a,b.bubbles||!1,b.cancelable||!1);for(var f,g=0;g<c.length;g++)f=c[g],e[f]=b[f]||d[g];e.buttons=b.buttons||0;var h=0;return h=b.pressure?b.pressure:e.buttons?.5:0,e.x=e.clientX,e.y=e.clientY,e.pointerId=b.pointerId||0,e.width=b.width||0,e.height=b.height||0,e.pressure=h,e.tiltX=b.tiltX||0,e.tiltY=b.tiltY||0,e.pointerType=b.pointerType||"",e.hwTimestamp=b.hwTimestamp||0,e.isPrimary=b.isPrimary||!1,e}var c=["bubbles","cancelable","view","detail","screenX","screenY","clientX","clientY","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","pageX","pageY"],d=[!1,!1,null,null,0,0,0,0,!1,!1,!1,!1,0,null,0,0];a.PointerEvent||(a.PointerEvent=b)}(window),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.PointerEventsPolyfill),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"],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],d="undefined"!=typeof SVGElementInstance,e={pointermap:new a.PointerMap,eventMap:Object.create(null),captureInfo:Object.create(null),eventSources:Object.create(null),eventSourceList:[],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))},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)},contains:a.external.contains||function(a,b){return a.contains(b)},down:function(a){a.bubbles=!0,this.fireEvent("pointerdown",a)},move:function(a){a.bubbles=!0,this.fireEvent("pointermove",a)},up:function(a){a.bubbles=!0,this.fireEvent("pointerup",a)},enter:function(a){a.bubbles=!1,this.fireEvent("pointerenter",a)},leave:function(a){a.bubbles=!1,this.fireEvent("pointerleave",a)},over:function(a){a.bubbles=!0,this.fireEvent("pointerover",a)},out:function(a){a.bubbles=!0,this.fireEvent("pointerout",a)},cancel:function(a){a.bubbles=!0,this.fireEvent("pointercancel",a)},leaveOut:function(a){this.out(a),this.contains(a.target,a.relatedTarget)||this.leave(a)},enterOver:function(a){this.over(a),this.contains(a.target,a.relatedTarget)||this.enter(a)},eventHandler:function(a){if(!a._handledByPE){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPE=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:a.external.addEvent||function(a,b){a.addEventListener(b,this.boundHandler)},removeEvent:a.external.removeEvent||function(a,b){a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){this.captureInfo[b.pointerId]&&(b.relatedTarget=null);var c=new PointerEvent(a,b);return b.preventDefault&&(c.preventDefault=b.preventDefault),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],!d||"target"!==e&&"relatedTarget"!==e||f[e]instanceof SVGElementInstance&&(f[e]=f[e].correspondingUseElement);return a.preventDefault&&(f.preventDefault=function(){a.preventDefault()}),f},getTarget:function(a){return this.captureInfo[a.pointerId]||a._target},setCapture:function(a,b){this.captureInfo[a]&&this.releaseCapture(a),this.captureInfo[a]=b;var c=document.createEvent("Event");c.initEvent("gotpointercapture",!0,!1),c.pointerId=a,this.implicitRelease=this.releaseCapture.bind(this,a),document.addEventListener("pointerup",this.implicitRelease),document.addEventListener("pointercancel",this.implicitRelease),c._target=b,this.asyncDispatchEvent(c)},releaseCapture:function(a){var b=this.captureInfo[a];if(b){var c=document.createEvent("Event");c.initEvent("lostpointercapture",!0,!1),c.pointerId=a,this.captureInfo[a]=void 0,document.removeEventListener("pointerup",this.implicitRelease),document.removeEventListener("pointercancel",this.implicitRelease),c._target=b,this.asyncDispatchEvent(c)}},dispatchEvent:a.external.dispatchEvent||function(a){var b=this.getTarget(a);return b?b.dispatchEvent(a):void 0},asyncDispatchEvent:function(a){requestAnimationFrame(this.dispatchEvent.bind(this,a))}};e.boundHandler=e.eventHandler.bind(e),a.dispatcher=e,a.register=e.register.bind(e),a.unregister=e.unregister.bind(e)}(window.PointerEventsPolyfill),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("PointerEventsPolyfill: MutationObservers not found, touch-action will not be dynamically detected")}),a.Installer=b}(window.PointerEventsPolyfill),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","mouseover","mouseout"],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),d=c.preventDefault;return c.preventDefault=function(){a.preventDefault(),d()},c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,f||(c.buttons=e[c.which]||0),c},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.has(this.POINTER_ID);d&&this.cancel(a);var e=this.prepareEvent(a);c.set(this.POINTER_ID,a),b.down(e)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var c=this.prepareEvent(a);b.move(c)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.get(this.POINTER_ID);if(d&&d.button===a.button){var e=this.prepareEvent(a);b.up(e),this.cleanupMouse()}}},mouseover:function(a){if(!this.isEventSimulatedFromTouch(a)){var c=this.prepareEvent(a);b.enterOver(c)}},mouseout:function(a){if(!this.isEventSimulatedFromTouch(a)){var c=this.prepareEvent(a);b.leaveOut(c)}},cancel:function(a){var c=this.prepareEvent(a);b.cancel(c),this.cleanupMouse()},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=h}(window.PointerEventsPolyfill),function(a){var b,c=a.dispatcher,d=c.captureInfo,e=a.findTarget,f=a.targetFinding.allShadows.bind(a.targetFinding),g=c.pointermap,h=(Array.prototype.map.call.bind(Array.prototype.map),2500),i=200,j="touch-action",k=!1,l={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){k?c.listen(a,this.events):b.enableOnSubtree(a)},unregister:function(a){k&&c.unlisten(a,this.events)},elementAdded:function(a){var b=a.getAttribute(j),d=this.touchActionToScrollType(b);d&&(a._scrollType=d,c.listen(a,this.events),f(a).forEach(function(a){a._scrollType=d,c.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,c.unlisten(a,this.events),f(a).forEach(function(a){a._scrollType=void 0,c.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(j),d=this.touchActionToScrollType(c),e=this.touchActionToScrollType(b);d&&e?(a._scrollType=d,f(a).forEach(function(a){a._scrollType=d},this)):e?this.elementRemoved(a):d&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},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===g.pointers()||1===g.pointers()&&g.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,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,i)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},touchToPointer:function(a){var b=this.currentTouchEvent,f=c.cloneEvent(a),g=f.pointerId=a.identifier+2;f.target=d[g]||e(f),f.bubbles=!0,f.cancelable=!0,f.detail=this.clickCount,f.button=0,f.buttons=this.typeToButtons(b.type),f.width=a.webkitRadiusX||a.radiusX||0,f.height=a.webkitRadiusY||a.radiusY||0,f.pressure=a.webkitForce||a.force||.5,f.isPrimary=this.isPrimaryTouch(a),f.pointerType=this.POINTER_TYPE;var h=this;return f.preventDefault=function(){h.scrolling=!1,h.firstXY=null,b.preventDefault()},f},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)b=!1;else if("XY"===c)b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);b=g>=h}return this.firstXY=null,b}},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(g.pointers()>=b.length){var c=[];g.forEach(function(a,d){if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},touchstart:function(a){this.vacuumTouches(a),this.setPrimaryTouch(a.changedTouches[0]),this.dedupSynthMouse(a),this.scrolling||(this.clickCount++,this.processTouches(a,this.overDown))},overDown:function(a){g.set(a.pointerId,{target:a.target,out:a,outTarget:a.target});c.over(a),c.enter(a),c.down(a)},touchmove:function(a){this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.moveOverOut)))},moveOverOut:function(a){var b=a,d=g.get(b.pointerId);if(d){var e=d.out,f=d.outTarget;c.move(b),e&&f!==b.target&&(e.relatedTarget=b.target,b.relatedTarget=f,e.target=f,b.target?(c.leaveOut(e),c.enterOver(b)):(b.target=f,b.relatedTarget=null,this.cancelOut(b))),d.out=b,d.outTarget=b.target}},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.upOut)},upOut:function(a){this.scrolling||(c.up(a),c.out(a),c.leave(a)),this.cleanUpPointer(a)},touchcancel:function(a){this.processTouches(a,this.cancelOut)},cancelOut:function(a){c.cancel(a),c.out(a),c.leave(a),this.cleanUpPointer(a)},cleanUpPointer:function(a){g["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 f=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,e);setTimeout(f,h)}}};k||(b=new a.Installer(l.elementAdded,l.elementRemoved,l.elementChanged,l)),a.touchEvents=l}(window.PointerEventsPolyfill),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerOut","MSPointerOver","MSPointerCancel","MSGotPointerCapture","MSLostPointerCapture"],register:function(a){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 d&&(c=b.cloneEvent(a),c.pointerType=this.POINTER_TYPES[a.pointerType]),c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(a){c.set(a.pointerId,a);var d=this.prepareEvent(a);b.down(d)},MSPointerMove:function(a){var c=this.prepareEvent(a);b.move(c)},MSPointerUp:function(a){var c=this.prepareEvent(a);b.up(c),this.cleanup(a.pointerId)},MSPointerOut:function(a){var c=this.prepareEvent(a);b.leaveOut(c)},MSPointerOver:function(a){var c=this.prepareEvent(a);b.enterOver(c)},MSPointerCancel:function(a){var c=this.prepareEvent(a);b.cancel(c),this.cleanup(a.pointerId)},MSLostPointerCapture:function(a){var c=b.makeEvent("lostpointercapture",a);b.dispatchEvent(c)},MSGotPointerCapture:function(a){var c=b.makeEvent("gotpointercapture",a);b.dispatchEvent(c)}};a.msEvents=e}(window.PointerEventsPolyfill),function(a){var b=a.dispatcher;if(window.PointerEvent!==a.PointerEvent){if(window.navigator.msPointerEnabled){var c=window.navigator.msMaxTouchPoints;Object.defineProperty(window.navigator,"maxTouchPoints",{value:c,enumerable:!0}),b.registerSource("ms",a.msEvents)}else b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart&&b.registerSource("touch",a.touchEvents);b.register(document)}}(window.PointerEventsPolyfill),function(a){function b(a){if(!e.pointermap.has(a))throw new Error("InvalidPointerId")}var c,d,e=a.dispatcher,f=window.navigator;f.msPointerEnabled?(c=function(a){b(a),this.msSetPointerCapture(a)},d=function(a){b(a),this.msReleasePointerCapture(a)}):(c=function(a){b(a),e.setCapture(a,this)},d=function(a){b(a),e.releaseCapture(a,this)}),window.Element&&!Element.prototype.setPointerCapture&&Object.defineProperties(Element.prototype,{setPointerCapture:{value:c},releasePointerCapture:{value:d}})}(window.PointerEventsPolyfill),PointerGestureEvent.prototype.preventTap=function(){this.tapPrevented=!0},function(a){a=a||{},a.utils={LCA:{find:function(a,b){if(a===b)return a;if(a.contains){if(a.contains(b))return a;if(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=this.walk(a,1),b=this.walk(b,1);return a},walk:function(a,b){for(var c=0;b>c;c++)a=a.parentNode;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode;return b}}},a.findLCA=function(b,c){return a.utils.LCA.find(b,c)},window.PointerGestures=a}(window.PointerGestures),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.PointerGestures),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","screenX","screenY","pageX","pageY","tapPrevented"],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],d={handledEvents:new WeakMap,targets:new WeakMap,handlers:{},recognizers:{},events:{},registerRecognizer:function(a,b){var c=b;this.recognizers[a]=c,c.events.forEach(function(a){if(c[a]){this.events[a]=!0;var b=c[a].bind(c);this.addHandler(a,b)}},this)},addHandler:function(a,b){var c=a;this.handlers[c]||(this.handlers[c]=[]),this.handlers[c].push(b)},registerTarget:function(a){this.listen(Object.keys(this.events),a)},unregisterTarget:function(a){this.unlisten(Object.keys(this.events),a)},eventHandler:function(a){if(!this.handledEvents.get(a)){var b=a.type,c=this.handlers[b];c&&this.makeQueue(c,a),this.handledEvents.set(a,!0)}},makeQueue:function(a,b){var c=this.cloneEvent(b);requestAnimationFrame(this.runQueue.bind(this,a,c))},runQueue:function(a,b){this.currentPointerId=b.pointerId;for(var c,d=0,e=a.length;e>d&&(c=a[d]);d++)c(b);this.currentPointerId=0},listen:function(a,b){a.forEach(function(a){this.addEvent(a,this.boundHandler,!1,b)},this)},unlisten:function(a){a.forEach(function(a){this.removeEvent(a,this.boundHandler,!1,inTarget)},this)},addEvent:function(a,b,c,d){d.addEventListener(a,b,c)},removeEvent:function(a,b,c,d){d.removeEventListener(a,b,c)},makeEvent:function(a,b){return new PointerGestureEvent(a,b)},cloneEvent:function(a){for(var d,e={},f=0;f<b.length;f++)d=b[f],e[d]=a[d]||c[f];return e},dispatchEvent:function(a,b){var c=b||this.targets.get(a);c&&(c.dispatchEvent(a),a.tapPrevented&&this.preventTap(this.currentPointerId))},asyncDispatchEvent:function(a,b){requestAnimationFrame(this.dispatchEvent.bind(this,a,b))},preventTap:function(a){var b=this.recognizers.tap;b&&b.preventTap(a)}};d.boundHandler=d.eventHandler.bind(d),d.registerQueue=[],d.immediateRegister=!1,a.dispatcher=d,a.register=function(b){if(d.immediateRegister){var c=window.PointerEventsPolyfill;c&&c.register(b),a.dispatcher.registerTarget(b)}else d.registerQueue.push(b)},a.register(document)}(window.PointerGestures),function(a){var b=a.dispatcher,c={HOLD_DELAY:200,WIGGLE_THRESHOLD:16,events:["pointerdown","pointermove","pointerup","pointercancel"],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},pointerdown:function(a){a.isPrimary&&!this.heldPointer&&(this.heldPointer=a,this.target=a.target,this.holdJob=setInterval(this.pulse.bind(this),this.HOLD_DELAY))},pointerup:function(a){this.heldPointer&&this.heldPointer.pointerId===a.pointerId&&this.cancel()},pointercancel:function(){this.cancel()},pointermove: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,c){var d={pointerType:this.heldPointer.pointerType,clientX:this.heldPointer.clientX,clientY:this.heldPointer.clientY};c&&(d.holdTime=c);var e=b.makeEvent(a,d);b.dispatchEvent(e,this.target),e.tapPrevented&&b.preventTap(this.heldPointer.pointerId)}};b.registerRecognizer("hold",c)}(window.PointerGestures),function(a){var b=a.dispatcher,c=new a.PointerMap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],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,c,d){var e=d,f=this.calcPositionDelta(e.downEvent,c),g=this.calcPositionDelta(e.lastMoveEvent,c);g.x&&(e.xDirection=this.clampDir(g.x)),g.y&&(e.yDirection=this.clampDir(g.y));var h={dx:f.x,dy:f.y,ddx:g.x,ddy:g.y,clientX:c.clientX,clientY:c.clientY,pageX:c.pageX,pageY:c.pageY,screenX:c.screenX,screenY:c.screenY,xDirection:e.xDirection,yDirection:e.yDirection,trackInfo:e.trackInfo,relatedTarget:c.target,pointerType:c.pointerType},i=b.makeEvent(a,h);e.lastMoveEvent=c,b.dispatchEvent(i,e.downTarget)},pointerdown: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};c.set(a.pointerId,b)}},pointermove:function(a){var b=c.get(a.pointerId);if(b)if(b.tracking)this.fireTrack("track",a,b);else{var d=this.calcPositionDelta(b.downEvent,a),e=d.x*d.x+d.y*d.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,this.fireTrack("trackstart",b.downEvent,b),this.fireTrack("track",a,b))}},pointerup:function(a){var b=c.get(a.pointerId);b&&(b.tracking&&this.fireTrack("trackend",a,b),c.delete(a.pointerId))},pointercancel:function(a){this.pointerup(a)}};b.registerRecognizer("track",d)}(window.PointerGestures),function(a){var b=a.dispatcher,c={MIN_VELOCITY:.5,MAX_QUEUE:4,moveQueue:[],target:null,pointerId:null,events:["pointerdown","pointermove","pointerup","pointercancel"],pointerdown:function(a){a.isPrimary&&!this.pointerId&&(this.pointerId=a.pointerId,this.target=a.target,this.addMove(a))},pointermove:function(a){a.pointerId===this.pointerId&&this.addMove(a)},pointerup:function(a){a.pointerId===this.pointerId&&this.fireFlick(a),this.cleanup()},pointercancel:function(){this.cleanup()},cleanup:function(){this.moveQueue=[],this.target=null,this.pointerId=null},addMove:function(a){this.moveQueue.length>=this.MAX_QUEUE&&this.moveQueue.shift(),this.moveQueue.push(a)},fireFlick:function(a){for(var c,d,e,f,g,h,i,j=a,k=this.moveQueue.length,l=0,m=0,n=0,o=0;k>o&&(i=this.moveQueue[o]);o++)c=j.timeStamp-i.timeStamp,d=j.clientX-i.clientX,e=j.clientY-i.clientY,f=d/c,g=e/c,h=Math.sqrt(f*f+g*g),h>n&&(l=f,m=g,n=h);var p=Math.abs(l)>Math.abs(m)?"x":"y",q=this.calcAngle(l,m);if(Math.abs(n)>=this.MIN_VELOCITY){var r=b.makeEvent("flick",{xVelocity:l,yVelocity:m,velocity:n,angle:q,majorAxis:p,pointerType:a.pointerType});b.dispatchEvent(r,this.target)}},calcAngle:function(a,b){return 180*Math.atan2(b,a)/Math.PI}};b.registerRecognizer("flick",c)}(window.PointerGestures),function(a){var b=a.dispatcher,c=new a.PointerMap,d=180/Math.PI,e={events:["pointerdown","pointermove","pointerup","pointercancel"],reference:{},pointerdown:function(b){if(c.set(b.pointerId,b),2==c.pointers()){var d=this.calcChord(),e=this.calcAngle(d);this.reference={angle:e,diameter:d.diameter,target:a.findLCA(d.a.target,d.b.target)}}},pointerup:function(a){c.delete(a.pointerId)},pointermove:function(a){c.has(a.pointerId)&&(c.set(a.pointerId,a),c.pointers()>1&&this.calcPinchRotate())},pointercancel:function(a){this.pointerup(a)},dispatchPinch:function(a,c){var d=a/this.reference.diameter,e=b.makeEvent("pinch",{scale:d,centerX:c.center.x,centerY:c.center.y});b.dispatchEvent(e,this.reference.target)},dispatchRotate:function(a,c){var d=Math.round((a-this.reference.angle)%360),e=b.makeEvent("rotate",{angle:d,centerX:c.center.x,centerY:c.center.y});b.dispatchEvent(e,this.reference.target)},calcPinchRotate:function(){var a=this.calcChord(),b=a.diameter,c=this.calcAngle(a);b!=this.reference.diameter&&this.dispatchPinch(b,a),c!=this.reference.angle&&this.dispatchRotate(c,a)},calcChord:function(){var a=[];c.forEach(function(b){a.push(b)});for(var b,d,e,f=0,g={a:a[0],b:a[1]},h=0;h<a.length;h++)for(var i=a[h],j=h+1;j<a.length;j++){var k=a[j];b=Math.abs(i.clientX-k.clientX),d=Math.abs(i.clientY-k.clientY),e=b+d,e>f&&(f=e,g={a:i,b:k})}return b=Math.abs(g.a.clientX+g.b.clientX)/2,d=Math.abs(g.a.clientY+g.b.clientY)/2,g.center={x:b,y:d},g.diameter=f,g},calcAngle:function(a){var b=a.a.clientX-a.b.clientX,c=a.a.clientY-a.b.clientY;return(360+Math.atan2(c,b)*d)%360}};b.registerRecognizer("pinch",e)}(window.PointerGestures),function(a){var b=a.dispatcher,c=new a.PointerMap,d={events:["pointerdown","pointermove","pointerup","pointercancel","keyup"],pointerdown:function(a){a.isPrimary&&!a.tapPrevented&&c.set(a.pointerId,{target:a.target,buttons:a.buttons,x:a.clientX,y:a.clientY})},pointermove:function(a){if(a.isPrimary){var b=c.get(a.pointerId);b&&a.tapPrevented&&c.delete(a.pointerId)}},shouldTap:function(a,b){return a.tapPrevented?void 0:"mouse"===a.pointerType?1===b.buttons:!0},pointerup:function(d){var e=c.get(d.pointerId);if(e&&this.shouldTap(d,e)){var f=a.findLCA(e.target,d.target);if(f){var g=b.makeEvent("tap",{x:d.clientX,y:d.clientY,detail:d.detail,pointerType:d.pointerType});b.dispatchEvent(g,f)}}c.delete(d.pointerId)},pointercancel:function(a){c.delete(a.pointerId)},keyup:function(a){var c=a.keyCode;if(32===c){var d=a.target;d instanceof HTMLInputElement||d instanceof HTMLTextAreaElement||b.dispatchEvent(b.makeEvent("tap",{x:0,y:0,detail:0,pointerType:"unavailable"}),d)}},preventTap:function(a){c.delete(a)}};b.registerRecognizer("tap",d)}(window.PointerGestures),function(a){function b(){c.immediateRegister=!0;var b=c.registerQueue;b.forEach(a.register),b.length=0}var c=a.dispatcher;"complete"===document.readyState?b():document.addEventListener("readystatechange",function(){"complete"===document.readyState&&b()})}(window.PointerGestures),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)};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(J[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(L);h(a)&&b(a),E(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("");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];I[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){N?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(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!==H&&g!==F&&g!==G){var j=s(i,g,a,c);j&&d.push(g,j)}}return h(a)&&(d.isTemplate=!0,d.if=x(a,H,c),d.bind=x(a,F,c),d.repeat=x(a,G,c),!d.if||d.bind||d.repeat||(d.bind=s("{{}}",F,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){this.closed=!1,this.templateElement_=a,this.instances=[],this.deps=void 0,this.iteratedValue=[],this.presentValue=void 0,this.arrayObserver=void 0}var D,E=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.Map&&"function"==typeof a.Map.prototype.forEach?D=a.Map:(D=function(){this.keys=[],this.values=[]},D.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 F="bind",G="repeat",H="if",I={template:!0,repeat:!0,bind:!0,ref:!0},J={THEAD:!0,TBODY:!0,TFOOT:!0,TH:!0,TR:!0,TD:!0,COLGROUP:!0,COL:!0,CAPTION:!0,OPTION:!0,OPTGROUP:!0},K="undefined"!=typeof HTMLTemplateElement;K&&!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 L="template, "+Object.keys(J).map(function(a){return a.toLowerCase()+"[template]"}).join(", ");document.addEventListener("DOMContentLoaded",function(){j(document),Platform.performMicrotaskCheckpoint()},!1),K||(a.HTMLTemplateElement=function(){throw TypeError("Illegal constructor")});var M,N="__proto__"in{};"function"==typeof MutationObserver&&(M=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)&&K,i=h,k=!h,m=!1;if(h||(g(d)?(b(!c),d=n(a),d.templateIsDecorated_=!0,h=K,m=!0):e(d)&&(d=o(a),d.templateIsDecorated_=!0,h=K)),!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 O=a.HTMLUnknownElement||HTMLElement,P={get:function(){return this.content_},enumerable:!0,configurable:!0};K||(HTMLTemplateElement.prototype=Object.create(O.prototype),Object.defineProperty(HTMLTemplateElement.prototype,"content",P)),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 C(this)),this.iterator_.updateDependencies(a,this.model_),M&&M.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)),this.refContent_||(this.refContent_=this.ref_.content);var d=this.refContent_;if(null===d.firstChild)return Q;var e=this.bindingMap_;e&&e.content===d||(e=B(d,c&&c.prepareBinding)||[],e.content=d,this.bindingMap_=e);var 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)}}return a?{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}}),Object.defineProperty(Node.prototype,"templateInstance",{get:function(){var a=this.templateInstance_;return a?a:this.parentNode?this.parentNode.templateInstance:void 0}});var Q=document.createDocumentFragment();Q.bindings_=[],Q.terminator_=null,C.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(H,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(G,a.repeat,d,b)):(c.repeat=!1,c.oneTime=a.bind.onlyOneTime,c.value=v(F,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 D,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!==Q&&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?Q: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!==Q&&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){"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&&" ᠎              ".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;for(a=C();v(".")||v("[");)v("[")?(b=G(),a=Z.createMemberExpression("[",a,b)):(b=F(),a=Z.createMemberExpression(".",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=t[a];if(!b){var c=new j;esprima.parse(a,c),b=new l(c),t[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){"["==c&&b instanceof d&&Path.get(b.value).valid&&(c=".",b=new e(b.value)),this.dynamicDeps="function"==typeof a||a.dynamic,this.dynamic="function"==typeof b||b.dynamic||"["==c,this.simplePath=!this.dynamic&&!this.dynamicDeps&&b instanceof e&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property="."==c?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){return"o"===a[0]&&"n"===a[1]&&"-"===a[2]}function o(a,b){for(;a[x]&&!Object.prototype.hasOwnProperty.call(a,b);)a=a[x];return a}function p(a,b){if(0==b.length)return void 0;if(1==b.length)return o(a,b[0]);for(var c=0;null!=a&&c<b.length-1;c++)a=a[b[c]];return a}function q(a,b,c){var d=b.substring(3);return d=w[d]||d,function(b,e,f){function g(){return"{{ "+a+" }}"}var h,i,j;return j="function"==typeof c.resolveEventHandler?function(d){h=h||c.resolveEventHandler(b,a,e),h(d,d.detail,d.currentTarget),Platform&&"function"==typeof Platform.flush&&Platform.flush()}:function(c){h=h||a.getValueFrom(b),i=i||p(b,a,e),h.apply(i,[c,c.detail,c.currentTarget]),Platform&&"function"==typeof Platform.flush&&Platform.flush()},e.addEventListener(d,j),f?void 0:{open:g,discardChanges:g,close:function(){e.removeEventListener(d,j)}}}}function r(a){switch(a){case"":return!1;case"false":case"null":case"true":return!0}return isNaN(Number(a))?!1:!0}function s(){}var t=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=o(a,this.path[0]),this.path.setValueFrom(a,b)}},f.prototype={get fullPath(){if(!this.fullPath_){var a=this.object instanceof e?this.object.name:this.object.fullPath;this.fullPath_=Path.get(a+"."+this.property.name)}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.property instanceof e){var b=Path.get(this.property.name);this.valueFn_=function(c,d){var e=a(c,d);return d&&d.addPath(e,b),b.getValueFrom(e)}}else{var c=this.property;this.valueFn_=function(b,d){var e=a(b,d),f=c(b,d);return d&&d.addPath(e,f),e?e[f]:void 0}}}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=d;if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find filter: "+this.name);if(b?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("No "+(b?"toModel":"toDOM")+" found on"+this.name);for(var h=[a],j=0;j<this.args.length;j++)h[j+1]=i(this.args[j])(d,e);return f.apply(g,h)}};var u={"+":function(a){return+a},"-":function(a){return-a},"!":function(a){return!a}},v={"+":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(!u[a])throw Error("Disallowed operator: "+a);return b=i(b),function(c,d){return u[a](b(c,d))}},createBinaryExpression:function(a,b,c){if(!v[a])throw Error("Disallowed operator: "+a);return b=i(b),c=i(c),function(d,e){return v[a](b(d,e),c(d,e))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),function(d,e){return a(d,e)?b(d,e):c(d,e)}},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},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){for(var d=[],e=0;e<a.length;e++)d.push(a[e](b,c));return d}},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){for(var d={},e=0;e<a.length;e++)d[a[e].key]=a[e].value(b,c);return d}},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),e=0;e<this.filters.length;e++)d=this.filters[e].transform(d,!1,c,a,b);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(b,!0,c,a);return this.expression.setValue?this.expression.setValue(a,b):void 0}};var w={};["webkitAnimationStart","webkitAnimationEnd","webkitTransitionEnd","DOMFocusOut","DOMFocusIn","DOMMouseScroll"].forEach(function(a){w[a.toLowerCase()]=a});var x="@"+Math.random().toString(36).slice(2);s.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(n(c))return e.valid?q(e,c,this):void console.error("on-* bindings must be simple path expressions");{if(r(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=o(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){var e=Object.create(c);return e[b]=a,e[d]=void 0,e[x]=c,e}}}},a.PolymerExpressions=s,a.exposeGetExpression&&(a.getExpression_=c),a.PolymerExpressions.prepareEventBinding=q}(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/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.js.map b/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.js.map
new file mode 100644
index 0000000..33e82bd
--- /dev/null
+++ b/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"platform.js","sources":["../PointerGestures/src/PointerGestureEvent.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/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/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.js","../ShadowDOM/src/wrappers/HTMLImageElement.js","../ShadowDOM/src/wrappers/HTMLShadowElement.js","../ShadowDOM/src/wrappers/HTMLTemplateElement.js","../ShadowDOM/src/wrappers/HTMLMediaElement.js","../ShadowDOM/src/wrappers/HTMLAudioElement.js","../ShadowDOM/src/wrappers/HTMLOptionElement.js","../ShadowDOM/src/wrappers/HTMLSelectElement.js","../ShadowDOM/src/wrappers/HTMLTableElement.js","../ShadowDOM/src/wrappers/HTMLTableSectionElement.js","../ShadowDOM/src/wrappers/HTMLTableRowElement.js","../ShadowDOM/src/wrappers/HTMLUnknownElement.js","../ShadowDOM/src/wrappers/SVGElement.js","../ShadowDOM/src/wrappers/SVGUseElement.js","../ShadowDOM/src/wrappers/SVGElementInstance.js","../ShadowDOM/src/wrappers/CanvasRenderingContext2D.js","../ShadowDOM/src/wrappers/WebGLRenderingContext.js","../ShadowDOM/src/wrappers/Range.js","../ShadowDOM/src/wrappers/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/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","../PointerEvents/src/boot.js","../PointerEvents/src/touch-action.js","../PointerEvents/src/PointerEvent.js","../PointerEvents/src/pointermap.js","../PointerEvents/src/dispatcher.js","../PointerEvents/src/installer.js","../PointerEvents/src/mouse.js","../PointerEvents/src/touch.js","../PointerEvents/src/ms.js","../PointerEvents/src/platform-events.js","../PointerEvents/src/capture.js","../PointerGestures/src/initialize.js","../PointerGestures/src/pointermap.js","../PointerGestures/src/dispatcher.js","../PointerGestures/src/hold.js","../PointerGestures/src/track.js","../PointerGestures/src/flick.js","../PointerGestures/src/pinch.js","../PointerGestures/src/tap.js","../PointerGestures/src/registerScopes.js","../NodeBind/src/NodeBind.js","../TemplateBinding/src/TemplateBinding.js","../polymer-expressions/third_party/esprima/esprima.js","../polymer-expressions/src/polymer-expressions.js","src/patches-mdv.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiBA,QAAA,qBAAA,EAAA,GACA,GAAA,GAAA,MACA,EAAA,SAAA,YAAA,SACA,GACA,QAAA,QAAA,EAAA,WAAA,EAAA,UAAA,EACA,WAAA,QAAA,EAAA,cAAA,EAAA,aAAA,EAGA,GAAA,UAAA,EAAA,EAAA,QAAA,EAAA,WAGA,KAAA,GADA,GAAA,EAAA,OAAA,KAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,GAAA,EAAA,EAKA,OAFA,GAAA,WAAA,KAAA,WAEA,EC7BA,mBAAA,WACA,WACA,GAAA,GAAA,OAAA,eACA,EAAA,KAAA,MAAA,IAEA,EAAA,WACA,KAAA,KAAA,QAAA,IAAA,KAAA,WAAA,IAAA,KAAA,MAGA,GAAA,WACA,IAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,KAAA,KACA,IAAA,EAAA,KAAA,EACA,EAAA,GAAA,EAEA,EAAA,EAAA,KAAA,MAAA,OAAA,EAAA,GAAA,UAAA,KAEA,IAAA,SAAA,GACA,GAAA,EACA,QAAA,EAAA,EAAA,KAAA,QAAA,EAAA,KAAA,EACA,EAAA,GAAA,QAEA,SAAA,SAAA,GACA,KAAA,IAAA,EAAA,UAIA,OAAA,QAAA,KCnBA,SAAA,QACA,YAGA,SAAA,uBAQA,QAAA,GAAA,GACA,EAAA,EARA,GAAA,kBAAA,QAAA,SACA,kBAAA,OAAA,QACA,OAAA,CAGA,IAAA,MAMA,KACA,IAUA,OATA,QAAA,QAAA,EAAA,GACA,MAAA,QAAA,EAAA,GACA,EAAA,GAAA,EACA,EAAA,GAAA,QACA,GAAA,GACA,EAAA,KAAA,EAAA,GACA,EAAA,OAAA,EAEA,OAAA,qBAAA,GACA,IAAA,EAAA,QACA,EAEA,OAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,GAGA,OAAA,UAAA,EAAA,GACA,MAAA,UAAA,EAAA,IAEA,GAKA,QAAA,cAIA,GAAA,OAAA,UACA,kBAAA,QAAA,WACA,OAAA,SAAA,eAAA,WACA,OAAA,CAGA,KACA,GAAA,GAAA,GAAA,UAAA,GAAA,eACA,OAAA,KACA,MAAA,GACA,OAAA,GAMA,QAAA,SAAA,GACA,OAAA,IAAA,IAAA,EAGA,QAAA,UAAA,GACA,OAAA,EAGA,QAAA,UAAA,GACA,MAAA,KAAA,OAAA,GAOA,QAAA,cAAA,EAAA,GACA,MAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EAAA,EACA,YAAA,IAAA,YAAA,IACA,EAEA,IAAA,GAAA,IAAA,EAyBA,QAAA,aAAA,GACA,MAAA,gBAAA,IACA,GACA,EAAA,EAAA,OAEA,IAAA,GACA,EAEA,KAAA,EAAA,IACA,EAEA,WAAA,KAAA,IAKA,QAAA,MAAA,EAAA,GACA,GAAA,IAAA,qBACA,KAAA,OAAA,wCAEA,OAAA,IAAA,EAAA,OACA,KAEA,QAAA,IACA,KAAA,KAAA,GACA,OAGA,EAAA,MAAA,YAAA,OAAA,SAAA,GACA,MAAA,KACA,QAAA,SAAA,GACA,KAAA,KAAA,IACA,WAEA,SAAA,KAAA,SACA,KAAA,aAAA,KAAA,4BAOA,QAAA,SAAA,GACA,GAAA,YAAA,MACA,MAAA,EAEA,OAAA,IACA,EAAA,IAEA,gBAAA,KACA,EAAA,OAAA,GAEA,IAAA,GAAA,UAAA,EACA,IAAA,EACA,MAAA,EACA,KAAA,YAAA,GACA,MAAA,YACA,IAAA,GAAA,GAAA,MAAA,EAAA,qBAEA,OADA,WAAA,GAAA,EACA,EA8EA,QAAA,YAAA,GAEA,IADA,GAAA,GAAA,EACA,uBAAA,GAAA,EAAA,UACA,GAKA,OAHA,QAAA,0BACA,OAAA,qBAAA,GAEA,EAAA,EAGA,QAAA,eAAA,GACA,IAAA,GAAA,KAAA,GACA,OAAA,CACA,QAAA,EAGA,QAAA,aAAA,GACA,MAAA,eAAA,EAAA,QACA,cAAA,EAAA,UACA,cAAA,EAAA,SAGA,QAAA,yBAAA,EAAA,GACA,GAAA,MACA,KACA,IAEA,KAAA,GAAA,KAAA,GAAA,CACA,GAAA,GAAA,EAAA,IAEA,SAAA,GAAA,IAAA,EAAA,MAGA,IAAA,GAKA,IAAA,EAAA,KACA,EAAA,GAAA,GALA,EAAA,GAAA,QAQA,IAAA,GAAA,KAAA,GACA,IAAA,KAGA,EAAA,GAAA,EAAA,GAMA,OAHA,OAAA,QAAA,IAAA,EAAA,SAAA,EAAA,SACA,EAAA,OAAA,EAAA,SAGA,MAAA,EACA,QAAA,EACA,QAAA,GAKA,QAAA,eACA,IAAA,SAAA,OACA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,SAAA,OAAA,IACA,SAAA,IAGA,OADA,UAAA,OAAA,GACA,EA4BA,QAAA,qBAMA,QAAA,GAAA,GACA,GAAA,EAAA,SAAA,SAAA,GACA,EAAA,OAAA,GAPA,GAAA,GACA,EACA,GAAA,EACA,GAAA,CAOA,QACA,KAAA,SAAA,GACA,GAAA,EACA,KAAA,OAAA,wBAEA,IACA,OAAA,qBAAA,GAEA,EAAA,EACA,GAAA,GAEA,QAAA,SAAA,EAAA,GACA,EAAA,EACA,EACA,MAAA,QAAA,EAAA,GAEA,OAAA,QAAA,EAAA,IAEA,QAAA,SAAA,GACA,EAAA,EACA,OAAA,qBAAA,GACA,GAAA,GAEA,MAAA,WACA,EAAA,OACA,OAAA,UAAA,EAAA,GACA,oBAAA,KAAA,QAKA,QAAA,mBAAA,EAAA,EAAA,GACA,GAAA,GAAA,oBAAA,OAAA,mBAGA,OAFA,GAAA,KAAA,GACA,EAAA,QAAA,EAAA,GACA,EAMA,QAAA,kBAQA,QAAA,GAAA,GACA,GAAA,EAAA,CAGA,GAAA,GAAA,EAAA,QAAA,EACA,IAAA,GACA,EAAA,GAAA,OACA,EAAA,KAAA,IACA,EAAA,QAAA,GAAA,IACA,EAAA,KAAA,GACA,OAAA,QAAA,EAAA,IAGA,EAAA,OAAA,eAAA,KAGA,QAAA,KACA,GAAA,GAAA,IAAA,cAAA,CACA,GAAA,EACA,EAAA,CAEA,IAAA,EACA,KAAA,GAAA,KAAA,GACA,EAAA,EAAA,GACA,GAAA,EAAA,QAAA,QAGA,EAAA,gBAAA,EAGA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IACA,OAAA,UAAA,EAAA,GAGA,EAAA,OAAA,EAGA,QAAA,KACA,GAAA,EACA,GAGA,IAGA,QAAA,KACA,IAGA,GAAA,EACA,GAAA,EACA,OAAA,IAGA,QAAA,KACA,GAEA,IAAA,EAEA,KAAA,GAAA,KAAA,GACA,EAAA,EAAA,GACA,GAAA,EAAA,QAAA,QAGA,EAAA,SAzEA,GAAA,MACA,EAAA,EACA,KACA,EAAA,WACA,GAAA,EACA,GAAA,EAwEA,GACA,OAAA,OACA,QAAA,EACA,KAAA,SAAA,GACA,EAAA,EAAA,KAAA,EACA,IACA,EAAA,gBAAA,IAEA,MAAA,SAAA,GAMA,GAHA,EAAA,EAAA,KAAA,OACA,IAEA,EAEA,WADA,IAGA,IAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,OAAA,UAAA,EAAA,GAAA,GACA,SAAA,iBAGA,GAAA,OAAA,EACA,EAAA,OAAA,EACA,iBAAA,KAAA,OAEA,MAAA,EAGA,OAAA,GAKA,QAAA,gBAAA,EAAA,GAMA,MALA,kBAAA,gBAAA,SAAA,IACA,gBAAA,iBAAA,OAAA,iBACA,gBAAA,OAAA,GAEA,gBAAA,KAAA,GACA,gBAUA,QAAA,YACA,KAAA,OAAA,SACA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,gBAAA,OACA,KAAA,OAAA,OACA,KAAA,IAAA,iBA2DA,QAAA,UAAA,GACA,SAAA,qBACA,kBAGA,aAAA,KAAA,GAGA,QAAA,iBACA,SAAA,qBAiEA,QAAA,gBAAA,GACA,SAAA,KAAA,MACA,KAAA,OAAA,EACA,KAAA,WAAA,OA0FA,QAAA,eAAA,GACA,IAAA,MAAA,QAAA,GACA,KAAA,OAAA,kCACA,gBAAA,KAAA,KAAA,GAgDA,QAAA,cAAA,EAAA,GACA,SAAA,KAAA,MAEA,KAAA,QAAA,EACA,KAAA,MAAA,YAAA,MAAA,EAAA,QAAA,GACA,KAAA,gBAAA,OA0CA,QAAA,oBACA,SAAA,KAAA,MAEA,KAAA,UACA,KAAA,gBAAA,OACA,KAAA,aAkIA,QAAA,SAAA,GAAA,MAAA,GAEA,QAAA,mBAAA,EAAA,EAAA,EACA,GACA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,OAAA,OACA,KAAA,YAAA,EACA,KAAA,YAAA,GAAA,QACA,KAAA,YAAA,GAAA,QAGA,KAAA,oBAAA,EAsDA,QAAA,gBAAA,EAAA,GACA,GAAA,kBAAA,QAAA,QAAA,CAGA,GAAA,GAAA,OAAA,YAAA,EACA,OAAA,UAAA,EAAA,GACA,GAAA,IACA,OAAA,EACA,KAAA,EACA,KAAA,EAEA,KAAA,UAAA,SACA,EAAA,SAAA,GACA,EAAA,OAAA,KAoCA,QAAA,6BAAA,EAAA,EAAA,GAIA,IAAA,GAHA,MACA,KAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,qBAAA,EAAA,OAMA,EAAA,OAAA,KACA,EAAA,EAAA,MAAA,EAAA,UAEA,UAAA,EAAA,OAGA,OAAA,EAAA,KAUA,EAAA,OAAA,UACA,GAAA,EAAA,YACA,GAAA,EAAA,OAEA,EAAA,EAAA,OAAA,EAbA,EAAA,OAAA,SACA,GAAA,EAAA,MAEA,EAAA,EAAA,OAAA,KAfA,QAAA,MAAA,8BAAA,EAAA,MACA,QAAA,MAAA,IA4BA,IAAA,GAAA,KAAA,GACA,EAAA,GAAA,EAAA,EAEA,KAAA,GAAA,KAAA,GACA,EAAA,GAAA,MAEA,IAAA,KACA,KAAA,GAAA,KAAA,GACA,KAAA,IAAA,IAAA,IAAA,IAAA,CAGA,GAAA,GAAA,EAAA,EACA,GAAA,KAAA,IACA,EAAA,GAAA,GAGA,OACA,MAAA,EACA,QAAA,EACA,QAAA,GAIA,QAAA,WAAA,EAAA,EAAA,GACA,OACA,MAAA,EACA,QAAA,EACA,WAAA,GASA,QAAA,gBA0OA,QAAA,aAAA,EAAA,EAAA,EACA,EAAA,EAAA,GACA,MAAA,aAAA,YAAA,EAAA,EAAA,EACA,EAAA,EAAA,GAGA,QAAA,WAAA,EAAA,EAAA,EAAA,GAEA,MAAA,GAAA,GAAA,EAAA,EACA,GAGA,GAAA,GAAA,GAAA,EACA,EAGA,EAAA,EACA,EAAA,EACA,EAAA,EAEA,EAAA,EAGA,EAAA,EACA,EAAA,EAEA,EAAA,EAIA,QAAA,aAAA,EAAA,EAAA,EAAA,GAOA,IAAA,GALA,GAAA,UAAA,EAAA,EAAA,GAEA,GAAA,EACA,EAAA,EAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAGA,IAFA,EAAA,OAAA,GAEA,EAAA,CAGA,GAAA,GAAA,UAAA,EAAA,MACA,EAAA,MAAA,EAAA,QAAA,OACA,EAAA,MACA,EAAA,MAAA,EAAA,WAEA,IAAA,GAAA,EAAA,CAGA,EAAA,OAAA,EAAA,GACA,IAEA,GAAA,EAAA,WAAA,EAAA,QAAA,OAEA,EAAA,YAAA,EAAA,WAAA,CACA,IAAA,GAAA,EAAA,QAAA,OACA,EAAA,QAAA,OAAA,CAEA,IAAA,EAAA,YAAA,EAGA,CACA,GAAA,GAAA,EAAA,OAEA,IAAA,EAAA,MAAA,EAAA,MAAA,CAEA,GAAA,GAAA,EAAA,QAAA,MAAA,EAAA,EAAA,MAAA,EAAA,MACA,OAAA,UAAA,KAAA,MAAA,EAAA,GACA,EAAA,EAGA,GAAA,EAAA,MAAA,EAAA,QAAA,OAAA,EAAA,MAAA,EAAA,WAAA,CAEA,GAAA,GAAA,EAAA,QAAA,MAAA,EAAA,MAAA,EAAA,WAAA,EAAA,MACA,OAAA,UAAA,KAAA,MAAA,EAAA,GAGA,EAAA,QAAA,EACA,EAAA,MAAA,EAAA,QACA,EAAA,MAAA,EAAA,WAnBA,IAAA,MAsBA,IAAA,EAAA,MAAA,EAAA,MAAA,CAGA,GAAA,EAEA,EAAA,OAAA,EAAA,EAAA,GACA,GAEA,IAAA,GAAA,EAAA,WAAA,EAAA,QAAA,MACA,GAAA,OAAA,EACA,GAAA,IAIA,GACA,EAAA,KAAA,GAGA,QAAA,sBAAA,EAAA,GAGA,IAAA,GAFA,MAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,EAAA,MACA,IAAA,SACA,YAAA,EAAA,EAAA,MAAA,EAAA,QAAA,QAAA,EAAA,WACA,MACA,KAAA,MACA,IAAA,SACA,IAAA,SACA,IAAA,QAAA,EAAA,MACA,QACA,IAAA,GAAA,SAAA,EAAA,KACA,IAAA,EAAA,EACA,QACA,aAAA,EAAA,GAAA,EAAA,UAAA,EACA,MACA,SACA,QAAA,MAAA,2BAAA,KAAA,UAAA,KAKA,MAAA,GAGA,QAAA,qBAAA,EAAA,GACA,GAAA,KAcA,OAZA,sBAAA,EAAA,GAAA,QAAA,SAAA,GACA,MAAA,IAAA,EAAA,YAAA,GAAA,EAAA,QAAA,YACA,EAAA,QAAA,KAAA,EAAA,EAAA,QACA,EAAA,KAAA,SAKA,EAAA,EAAA,OAAA,YAAA,EAAA,EAAA,MAAA,EAAA,MAAA,EAAA,WACA,EAAA,QAAA,EAAA,EAAA,QAAA,YAGA,EA9+CA,GAAA,YAAA,sBAoBA,QAAA,aAcA,YAAA,OAAA,OAAA,OAAA,SAAA,GACA,MAAA,gBAAA,IAAA,OAAA,MAAA,IAYA,aAAA,gBACA,SAAA,GAAA,MAAA,IACA,SAAA,GACA,GAAA,GAAA,EAAA,SACA,KAAA,EACA,MAAA,EACA,IAAA,GAAA,OAAA,OAAA,EAKA,OAJA,QAAA,oBAAA,GAAA,QAAA,SAAA,GACA,OAAA,eAAA,EAAA,EACA,OAAA,yBAAA,EAAA,MAEA,GAGA,WAAA,aACA,UAAA,gBACA,MAAA,WAAA,IAAA,UAAA,IACA,aAAA,yBACA,oBAAA,MAAA,MAAA,IAAA,aAAA,IACA,KAAA,MAAA,oBAAA,kBAAA,oBAAA,KACA,WAAA,GAAA,QAAA,IAAA,KAAA,KAgBA,wBA0BA,YAsBA,MAAA,IAAA,QAEA,KAAA,UAAA,cACA,aACA,OAAA,EAEA,SAAA,WACA,MAAA,MAAA,KAAA,MAGA,aAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CACA,GAAA,MAAA,EACA,MACA,GAAA,EAAA,KAAA,IAEA,MAAA,IAGA,eAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CAGA,GAFA,IACA,EAAA,EAAA,KAAA,EAAA,MACA,SAAA,GACA,MACA,GAAA,KAIA,uBAAA,WACA,GAAA,GAAA,KAAA,IAAA,SAAA,GACA,MAAA,SAAA,GAAA,KAAA,EAAA,KAAA,IAAA,IAGA,EAAA,GACA,EAAA,KACA,IAAA,iBAEA,KADA,GAAA,GAAA,EACA,EAAA,KAAA,OAAA,EAAA,IAAA,CACA,CAAA,KAAA,GACA,GAAA,EAAA,GACA,GAAA,aAAA,EAAA,WAOA,MALA,IAAA,MAEA,GAAA,EAAA,GAEA,GAAA,YAAA,EAAA,+BACA,GAAA,UAAA,MAAA,IAGA,aAAA,SAAA,EAAA,GACA,IAAA,KAAA,OACA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,EAAA,IAAA,CACA,IAAA,SAAA,GACA,OAAA,CACA,GAAA,EAAA,KAAA,IAGA,MAAA,UAAA,IAGA,EAAA,KAAA,IAAA,GACA,IAHA,IAOA,IAAA,aAAA,GAAA,MAAA,GAAA,qBACA,aAAA,OAAA,EACA,YAAA,aAAA,YAAA,aAAA,YAEA,IAAA,wBAAA,IA8DA,YAYA,OAAA,WAAA,WACA,GAAA,IAAA,UAAA,GACA,GAAA,CAOA,OALA,QAAA,QAAA,EAAA,WACA,cACA,GAAA,IAGA,SAAA,GACA,SAAA,KAAA,GACA,IACA,GAAA,EACA,EAAA,UAAA,EAAA,cAIA,WACA,MAAA,UAAA,GACA,SAAA,KAAA,OAIA,uBAmDA,cACA,oBAmHA,gBAWA,SAAA,EACA,OAAA,EACA,OAAA,EACA,UAAA,EAEA,eAAA,CAWA,UAAA,WACA,KAAA,SAAA,EAAA,GACA,GAAA,KAAA,QAAA,SACA,KAAA,OAAA,oCAOA,OALA,UAAA,MACA,KAAA,UAAA,EACA,KAAA,QAAA,EACA,KAAA,OAAA,OACA,KAAA,WACA,KAAA,QAGA,MAAA,WACA,KAAA,QAAA,SAGA,cAAA,MACA,KAAA,OAAA,OACA,KAAA,cACA,KAAA,OAAA,OACA,KAAA,UAAA,OACA,KAAA,QAAA,SAGA,QAAA,WACA,KAAA,QAAA,QAGA,WAAA,OAGA,QAAA,SAAA,GACA,IACA,KAAA,UAAA,MAAA,KAAA,QAAA,GACA,MAAA,GACA,SAAA,4BAAA,EACA,QAAA,MAAA,+CACA,EAAA,OAAA,MAIA,eAAA,WAEA,MADA,MAAA,OAAA,QAAA,GACA,KAAA,QAIA,IAAA,mBAAA,WACA,YACA,UAAA,mBAAA,EAEA,mBACA,gBAeA,IAAA,6BAAA,EAEA,0BAAA,YAAA,WACA,IAEA,MADA,MAAA,qBACA,EACA,MAAA,IACA,OAAA,KAIA,QAAA,SAAA,OAAA,aAEA,OAAA,SAAA,2BAAA,WACA,IAAA,2BAAA,CAGA,GAAA,0BAEA,WADA,MAAA,mBAIA,IAAA,iBAAA,CAGA,4BAAA,CAEA,IAAA,QAAA,EACA,WAAA,OAEA,GAAA,CACA,SACA,QAAA,aACA,gBACA,YAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,QAAA,OAAA,IAAA,CACA,GAAA,UAAA,QAAA,EACA,UAAA,QAAA,SAGA,SAAA,WACA,YAAA,GAEA,aAAA,KAAA,WAEA,gBACA,YAAA,SACA,uBAAA,QAAA,WAEA,QAAA,0BACA,OAAA,qBAAA,QAEA,4BAAA,KAGA,mBACA,OAAA,SAAA,eAAA,WACA,kBAUA,eAAA,UAAA,cACA,UAAA,SAAA,UAEA,cAAA,EAEA,SAAA,WACA,WACA,KAAA,gBAAA,kBAAA,KAAA,KAAA,OACA,KAAA,cAEA,KAAA,WAAA,KAAA,WAAA,KAAA,SAKA,WAAA,SAAA,GACA,GAAA,GAAA,MAAA,QAAA,QACA,KAAA,GAAA,KAAA,GACA,EAAA,GAAA,EAAA,EAIA,OAFA,OAAA,QAAA,KACA,EAAA,OAAA,EAAA,QACA,GAGA,OAAA,SAAA,GACA,GAAA,GACA,CACA,IAAA,WAAA,CACA,IAAA,EACA,OAAA,CAEA,MACA,EAAA,4BAAA,KAAA,OAAA,EACA,OAEA,GAAA,KAAA,WACA,EAAA,wBAAA,KAAA,OAAA,KAAA,WAGA,OAAA,aAAA,IACA,GAEA,aACA,KAAA,WAAA,KAAA,WAAA,KAAA,SAEA,KAAA,SACA,EAAA,UACA,EAAA,YACA,EAAA,YACA,SAAA,GACA,MAAA,GAAA,OAIA,IAGA,YAAA,WACA,YACA,KAAA,gBAAA,QACA,KAAA,gBAAA,QAEA,KAAA,WAAA,QAIA,QAAA,WACA,KAAA,QAAA,SAGA,WACA,KAAA,gBAAA,SAAA,GAEA,WAAA,QAGA,eAAA,WAMA,MALA,MAAA,gBACA,KAAA,gBAAA,SAAA,GAEA,KAAA,WAAA,KAAA,WAAA,KAAA,QAEA,KAAA,UAUA,cAAA,UAAA,cAEA,UAAA,eAAA,UAEA,cAAA,EAEA,WAAA,SAAA,GACA,MAAA,GAAA,SAGA,OAAA,SAAA,GACA,GAAA,EACA,IAAA,WAAA,CACA,IAAA,EACA,OAAA,CACA,GAAA,oBAAA,KAAA,OAAA,OAEA,GAAA,YAAA,KAAA,OAAA,EAAA,KAAA,OAAA,OACA,KAAA,WAAA,EAAA,KAAA,WAAA,OAGA,OAAA,IAAA,EAAA,QAGA,aACA,KAAA,WAAA,KAAA,WAAA,KAAA,SAEA,KAAA,SAAA,KACA,IANA,KAUA,cAAA,aAAA,SAAA,EAAA,EAAA,GACA,EAAA,QAAA,SAAA,GAGA,IAFA,GAAA,IAAA,EAAA,MAAA,EAAA,QAAA,QACA,EAAA,EAAA,MACA,EAAA,EAAA,MAAA,EAAA,YACA,EAAA,KAAA,EAAA,IACA,GAGA,OAAA,UAAA,OAAA,MAAA,EAAA,MAYA,aAAA,UAAA,cACA,UAAA,SAAA,UAEA,SAAA,WACA,aACA,KAAA,gBAAA,eAAA,KAAA,KAAA,UAEA,KAAA,OAAA,QAAA,IAGA,YAAA,WACA,KAAA,OAAA,OAEA,KAAA,kBACA,KAAA,gBAAA,MAAA,MACA,KAAA,gBAAA,SAIA,gBAAA,SAAA,GACA,KAAA,MAAA,eAAA,KAAA,QAAA,IAGA,OAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,MAEA,OADA,MAAA,OAAA,KAAA,MAAA,aAAA,KAAA,SACA,GAAA,aAAA,KAAA,OAAA,IACA,GAEA,KAAA,SAAA,KAAA,OAAA,KACA,IAGA,SAAA,SAAA,GACA,KAAA,OACA,KAAA,MAAA,aAAA,KAAA,QAAA,KAYA,IAAA,oBAEA,kBAAA,UAAA,cACA,UAAA,SAAA,UAEA,SAAA,WAGA,GAFA,KAAA,OAAA,QAAA,GAEA,WAAA,CAKA,IAAA,GAFA,GACA,GAAA,EACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EAEA,GADA,EAAA,KAAA,UAAA,GACA,IAAA,iBAAA,CACA,GAAA,CACA,OAIA,MAAA,MAAA,gBACA,MACA,MAAA,gBAAA,SAGA,KAAA,gBAAA,aACA,KAAA,gBAAA,cAIA,IACA,KAAA,gBAAA,eAAA,KAAA,OAGA,gBAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EACA,KAAA,UAAA,KAAA,kBACA,KAAA,UAAA,EAAA,GAAA,OAEA,MAAA,UAAA,OAAA,GAGA,YAAA,WACA,KAAA,OAAA,OAEA,KAAA,kBACA,KAAA,gBAAA,MAAA,MACA,KAAA,gBAAA,QAGA,KAAA,mBAGA,QAAA,SAAA,EAAA,GACA,GAAA,KAAA,QAAA,UAAA,KAAA,QAAA,UACA,KAAA,OAAA,iCAEA,MAAA,UAAA,KAAA,EAAA,YAAA,MAAA,EAAA,QAAA,KAGA,YAAA,SAAA,GACA,GAAA,KAAA,QAAA,UAAA,KAAA,QAAA,UACA,KAAA,OAAA,qCAEA,GAAA,KAAA,KAAA,QAAA,MACA,KAAA,UAAA,KAAA,iBAAA,IAGA,WAAA,WACA,GAAA,KAAA,QAAA,OACA,KAAA,OAAA,4BAEA,MAAA,OAAA,UACA,KAAA,mBAGA,YAAA,WACA,GAAA,KAAA,QAAA,UACA,KAAA,OAAA,wCAIA,OAHA,MAAA,OAAA,OACA,KAAA,WAEA,KAAA,QAGA,gBAAA,SAAA,GAEA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EACA,EAAA,KAAA,UAAA,GACA,IAAA,kBACA,KAAA,UAAA,EAAA,GAAA,eAAA,EAAA,IAIA,OAAA,SAAA,EAAA,GAEA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EAAA,CACA,GAAA,GAAA,KAAA,UAAA,EAAA,GACA,EAAA,KAAA,UAAA,GACA,EAAA,IAAA,iBACA,EAAA,iBACA,EAAA,aAAA,EAEA,GACA,KAAA,OAAA,EAAA,GAAA,EAIA,aAAA,EAAA,KAAA,OAAA,EAAA,MAGA,EAAA,MACA,EAAA,EAAA,GAAA,KAAA,OAAA,EAAA,GACA,KAAA,OAAA,EAAA,GAAA,GAGA,MAAA,IAKA,KAAA,SAAA,KAAA,OAAA,EAAA,KAAA,aACA,IALA,KAwBA,kBAAA,WACA,KAAA,SAAA,EAAA,GAKA,MAJA,MAAA,UAAA,EACA,KAAA,QAAA,EACA,KAAA,OACA,KAAA,YAAA,KAAA,YAAA,KAAA,KAAA,kBAAA,OACA,KAAA,QAGA,kBAAA,SAAA,GAEA,GADA,EAAA,KAAA,YAAA,IACA,aAAA,EAAA,KAAA,QAAA,CAEA,GAAA,GAAA,KAAA,MACA,MAAA,OAAA,EACA,KAAA,UAAA,KAAA,KAAA,QAAA,KAAA,OAAA,KAGA,eAAA,WAEA,MADA,MAAA,OAAA,KAAA,YAAA,KAAA,YAAA,kBACA,KAAA,QAGA,QAAA,WACA,MAAA,MAAA,YAAA,WAGA,SAAA,SAAA,GAEA,MADA,GAAA,KAAA,YAAA,IACA,KAAA,qBAAA,KAAA,YAAA,SACA,KAAA,YAAA,SAAA,GADA,QAIA,MAAA,WACA,KAAA,aACA,KAAA,YAAA,QACA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,YAAA,OACA,KAAA,OAAA,OACA,KAAA,YAAA,OACA,KAAA,YAAA,QAIA,IAAA,sBACA,KAAA,EACA,QAAA,EACA,UAAA,EAoBA,UAAA,uBAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,eAAA,EAAA,GACA,EAAA,EAAA,KAAA,SAAA,EAAA,GACA,EAAA,EACA,GACA,EAAA,SAAA,IAeA,OAZA,QAAA,eAAA,EAAA,GACA,IAAA,WAEA,MADA,GAAA,UACA,GAEA,IAAA,SAAA,GAEA,MADA,GAAA,SAAA,GACA,GAEA,cAAA,KAIA,MAAA,WACA,EAAA,QACA,OAAA,eAAA,EAAA,GACA,MAAA,EACA,UAAA,EACA,cAAA,MAyEA,IAAA,YAAA,EACA,YAAA,EACA,SAAA,EACA,YAAA,CAIA,aAAA,WAaA,kBAAA,SAAA,EAAA,EAAA,EACA,EAAA,EAAA,GAOA,IAAA,GALA,GAAA,EAAA,EAAA,EACA,EAAA,EAAA,EAAA,EACA,EAAA,GAAA,OAAA,GAGA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,OAAA,GACA,EAAA,GAAA,GAAA,CAIA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,GAAA,KAAA,OAAA,EAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,EAAA,EAAA,GAAA,EAAA,OACA,CACA,GAAA,GAAA,EAAA,EAAA,GAAA,GAAA,EACA,EAAA,EAAA,GAAA,EAAA,GAAA,CACA,GAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAKA,MAAA,IAMA,kCAAA,SAAA,GAKA,IAJA,GAAA,GAAA,EAAA,OAAA,EACA,EAAA,EAAA,GAAA,OAAA,EACA,EAAA,EAAA,GAAA,GACA,KACA,EAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAKA,GAAA,GAAA,EAAA,CAKA,GAIA,GAJA,EAAA,EAAA,EAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,GAAA,GACA,EAAA,EAAA,GAAA,EAAA,EAIA,GADA,EAAA,EACA,EAAA,EAAA,EAAA,EAEA,EAAA,EAAA,EAAA,EAEA,GAAA,GACA,GAAA,EACA,EAAA,KAAA,aAEA,EAAA,KAAA,aACA,EAAA,GAEA,IACA,KACA,GAAA,GACA,EAAA,KAAA,aACA,IACA,EAAA,IAEA,EAAA,KAAA,UACA,IACA,EAAA,OA9BA,GAAA,KAAA,aACA,QANA,GAAA,KAAA,UACA,GAuCA,OADA,GAAA,UACA,GA2BA,YAAA,SAAA,EAAA,EAAA,EACA,EAAA,EAAA,GACA,GAAA,GAAA,EACA,EAAA,EAEA,EAAA,KAAA,IAAA,EAAA,EAAA,EAAA,EAYA,IAXA,GAAA,GAAA,GAAA,IACA,EAAA,KAAA,aAAA,EAAA,EAAA,IAEA,GAAA,EAAA,QAAA,GAAA,EAAA,SACA,EAAA,KAAA,aAAA,EAAA,EAAA,EAAA,IAEA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,EAEA,EAAA,GAAA,GAAA,EAAA,GAAA,EACA,QAEA,IAAA,GAAA,EAAA,CAEA,IADA,GAAA,GAAA,UAAA,KAAA,GACA,EAAA,GACA,EAAA,QAAA,KAAA,EAAA,KAEA,QAAA,GACA,GAAA,GAAA,EACA,OAAA,UAAA,KAAA,EAAA,GAUA,KAAA,GARA,GAAA,KAAA,kCACA,KAAA,kBAAA,EAAA,EAAA,EACA,EAAA,EAAA,IAEA,EAAA,OACA,KACA,EAAA,EACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,OAAA,EAAA,IACA,IAAA,YACA,IACA,EAAA,KAAA,GACA,EAAA,QAGA,IACA,GACA,MACA,KAAA,aACA,IACA,EAAA,UAAA,KAAA,IAEA,EAAA,aACA,IAEA,EAAA,QAAA,KAAA,EAAA,IACA,GACA,MACA,KAAA,UACA,IACA,EAAA,UAAA,KAAA,IAEA,EAAA,aACA,GACA,MACA,KAAA,aACA,IACA,EAAA,UAAA,KAAA,IAEA,EAAA,QAAA,KAAA,EAAA,IACA,IAQA,MAHA,IACA,EAAA,KAAA,GAEA,GAGA,aAAA,SAAA,EAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,IAAA,KAAA,OAAA,EAAA,GAAA,EAAA,IACA,MAAA,EACA,OAAA,IAGA,aAAA,SAAA,EAAA,EAAA,GAIA,IAHA,GAAA,GAAA,EAAA,OACA,EAAA,EAAA,OACA,EAAA,EACA,EAAA,GAAA,KAAA,OAAA,IAAA,GAAA,IAAA,KACA,GAEA,OAAA,IAGA,iBAAA,SAAA,EAAA,GACA,MAAA,MAAA,YAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EACA,EAAA,SAGA,OAAA,SAAA,EAAA,GACA,MAAA,KAAA,GAIA,IAAA,aAAA,GAAA,YAuJA,QAAA,SAAA,SACA,OAAA,SAAA,QAAA,OACA,OAAA,SAAA,iBAAA,WACA,OAAA,cAAA,cACA,OAAA,cAAA,iBAAA,SAAA,EAAA,GACA,MAAA,aAAA,iBAAA,EAAA,IAGA,OAAA,YAAA,YACA,OAAA,eAAA,eACA,OAAA,aAAA,aACA,OAAA,iBAAA,iBACA,OAAA,KAAA,KACA,OAAA,kBAAA,mBACA,mBAAA,SAAA,QAAA,mBAAA,SAAA,OAAA,OAAA,MAAA,QCxjDA,OAAA,SAAA,OAAA,aAEA,OAAA,SAAA,OAAA,aAEA,SAAA,GAEA,GAAA,GAAA,EAAA,SAEA,UAAA,OAAA,MAAA,GAAA,MAAA,KAAA,QAAA,SAAA,GACA,EAAA,EAAA,MAAA,KACA,EAAA,KAAA,EAAA,EAAA,IAAA,EAAA,KAAA,IAEA,IAAA,GAAA,SAAA,eACA,SAAA,cAAA,6BACA,IAAA,EAEA,IAAA,GAAA,GADA,EAAA,EAAA,WACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,QAAA,EAAA,OACA,EAAA,EAAA,MAAA,EAAA,QAAA,EAIA,GAAA,KACA,EAAA,IAAA,MAAA,KAAA,QAAA,SAAA,GACA,OAAA,SAAA,IAAA,IAMA,EAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,SAEA,EAAA,OADA,WAAA,EAAA,QACA,EAEA,EAAA,SAAA,YAAA,UAAA,iBAGA,EAAA,QAAA,SAAA,iBAAA,UAAA,OAAA,GACA,QAAA,KAAA,mIAMA,EAAA,WACA,OAAA,eAAA,OAAA,iBAAA,UACA,OAAA,eAAA,MAAA,SAAA,EAAA,UAGA,EAAA,UACA,OAAA,YAAA,OAAA,cAAA,UACA,OAAA,YAAA,MAAA,QAAA,EAAA,SAIA,EAAA,MAAA,GACA,UAGA,SAAA,MAAA,QCzDA,OAAA,qBAEA,SAAA,GACA,YAoBA,SAAA,GAAA,GACA,IAAA,EACA,KAAA,IAAA,OAAA,oBAOA,QAAA,GAAA,EAAA,GAIA,MAHA,GAAA,GAAA,QAAA,SAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,MAEA,EAGA,QAAA,GAAA,EAAA,GAaA,MAZA,GAAA,GAAA,QAAA,SAAA,GACA,OAAA,GACA,IAAA,YACA,IAAA,SACA,IAAA,SACA,IAAA,OACA,IAAA,YACA,IAAA,WACA,OAEA,EAAA,EAAA,EAAA,EAAA,EAAA,MAEA,EAGA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,IAAA,GACA,MAAA,GAAA,GASA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,WAAA,OAAA,eAAA,GACA,EAAA,EAAA,IAAA,EACA,IAAA,EACA,MAAA,EAEA,IAAA,GAAA,EAAA,GAEA,EAAA,EAAA,EAGA,OAFA,GAAA,EAAA,EAAA,GAEA,EAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GAAA,GAcA,QAAA,GAAA,GACA,MAAA,aAAA,KAAA,GAGA,QAAA,GAAA,GACA,MAAA,oBAAA,KAAA,GAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,oBAAA,GACA,WAAA,MAAA,MAAA,KAAA,IAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,IAAA,aAAA,EAAA,QACA,SAAA,GAAA,KAAA,KAAA,GAAA,GAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,oBAAA,EACA,gCACA,WAAA,MAAA,MAAA,KAAA,GAAA,MAAA,KAAA,KAAA,YAGA,QAAA,GAAA,EAAA,GACA,IACA,MAAA,QAAA,yBAAA,EAAA,GACA,MAAA,GAIA,MAAA,IAIA,QAAA,GAAA,EAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,sBAAA,KAGA,IAAA,IAGA,EAAA,mBAAA,EAAA,kBAAA,IAAA,CAGA,GAEA,EAAA,iBAAA,EAEA,IACA,GAAA,EADA,EAAA,EAAA,EAAA,EAEA,IAAA,GAAA,kBAAA,GAAA,MACA,EAAA,GAAA,EAAA,OADA,CAKA,GAAA,GAAA,EAAA,EAEA,GADA,EACA,EAAA,sBAAA,GAEA,EAAA,IAEA,EAAA,UAAA,EAAA,OAEA,EADA,EACA,EAAA,sBAAA,GAEA,EAAA,IAGA,EAAA,EAAA,GACA,IAAA,EACA,IAAA,EACA,aAAA,EAAA,aACA,WAAA,EAAA,gBAWA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,SACA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,SACA,GAAA,SAAA,EAAA,IAAA,IAEA,EAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,GAEA,EAAA,EAAA,GACA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,eACA,MAAA,EACA,cAAA,EACA,YAAA,EACA,UAAA,IAGA,EAAA,UAAA,EAGA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,IAAA,EAAA,aACA,EASA,QAAA,GAAA,GACA,GAAA,GAAA,OAAA,eAAA,GAEA,EAAA,EAAA,GACA,EAAA,EAAA,EAGA,OAFA,GAAA,EAAA,EAAA,GAEA,EAGA,QAAA,GAAA,GACA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAEA,GAAA,GAAA,OAAA,OAAA,EAAA,UAIA,OAHA,GAAA,YAAA,EACA,EAAA,UAAA,EAEA,EAaA,QAAA,GAAA,GACA,MAAA,aAAA,GAAA,aACA,YAAA,GAAA,OACA,YAAA,GAAA,OACA,YAAA,GAAA,mBACA,YAAA,GAAA,0BACA,EAAA,uBACA,YAAA,GAAA,sBAGA,QAAA,GAAA,GACA,MAAA,IAAA,YAAA,IACA,YAAA,IACA,YAAA,IACA,YAAA,IACA,YAAA,IACA,YAAA,IACA,YAAA,IACA,GACA,YAAA,IACA,GACA,YAAA,GASA,QAAA,GAAA,GACA,MAAA,QAAA,EACA,MAEA,EAAA,EAAA,IACA,EAAA,kBACA,EAAA,gBAAA,IAAA,EAAA,IAAA,KAQA,QAAA,GAAA,GACA,MAAA,QAAA,EACA,MACA,EAAA,EAAA,IACA,EAAA,MAQA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GAAA,EAAA,GAAA,EAQA,QAAA,GAAA,GACA,MAAA,KAAA,EAAA,GAAA,EAAA,GAAA,EASA,QAAA,GAAA,EAAA,GACA,OAAA,IAEA,EAAA,EAAA,IACA,EAAA,SAAA,GAAA,EAAA,IACA,EAAA,gBAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,UAAA,GACA,IAAA,EACA,cAAA,EACA,YAAA,IAIA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,WACA,MAAA,GAAA,KAAA,KAAA,MAWA,QAAA,GAAA,EAAA,GACA,EAAA,QAAA,SAAA,GACA,EAAA,QAAA,SAAA,GACA,EAAA,UAAA,GAAA,WACA,GAAA,GAAA,EAAA,KACA,OAAA,GAAA,GAAA,MAAA,EAAA,gBA1WA,GAAA,GAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,OAAA,OAAA,MAKA,IAAA,kBAAA,YACA,SAAA,eAAA,UACA,IAAA,EACA,IACA,GAAA,GAAA,GAAA,UAAA,GAAA,eACA,GAAA,IACA,MAAA,GACA,GAAA,EASA,GAAA,GAAA,OAAA,eACA,EAAA,OAAA,oBACA,EAAA,OAAA,wBAmCA,GAAA,OAwBA,IAAA,GAAA,UAAA,KAAA,UAAA,WAIA,GACA,IAAA,aACA,IAAA,aACA,cAAA,EACA,YAAA,GAuJA,EAAA,OAAA,kBACA,EAAA,OAAA,YACA,EAAA,OAAA,MACA,EAAA,OAAA,KACA,EAAA,OAAA,OACA,EAAA,OAAA,MACA,EAAA,OAAA,yBACA,EAAA,OAAA,sBACA,EAAA,OAAA,kBAqHA,GAAA,OAAA,EACA,EAAA,iBAAA,EACA,EAAA,aAAA,EACA,EAAA,iBAAA,EACA,EAAA,wBAAA,EACA,EAAA,UAAA,EACA,EAAA,aAAA,EACA,EAAA,MAAA,EACA,EAAA,qBAAA,EACA,EAAA,MAAA,EACA,EAAA,eAAA,EACA,EAAA,gBAAA,EACA,EAAA,OAAA,EACA,EAAA,OAAA,EACA,EAAA,eAAA,EACA,EAAA,KAAA,EACA,EAAA,aAAA,EACA,EAAA,SAAA,GAEA,OAAA,mBCtYA,SAAA,GACA,YAOA,SAAA,KACA,GAAA,CACA,IAAA,GAAA,EAAA,MAAA,EACA,KACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,KAmBA,QAAA,GAAA,GACA,EAAA,KAAA,GACA,IAEA,GAAA,EACA,EAAA,EAAA,IAlCA,GAGA,GAHA,EAAA,OAAA,iBACA,KACA,GAAA,CAYA,IAAA,EAAA,CACA,GAAA,GAAA,EACA,EAAA,GAAA,GAAA,GACA,EAAA,SAAA,eAAA,EACA,GAAA,QAAA,GAAA,eAAA,IAEA,EAAA,WACA,GAAA,EAAA,GAAA,EACA,EAAA,KAAA,OAIA,GAAA,OAAA,cAAA,OAAA,UAWA,GAAA,kBAAA,GAEA,OAAA,mBC1CA,SAAA,GACA,YAUA,SAAA,KACA,IAEA,EAAA,GACA,GAAA,GAIA,QAAA,KACA,GAAA,CAEA,GAGA,KAAA,GAFA,GAAA,EAAA,QACA,GAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,aACA,GAAA,GACA,EAAA,SACA,EAAA,UAAA,EAAA,GACA,GAAA,SAGA,GAQA,QAAA,GAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EACA,KAAA,WAAA,GAAA,GAAA,SACA,KAAA,aAAA,GAAA,GAAA,SACA,KAAA,gBAAA,KACA,KAAA,YAAA,KACA,KAAA,cAAA,KACA,KAAA,mBAAA,KACA,KAAA,SAAA,KASA,QAAA,GAAA,EAAA,GACA,KAAA,EAAA,EAAA,EAAA,WAAA,CACA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,QAAA,SACA,EAAA,qBAAA,KAKA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,OAAA,GACA,EAAA,EAAA,IAAA,EACA,KAAA,EACA,MACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,WAAA,GACA,EAAA,6BAMA,QAAA,GAAA,EAAA,EAAA,GAMA,IAAA,GAJA,GAAA,OAAA,OAAA,MACA,EAAA,OAAA,OAAA,MAGA,EAAA,EAAA,EAAA,EAAA,EAAA,WAAA,CAEA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAEA,KAAA,IAAA,GAAA,EAAA,YAIA,eAAA,IAAA,EAAA,YAMA,eAAA,GAAA,EAAA,kBACA,OAAA,EAAA,WACA,KAAA,EAAA,gBAAA,QAAA,EAAA,QAKA,kBAAA,IAAA,EAAA,eAIA,cAAA,IAAA,EAAA,WAAA,CAIA,GAAA,GAAA,EAAA,QACA,GAAA,EAAA,MAAA,GAMA,eAAA,GAAA,EAAA,mBACA,kBAAA,GAAA,EAAA,yBACA,EAAA,EAAA,MAAA,EAAA,YAKA,GAAA,IAAA,CAGA,KAAA,GAAA,KAAA,GAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,GAAA,GAAA,EAAA,EAGA,SAAA,IAAA,aAAA,KACA,EAAA,cAAA,EAAA,KACA,EAAA,mBAAA,EAAA,WAIA,EAAA,aACA,EAAA,WAAA,EAAA,YAGA,EAAA,eACA,EAAA,aAAA,EAAA,cAGA,EAAA,kBACA,EAAA,gBAAA,EAAA,iBAGA,EAAA,cACA,EAAA,YAAA,EAAA,aAGA,SAAA,EAAA,KACA,EAAA,SAAA,EAAA,IAGA,EAAA,SAAA,KAAA,GAEA,GAAA,EAGA,GACA,IASA,QAAA,GAAA,GAqBA,GApBA,KAAA,YAAA,EAAA,UACA,KAAA,UAAA,EAAA,QAQA,KAAA,WAJA,cAAA,MACA,qBAAA,IAAA,mBAAA,MAGA,EAAA,YAFA,EAQA,KAAA,cADA,yBAAA,MAAA,iBAAA,KACA,IAEA,EAAA,eAGA,KAAA,aACA,EAAA,mBAAA,mBAAA,MAEA,KAAA,eAAA,EAAA,sBACA,KAAA,IAAA,UAMA,IAHA,KAAA,gBAAA,EAAA,cACA,KAAA,oBAAA,EAAA,kBACA,KAAA,wBAAA,EAAA,sBACA,mBAAA,GAAA,CACA,GAAA,MAAA,EAAA,iBACA,gBAAA,GAAA,gBACA,KAAA,IAAA,UAEA,MAAA,gBAAA,EAAA,KAAA,EAAA,qBAEA,MAAA,gBAAA,KAWA,QAAA,GAAA,GACA,KAAA,UAAA,EACA,KAAA,UACA,KAAA,YACA,KAAA,OAAA,EAGA,EAAA,KAAA,MAiEA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,SAAA,EACA,KAAA,OAAA,EACA,KAAA,QAAA,EACA,KAAA,0BAzTA,GAAA,GAAA,EAAA,kBACA,EAAA,EAAA,aACA,EAAA,EAAA,SAEA,EAAA,GAAA,SACA,KACA,GAAA,EAgLA,EAAA,MAAA,UAAA,MAgDA,EAAA,CAiBA,GAAA,WAEA,QAAA,SAAA,EAAA,GACA,EAAA,EAAA,EAEA,IAGA,GAHA,EAAA,GAAA,GAAA,GAIA,EAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,KAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,WAAA,OACA,EAAA,EAAA,GAEA,EAAA,2BAEA,EAAA,QAAA,EAKA,KACA,EAAA,GAAA,GAAA,KAAA,EAAA,GACA,EAAA,KAAA,GACA,KAAA,OAAA,KAAA,KAKA,WAAA,WACA,KAAA,OAAA,QAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,WAAA,KAAA,CACA,EAAA,OAAA,EAAA,EAGA,UAGA,MACA,KAAA,aAGA,YAAA,WACA,GAAA,GAAA,KAAA,QAEA,OADA,MAAA,YACA,IAkBA,EAAA,WAMA,qBAAA,SAAA,GAGA,GAAA,IAAA,KAAA,OAAA,CAGA,KAAA,uBAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,MAIA,EAAA,KAAA,QAGA,yBAAA,WACA,GAAA,GAAA,KAAA,sBACA,MAAA,yBAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAGA,IAAA,GAFA,GAAA,EAAA,GACA,EAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,KAAA,KAAA,CACA,EAAA,OAAA,EAAA,EAGA,UAOA,EAAA,gBAAA,EACA,EAAA,2BAAA,EACA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,eAAA,GAEA,OAAA,mBC7WA,SAAA,GACA,YAQA,SAAA,GAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EAoBA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,aAAA,EAAA,CACA,EAAA,WAAA,CACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,gBACA,EAAA,WAAA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,EAAA,IAKA,QAAA,GAAA,GACA,GAAA,EAAA,WACA,MAAA,GAAA,UACA,IACA,GADA,EAAA,EAAA,UAMA,OAHA,GADA,EACA,EAAA,GAEA,GAAA,GAAA,EAAA,MACA,EAAA,WAAA,EAtCA,EAAA,WACA,GAAA,YACA,MAAA,MAAA,eAAA,GAAA,SAAA,WACA,EAAA,mBAAA,KAAA,KAAA,MAEA,MAGA,SAAA,SAAA,GACA,KAAA,EAAA,EAAA,EAAA,OACA,GAAA,IAAA,KACA,OAAA,CAEA,QAAA,IA4BA,EAAA,UAAA,EACA,EAAA,aAAA,EACA,EAAA,aAAA,GAEA,OAAA,mBC7DA,SAAA,GACA,YAuBA,SAAA,GAAA,GACA,MAAA,aAAA,GAAA,WAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,SACA,OAAA,YAAA,GAAA,WAAA,EAGA,QAAA,GAAA,GACA,QAAA,EAAA,WAGA,QAAA,GAAA,GACA,GAAA,EACA,OAAA,GAAA,aAAA,EAAA,EAAA,cAAA,EAAA,IAAA,KAIA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,EAAA,OACA,MAAA,GAAA,OAGA,IAAA,EAAA,GACA,MAAA,GAAA,IAAA,EAAA,IAGA,IAAA,GAAA,EAAA,kBAAA,IAAA,EACA,IAAA,EAAA,CAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GAAA,EAAA,EAEA,OAAA,GAAA,GAIA,GAAA,GAAA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,UACA,IAAA,GAAA,EAAA,GAGA,IAAA,GAFA,GAAA,EAAA,eAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,GAAA,SAAA,GACA,MAAA,GAKA,MAAA,GAAA,GAIA,QAAA,GAAA,GAKA,IAJA,GAAA,MACA,EAAA,EACA,KACA,KACA,GAAA,CACA,GAAA,GAAA,IAGA,IAAA,EAAA,GAAA,CACA,EAAA,EAAA,EACA,IAAA,GAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,KAAA,OACA,GAAA,QACA,EAAA,KAAA,EAEA,IAAA,GAAA,EAAA,EAAA,OAAA,EACA,GAAA,MAAA,OAAA,EAAA,cAAA,IACA,EAAA,IACA,EAAA,MAEA,EAAA,EAAA,EAAA,EAAA,GAEA,MAAA,GAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IACA,IAAA,EAAA,EAAA,IACA,MAAA,GAAA,EAEA,OAAA,MAIA,QAAA,GAAA,EAAA,GAEA,IADA,GAAA,MACA,GAAA,CAIA,IAHA,GAAA,MACA,EAAA,EACA,EAAA,OACA,GAAA,CACA,GAAA,GAAA,IACA,IAAA,EAAA,QAGA,GAAA,EAAA,KACA,EAAA,EAAA,GAGA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAAA,OAAA,EACA,GAAA,KAAA,QARA,GAAA,KAAA,EAaA,IAAA,EAAA,EAAA,GACA,MAAA,GAAA,EAAA,OAAA,EAEA,GAAA,IACA,EAAA,MAEA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,GAGA,EADA,EAAA,GACA,EAAA,KAEA,EAAA,YAIA,QAAA,GAAA,GACA,MAAA,GAAA,qBAAA,IAAA,GAGA,QAAA,GAAA,GACA,MAAA,GAAA,GAGA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,KAAA,EAAA,GAGA,QAAA,GAAA,GAEA,EAAA,IAAA,KAEA,EAAA,IAAA,GAAA,GACA,EAAA,EAAA,GAAA,EAAA,EAAA,UAGA,QAAA,GAAA,GACA,OAAA,EAAA,MACA,IAAA,eACA,IAAA,OACA,IAAA,SACA,OAAA,EAEA,OAAA,EAGA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,IAAA,GACA,KAAA,IAAA,OAAA,oBACA,GAAA,IAAA,GAAA,GAGA,EAAA,kBACA,IAAA,GAAA,EAAA,EA0BA,OAlBA,KAAA,EAAA,QACA,EAAA,GAAA,iBAAA,GAAA,UACA,EAAA,IACA,EAAA,QAGA,EAAA,IAAA,EAAA,GAEA,EAAA,EAAA,IACA,EAAA,EAAA,IACA,EAAA,EAAA,GAIA,EAAA,IAAA,EAAA,EAAA,MACA,EAAA,OAAA,EAAA,MACA,EAAA,OAAA,GAEA,EAAA,iBAGA,QAAA,GAAA,EAAA,GAGA,IAAA,GAFA,GAEA,EAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,GAAA,OACA,EAAA,EAAA,GAAA,aACA,IAAA,IAAA,IAGA,EAAA,EAAA,iBACA,EAAA,EAAA,GAAA,EAAA,IACA,OAAA,EAGA,OAAA,EAGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,SACA,OAAA,GAAA,EAAA,GAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GAIA,IAAA,GAFA,GADA,EAAA,EAAA,QAGA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GAAA,OACA,EAAA,EAAA,GAAA,aACA,IAAA,IAAA,EACA,EAAA,EAAA,cACA,CAAA,IAAA,GAAA,EAAA,IAAA,GAGA,QAFA,GAAA,EAAA,eAIA,IAAA,EAAA,EAAA,GAAA,EAAA,GACA,QAIA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,OACA,EAAA,EAAA,cAEA,EAAA,EAAA,IAAA,EACA,KAAA,EACA,OAAA,CAEA,IAAA,iBAAA,GAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,aAMA,IAAA,EAAA,CAIA,GAAA,YAAA,SACA,EAAA,iBAAA,CACA,GAAA,GAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EACA,IAAA,IAAA,EACA,OAAA,MAEA,GAAA,IAEA,GAAA,IAAA,EAAA,IAIA,EAAA,IAAA,EAAA,EACA,IAAA,GAAA,EAAA,KAEA,GAAA,CACA,GAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,EAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,QACA,GAAA,MAIA,MAAA,EAAA,OAAA,IACA,EAAA,SAAA,IAAA,EAAA,iBACA,EAAA,SAAA,IAAA,EAAA,gBAIA,IAMA,GALA,kBAAA,GAAA,QACA,EAAA,QAAA,KAAA,EAAA,GAEA,EAAA,QAAA,YAAA,GAEA,EAAA,IAAA,GACA,OAAA,EAEA,MAAA,GACA,OAAA,QACA,OAAA,QAAA,EAAA,SAEA,QAAA,MAAA,EAAA,EAAA,QAIA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,OACA,GAAA,OAAA,CACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,SACA,EAAA,KAAA,EAAA,IAIA,OAAA,EAAA,IAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,QAAA,EACA,KAAA,QAAA,QAAA,GA6BA,QAAA,GAAA,EAAA,GACA,KAAA,YAAA,KAMA,MAAA,GAAA,EAAA,GAAA,QAAA,EAAA,GALA;GAAA,GAAA,CACA,OAAA,KAAA,iBAAA,EAAA,UAEA,KAAA,KAAA,GADA,GAAA,GAAA,GA+CA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,cAEA,OAAA,OAAA,GACA,eAAA,MAAA,EAAA,EAAA,kBAFA,EAMA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,OAAA,GACA,EAAA,SAAA,EAAA,GACA,MAAA,aAAA,QACA,KAAA,KAAA,GAEA,EAAA,EAAA,EAAA,EAAA,EAAA,IAKA,IAHA,EAAA,UAAA,OAAA,OAAA,EAAA,WACA,GACA,EAAA,EAAA,UAAA,GACA,EAMA,IACA,EAAA,EAAA,EAAA,GAAA,GAAA,SACA,MAAA,GACA,EAAA,EAAA,EACA,SAAA,YAAA,IAGA,MAAA,GAgBA,QAAA,GAAA,EAAA,GACA,MAAA,YACA,UAAA,GAAA,EAAA,UAAA,GACA,IAAA,GAAA,EAAA,KACA,GAAA,GAAA,MAAA,EAAA,YAgCA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GACA,MAAA,IAAA,GAAA,EAAA,EAAA,GAGA,IAAA,GAAA,EAAA,SAAA,YAAA,IACA,EAAA,GAAA,GACA,GAAA,EASA,OARA,QAAA,KAAA,GAAA,QAAA,SAAA,GACA,GAAA,GAAA,MAAA,GAAA,IAAA,GACA,EAAA,GAAA,EAAA,EACA,mBAAA,IACA,EAAA,EAAA,IACA,EAAA,KAAA,KAEA,EAAA,OAAA,GAAA,MAAA,EAAA,GACA,EAqCA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAeA,QAAA,GAAA,GACA,MAAA,kBAAA,IACA,EACA,GAAA,EAAA,YAGA,QAAA,GAAA,GACA,OAAA,GACA,IAAA,kBACA,IAAA,0BACA,IAAA,2BACA,IAAA,wBACA,IAAA,kBACA,IAAA,8BACA,IAAA,iBACA,IAAA,6BACA,IAAA,qBACA,OAAA,EAEA,OAAA,EAUA,QAAA,GAAA,GACA,KAAA,KAAA,EAkBA,QAAA,GAAA,GAGA,MAFA,aAAA,GAAA,aACA,EAAA,EAAA,MACA,EAAA,GAqFA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,IAAA,EAAA,GAAA,SAAA,EAAA,GAAA,OAAA,EACA,OAAA,CAGA,QAAA,EAGA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,WACA,GAAA,EAAA,EAAA,GAAA,GACA,OAAA,CAEA,QAAA,EAMA,QAAA,GAAA,GACA,EAAA,EAAA,IAKA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,kBAIA,KAAA,GAFA,GAAA,EAAA,GAAA,KAAA,EAAA,KAAA,EAAA,IACA,EAAA,EAAA,EAAA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,gBAAA,EACA,MAAA,GAAA,OAEA,MAAA,MAQA,QAAA,GAAA,GACA,MAAA,YACA,GAAA,GAAA,EAAA,IAAA,KACA,OAAA,IAAA,EAAA,IACA,EAAA,GAAA,OAAA,MASA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,MAAA,EACA,OAAA,UAAA,GACA,GAAA,GAAA,EAAA,IAAA,KACA,KACA,EAAA,OAAA,OAAA,MACA,EAAA,IAAA,KAAA,GAGA,IAAA,GAAA,EAAA,EAIA,IAHA,GACA,KAAA,oBAAA,EAAA,EAAA,SAAA,GAEA,kBAAA,GAAA,CACA,GAAA,GAAA,SAAA,GACA,GAAA,GAAA,EAAA,KAAA,KAAA,EACA,MAAA,EACA,EAAA,iBACA,mBAAA,GAAA,gBAAA,KACA,EAAA,YAAA,GAKA,MAAA,iBAAA,EAAA,GAAA,GACA,EAAA,IACA,MAAA,EACA,QAAA,KA5xBA,GAAA,GAAA,EAAA,wBACA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,SAGA,GADA,GAAA,SACA,GAAA,UACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,QAoUA,GAAA,WACA,OAAA,SAAA,GACA,MAAA,MAAA,UAAA,EAAA,SAAA,KAAA,OAAA,EAAA,MACA,KAAA,UAAA,EAAA,SAEA,GAAA,WACA,MAAA,QAAA,KAAA,SAEA,OAAA,WACA,KAAA,QAAA,MAIA,IAAA,IAAA,OAAA,KACA,IAAA,UAAA,mBACA,aAAA,EAGA,aAAA,GAmBA,EAAA,WACA,GAAA,UACA,MAAA,GAAA,IAAA,OAEA,GAAA,iBACA,MAAA,GAAA,IAAA,OAEA,GAAA,cACA,MAAA,GAAA,IAAA,OAEA,GAAA,QACA,GAAA,GAAA,GAAA,GAAA,SACA,EAAA,EAAA,IAAA,KACA,IAAA,EAAA,CAKA,IAAA,GAJA,GAAA,EACA,EAAA,EAAA,OAAA,EACA,EAAA,EAAA,EAAA,IAAA,OAEA,EAAA,EAAA,GAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,GAAA,cACA,EAAA,EAAA,EACA,GAAA,SAAA,KAEA,IAAA,GAAA,YAAA,GAAA,QACA,EAAA,KAAA,GAGA,EAAA,OAAA,EAEA,MAAA,IAEA,gBAAA,WACA,EAAA,IAAA,MAAA,IAEA,yBAAA,WACA,EAAA,IAAA,MAAA,GACA,EAAA,IAAA,MAAA,KAGA,EAAA,GAAA,EAAA,SAAA,YAAA,SAqCA,IAAA,IAAA,EAAA,UAAA,GACA,GAAA,EAAA,cAAA,GAEA,IACA,GAAA,iBACA,GAAA,GAAA,EAAA,IAAA,KAEA,OAAA,UAAA,EACA,EACA,EAAA,EAAA,MAAA,iBAYA,GAAA,GACA,eAAA,EAAA,iBAAA,KACA,IAEA,GAAA,GACA,eAAA,EAAA,iBAAA,IACA,IAEA,GAAA,EAAA,aAAA,GAAA,IACA,GAAA,EAAA,aAAA,GAAA,IAKA,GAAA,OAAA,OAAA,MAEA,GAAA,WACA,IACA,GAAA,QAAA,WAAA,SACA,MAAA,GACA,OAAA,EAEA,OAAA,IAyBA,KAAA,GAAA,CACA,GAAA,IAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,CACA,GAAA,GAAA,GAAA,EACA,GAAA,EAAA,KAAA,GAAA,GAGA,GAAA,GAAA,EAKA,IAAA,SAAA,SAAA,EAAA,YAAA,IACA,GAAA,eAAA,OAAA,MAAA,SACA,GAAA,WAAA,KAAA,KAAA,OAAA,GAAA,SACA,GAAA,cACA,QAAA,EACA,QAAA,EACA,QAAA,EACA,QAAA,EACA,SAAA,EACA,QAAA,EACA,UAAA,EACA,SAAA,EACA,OAAA,EACA,cAAA,MACA,WACA,GAAA,cAAA,cAAA,MAAA,WAKA,GAAA,IAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,eACA,MAAA,MAAA,KAAA,aAEA,GAAA,aAAA,GACA,KAAA,KAAA,YAAA,KAIA,IACA,EAAA,GAAA,EAwBA,IAAA,IAAA,OAAA,YAaA,IACA,mBACA,sBACA,kBAGA,KAAA,QAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,SACA,IAAA,QAAA,SAAA,GACA,OAAA,eAAA,EAAA,EAAA,KAAA,MAAA,EAAA,SAUA,EAAA,WACA,iBAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,KAAA,EAAA,GAAA,CAGA,GAAA,GAAA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,IAAA,KACA,IAAA,GAKA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,OAAA,EAAA,IACA,WANA,MACA,EAAA,IAAA,KAAA,EASA,GAAA,KAAA,EAEA,IAAA,GAAA,EAAA,KACA,GAAA,kBAAA,EAAA,GAAA,KAEA,oBAAA,SAAA,EAAA,EAAA,GACA,EAAA,QAAA,EACA,IAAA,GAAA,EAAA,IAAA,KACA,IAAA,EAAA,CAGA,IAAA,GADA,GAAA,EAAA,GAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,OAAA,GAAA,EAAA,GAAA,UAAA,IACA,IACA,EAAA,GAAA,UAAA,IACA,GAAA,EACA,EAAA,GAAA,UAKA,IAAA,GAAA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,KACA,GAAA,qBAAA,EAAA,GAAA,MAGA,cAAA,SAAA,GAWA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,IAKA,GAAA,IAAA,GAAA,GAIA,EAAA,kBAEA,IAAA,EACA,GAAA,KAAA,KACA,EAAA,aACA,KAAA,iBAAA,EAAA,GAAA,GAGA,KACA,MAAA,GAAA,MAAA,eAAA,GACA,QACA,GACA,KAAA,oBAAA,EAAA,GAAA,MAwBA,IACA,EAAA,GAAA,EAMA,IAAA,IAAA,SAAA,gBAkEA,GAAA,oBAAA,EACA,EAAA,iBAAA,EACA,EAAA,sBAAA,EACA,EAAA,sBAAA,EACA,EAAA,uBAAA,EACA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,YAAA,GACA,EAAA,SAAA,MAAA,EACA,EAAA,SAAA,YAAA,EACA,EAAA,SAAA,WAAA,GACA,EAAA,SAAA,WAAA,GACA,EAAA,SAAA,QAAA,IAEA,OAAA,mBClzBA,SAAA,GACA,YAIA,SAAA,GAAA,EAAA,GACA,OAAA,eAAA,EAAA,GAAA,YAAA,IAGA,QAAA,KACA,KAAA,OAAA,EACA,EAAA,KAAA,UASA,QAAA,GAAA,GACA,GAAA,MAAA,EACA,MAAA,EAEA,KAAA,GADA,GAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IACA,EAAA,GAAA,EAAA,EAAA,GAGA,OADA,GAAA,OAAA,EACA,EAGA,QAAA,GAAA,EAAA,GACA,EAAA,UAAA,GAAA,WACA,MAAA,GAAA,KAAA,KAAA,GAAA,MAAA,KAAA,KAAA,aA9BA,GAAA,GAAA,EAAA,IAUA,GAAA,WACA,KAAA,SAAA,GACA,MAAA,MAAA,KAGA,EAAA,EAAA,UAAA,QAmBA,EAAA,SAAA,SAAA,EACA,EAAA,sBAAA,EACA,EAAA,aAAA,GAEA,OAAA,mBCvCA,SAAA,GACA,YAIA,GAAA,mBAAA,EAAA,aACA,EAAA,SAAA,eAAA,EAAA,SAAA,UAEA,OAAA,mBCRA,SAAA,GACA,YAoBA,SAAA,GAAA,GACA,EAAA,YAAA,IAGA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,EAGA,OAFA,GAAA,GAAA,EACA,EAAA,OAAA,EACA,EAYA,QAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,aACA,aAAA,EACA,gBAAA,EAAA,gBACA,YAAA,EAAA,cAIA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,aACA,aAAA,IAUA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,YAAA,kBAAA,CACA,GAAA,GAAA,EAAA,EAGA,IAAA,CACA,KAAA,GAAA,GAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IACA,EAAA,YAAA,EAAA,IACA,EAAA,GAAA,YAAA,CAEA,IAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,iBAAA,EAAA,EAAA,IAAA,EACA,EAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAQA,OALA,KACA,EAAA,aAAA,EAAA,IACA,IACA,EAAA,iBAAA,EAAA,EAAA,OAAA,IAEA,EAGA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,UAcA,OAbA,IAEA,EAAA,YAAA,GAGA,EAAA,YAAA,EACA,EAAA,iBAAA,EACA,EAAA,aAAA,EACA,IACA,EAAA,aAAA,GACA,IACA,EAAA,iBAAA,GAEA,EAGA,QAAA,GAAA,GACA,GAAA,YAAA,kBACA,MAAA,GAAA,EAEA,IAAA,GAAA,EAAA,GACA,EAAA,EAAA,UAGA,OAFA,IACA,EAAA,EAAA,EAAA,GACA,EAGA,QAAA,GAAA,GAGA,IAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,KAAA,CAIA,OAFA,GAAA,OAAA,EACA,EAAA,EAAA,GACA,EAGA,QAAA,GAAA,GAEA,MAAA,GAIA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,kBAGA,QAAA,GAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GAAA,GAKA,QAAA,GAAA,GACA,EAAA,EAAA,GAAA,GAAA,EAAA,OAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,IAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,WAAA,EAAA,cACA,EAAA,EAAA,aACA,KAAA,EAAA,eACA,EAAA,UAAA,GAGA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,OAAA,CAGA,GAAA,GAAA,EAAA,aAGA,IAAA,IAAA,EAAA,GAAA,cAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,kBAAA,EAAA,GAAA,IAIA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,EACA,IAAA,GAAA,EAAA,MAEA,IAAA,IAAA,EACA,MAAA,GAAA,EAAA,GAGA,KAAA,GADA,GAAA,EAAA,EAAA,cAAA,0BACA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,YAAA,EAAA,EAAA,IAEA,OAAA,GAGA,QAAA,GAAA,GACA,GAAA,SAAA,EAAA,YAEA,IADA,GAAA,GAAA,EAAA,YACA,GAAA,CACA,GAAA,GAAA,CACA,GAAA,EAAA,aACA,EAAA,YAAA,EAAA,iBAAA,EAAA,aAAA,OAGA,EAAA,YAAA,EAAA,WAAA,OAGA,QAAA,GAAA,GACA,GAAA,EAAA,2BAAA,CAEA,IADA,GAAA,GAAA,EAAA,WACA,GAAA,CACA,EAAA,EAAA,aAAA,EACA,IAAA,GAAA,EAAA,YACA,EAAA,EAAA,GACA,EAAA,EAAA,UACA,IACA,EAAA,KAAA,EAAA,GACA,EAAA,iBAAA,EAAA,aACA,EAAA,YAAA,KACA,EAAA,EAEA,EAAA,YAAA,EAAA,WAAA,SAKA,KAHA,GAEA,GAFA,EAAA,EAAA,GACA,EAAA,EAAA,WAEA,GACA,EAAA,EAAA,YACA,EAAA,KAAA,EAAA,GACA,EAAA,EAKA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,UACA,OAAA,IAAA,EAAA,2BAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,WAAA,YAAA,GAOA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,EAMA,IAJA,EAAA,EADA,EACA,EAAA,KAAA,EAAA,EAAA,MAAA,GAEA,EAAA,KAAA,EAAA,MAAA,IAEA,EAAA,CACA,IAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,GAAA,EAAA,GAGA,IAAA,YAAA,GAAA,oBAEA,IAAA,GADA,GAAA,EAAA,QACA,EAAA,EAAA,QAAA,WACA,EACA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,GAAA,EAAA,IAKA,MAAA,GAGA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,EAAA,KAAA,EAAA,GACA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,WACA,GAAA,IAAA,EACA,OAAA,CAEA,QAAA,EAWA,QAAA,GAAA,GACA,EAAA,YAAA,IAEA,EAAA,KAAA,KAAA,GAUA,KAAA,YAAA,OAMA,KAAA,YAAA,OAMA,KAAA,WAAA,OAMA,KAAA,aAAA,OAMA,KAAA,iBAAA,OAEA,KAAA,WAAA,OArUA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,SACA,EAAA,EAAA,UACA,EAAA,EAAA,OACA,EAAA,EAAA,iBACA,EAAA,EAAA,gBACA,EAAA,EAAA,aACA,EAAA,EAAA,UACA,EAAA,EAAA,MACA,EAAA,EAAA,2BACA,EAAA,EAAA,gBACA,EAAA,EAAA,aACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KACA,EAAA,EAAA,aACA,EAAA,EAAA,SAaA,GAAA,EAkNA,EAAA,SAAA,WACA,EAAA,OAAA,KAAA,UAAA,UAsCA,EAAA,OAAA,KAkDA,EAAA,OAAA,iBAEA,GADA,EAAA,UAAA,YAEA,EAAA,UAAA,yBACA,EAAA,EAAA,UAAA,aACA,EAAA,EAAA,UAAA,YACA,EAAA,EAAA,UAAA,aAEA,EAAA,UAAA,KAAA,UAAA,WAEA,EAAA,EACA,SAAA,EAAA,GACA,IACA,EAAA,KAAA,EAAA,GACA,MAAA,GACA,KAAA,YAAA,IACA,KAAA,KAGA,SAAA,EAAA,GACA,EAAA,KAAA,EAAA,GAGA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,YAAA,SAAA,GACA,MAAA,MAAA,aAAA,EAAA,OAGA,aAAA,SAAA,EAAA,GACA,EAAA,EAEA,IAAA,EACA,GACA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,EACA,EAAA,EAAA,KAGA,EAAA,KACA,EAAA,MAGA,GAAA,EAAA,EAAA,aAAA,KAEA,IAAA,GACA,EACA,EAAA,EAAA,gBAAA,KAAA,UAEA,GAAA,KAAA,6BACA,EAAA,EAOA,IAJA,EADA,EACA,EAAA,GAEA,EAAA,EAAA,KAAA,EAAA,GAEA,EACA,EAAA,KAAA,GACA,EAAA,MACA,EAAA,KAAA,KAAA,KAAA,EAAA,GAAA,OACA,CACA,IACA,KAAA,YAAA,EAAA,IACA,IACA,KAAA,WAAA,EAAA,EAAA,OAAA,GAEA,IAAA,GAAA,EAAA,EAAA,WAAA,KAAA,IAGA,GACA,EAAA,KAAA,EACA,EAAA,KAAA,GAAA,GAEA,EAAA,KAAA,GAYA,MARA,GAAA,KAAA,aACA,WAAA,EACA,YAAA,EACA,gBAAA,IAGA,EAAA,EAAA,MAEA,GAGA,YAAA,SAAA,GAEA,GADA,EAAA,GACA,EAAA,aAAA,KAAA,CAIA,IAAA,GAFA,IAAA,EAEA,GADA,KAAA,WACA,KAAA,YAAA,EACA,EAAA,EAAA,YACA,GAAA,IAAA,EAAA,CACA,GAAA,CACA,OAGA,IAAA,EAEA,KAAA,IAAA,OAAA,iBAIA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,YACA,EAAA,EAAA,eAEA,IAAA,KAAA,2BAAA,CAIA,GAAA,GAAA,KAAA,WACA,EAAA,KAAA,UAEA,EAAA,EAAA,UACA,IACA,EAAA,EAAA,GAEA,IAAA,IACA,KAAA,YAAA,GACA,IAAA,IACA,KAAA,WAAA,GACA,IACA,EAAA,aAAA,GACA,IACA,EAAA,iBACA,GAGA,EAAA,iBAAA,EAAA,aACA,EAAA,YAAA,WAEA,GAAA,MACA,EAAA,KAAA,KAAA,EAaA,OAVA,IACA,EAAA,KAAA,aACA,aAAA,EAAA,GACA,YAAA,EACA,gBAAA,IAIA,EAAA,KAAA,GAEA,GAGA,aAAA,SAAA,EAAA,GACA,EAAA,EAEA,IAAA,EAQA,IAPA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,EACA,EAAA,EAAA,IAGA,EAAA,aAAA,KAEA,KAAA,IAAA,OAAA,gBAGA,IAEA,GAFA,EAAA,EAAA,YACA,EAAA,EAAA,gBAGA,GAAA,KAAA,6BACA,EAAA,EA2CA,OAzCA,GACA,EAAA,EAAA,IAEA,IAAA,IACA,EAAA,EAAA,aACA,EAAA,EAAA,EAAA,KAAA,EAAA,IAGA,GAiBA,EAAA,KAAA,GACA,EAAA,MACA,EAAA,KAAA,KAAA,KAAA,EAAA,GACA,KAnBA,KAAA,aAAA,IACA,KAAA,YAAA,EAAA,IACA,KAAA,YAAA,IACA,KAAA,WAAA,EAAA,EAAA,OAAA,IAEA,EAAA,iBAAA,EAAA,aACA,EAAA,YAAA,OAGA,EAAA,YACA,EAAA,KACA,EAAA,WACA,EAAA,KAAA,GACA,IASA,EAAA,KAAA,aACA,WAAA,EACA,aAAA,EAAA,GACA,YAAA,EACA,gBAAA,IAGA,EAAA,GACA,EAAA,EAAA,MAEA,GAQA,gBAAA,WACA,IAAA,GAAA,GAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,mBAIA,cAAA,WACA,MAAA,QAAA,KAAA,YAIA,GAAA,cAEA,MAAA,UAAA,KAAA,YACA,KAAA,YAAA,EAAA,KAAA,KAAA,aAIA,GAAA,cACA,MAAA,UAAA,KAAA,YACA,KAAA,YAAA,EAAA,KAAA,KAAA,aAIA,GAAA,aACA,MAAA,UAAA,KAAA,WACA,KAAA,WAAA,EAAA,KAAA,KAAA,YAIA,GAAA,eACA,MAAA,UAAA,KAAA,aACA,KAAA,aAAA,EAAA,KAAA,KAAA,cAIA,GAAA,mBACA,MAAA,UAAA,KAAA,iBACA,KAAA,iBAAA,EAAA,KAAA,KAAA,kBAGA,GAAA,iBAEA,IADA,GAAA,GAAA,KAAA,WACA,GAAA,EAAA,WAAA,EAAA,cACA,EAAA,EAAA,UAEA,OAAA,IAGA,GAAA,eAIA,IAAA,GADA,GAAA,GACA,EAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,UAAA,EAAA,eACA,GAAA,EAAA,YAGA,OAAA,IAEA,GAAA,aAAA,GACA,GAAA,GAAA,EAAA,KAAA,WAEA,IAAA,KAAA,4BAEA,GADA,EAAA,MACA,KAAA,EAAA,CACA,GAAA,GAAA,KAAA,KAAA,cAAA,eAAA,EACA,MAAA,YAAA,QAGA,GAAA,MACA,KAAA,KAAA,YAAA,CAGA,IAAA,GAAA,EAAA,KAAA,WAEA,GAAA,KAAA,aACA,WAAA,EACA,aAAA,IAGA,EAAA,GACA,EAAA,EAAA,OAGA,GAAA,cAGA,IAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,KAAA,CAGA,OADA,GAAA,OAAA,EACA,GAGA,UAAA,SAAA,GACA,MAAA,GAAA,KAAA,IAGA,SAAA,SAAA,GACA,MAAA,GAAA,KAAA,EAAA,KAGA,wBAAA,SAAA,GAGA,MAAA,GAAA,KAAA,KAAA,KACA,EAAA,KAGA,UAAA,WAMA,IAAA,GAFA,GAEA,EALA,EAAA,EAAA,KAAA,YACA,KACA,EAAA,GAGA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,WAAA,EAAA,UACA,GAAA,EAAA,KAAA,OAEA,GAGA,GAAA,EAAA,KACA,EAAA,KAAA,IAHA,EAAA,EAFA,KAAA,WAAA,IAQA,GAAA,EAAA,SACA,EAAA,MAAA,EACA,aAAA,IAEA,KACA,EAAA,GACA,EAAA,KACA,EAAA,WAAA,QACA,EAAA,YAKA,IAAA,EAAA,SACA,EAAA,MAAA,EACA,EAAA,OAKA,EAAA,EAAA,iBAKA,EAAA,EAAA,EAAA,SAAA,gCACA,GAAA,UAAA,oBACA,GAAA,UAAA,iBACA,EAAA,UAAA,EAAA,OAAA,OAAA,EAAA,WAAA,EAAA,WAEA,EAAA,UAAA,EACA,EAAA,aAAA,EACA,EAAA,eAAA,EACA,EAAA,eAAA,EACA,EAAA,iBAAA,EACA,EAAA,iBAAA,EACA,EAAA,SAAA,KAAA,GAEA,OAAA,mBCvtBA,SAAA,GACA,YAEA,SAAA,GAAA,EAAA,GAEA,IADA,GAAA,GAAA,EAAA,EAAA,kBACA,GAAA,CACA,GAAA,EAAA,QAAA,GACA,MAAA,EAEA,IADA,EAAA,EAAA,EAAA,GAEA,MAAA,EACA,GAAA,EAAA,mBAEA,MAAA,MAGA,QAAA,GAAA,EAAA,EAAA,GAEA,IADA,GAAA,GAAA,EAAA,kBACA,GACA,EAAA,QAAA,KACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,kBAEA,OAAA,GAOA,GAAA,IACA,cAAA,SAAA,GACA,MAAA,GAAA,KAAA,IAEA,iBAAA,SAAA,GACA,MAAA,GAAA,KAAA,EAAA,GAAA,aAIA,GACA,qBAAA,SAAA,GAEA,MAAA,MAAA,iBAAA,IAEA,uBAAA,SAAA,GAEA,MAAA,MAAA,iBAAA,IAAA,IAEA,uBAAA,SAAA,EAAA,GACA,GAAA,MAAA,EACA,MAAA,MAAA,qBAAA,EAKA,KAAA,GAFA,GAAA,GAAA,UACA,EAAA,KAAA,qBAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,eAAA,IACA,EAAA,KAAA,EAAA,GAGA,OADA,GAAA,OAAA,EACA,GAIA,GAAA,uBAAA,EACA,EAAA,mBAAA,GAEA,OAAA,mBCpEA,SAAA,GACA,YAIA,SAAA,GAAA,GACA,KAAA,GAAA,EAAA,WAAA,KAAA,cACA,EAAA,EAAA,WAEA,OAAA,GAGA,QAAA,GAAA,GACA,KAAA,GAAA,EAAA,WAAA,KAAA,cACA,EAAA,EAAA,eAEA,OAAA,GAbA,GAAA,GAAA,EAAA,SAAA,SAgBA,GACA,GAAA,qBACA,MAAA,GAAA,KAAA,aAGA,GAAA,oBACA,MAAA,GAAA,KAAA,YAGA,GAAA,qBAEA,IAAA,GADA,GAAA,EACA,EAAA,KAAA,kBACA,EACA,EAAA,EAAA,mBACA,GAEA,OAAA,IAGA,GAAA,YAGA,IAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,KAAA,kBACA,EACA,EAAA,EAAA,mBACA,EAAA,KAAA,CAGA,OADA,GAAA,OAAA,EACA,GAGA,OAAA,WACA,GAAA,GAAA,KAAA,UACA,IACA,EAAA,YAAA,QAIA,GACA,GAAA,sBACA,MAAA,GAAA,KAAA,cAGA,GAAA,0BACA,MAAA,GAAA,KAAA,kBAIA,GAAA,mBAAA,EACA,EAAA,oBAAA,GAEA,OAAA,mBCtEA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GATA,GAAA,GAAA,EAAA,mBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,gBACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,OAAA,aAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,eACA,MAAA,MAAA,MAEA,GAAA,aAAA,GACA,KAAA,KAAA,GAEA,GAAA,QACA,MAAA,MAAA,KAAA,MAEA,GAAA,MAAA,GACA,GAAA,GAAA,KAAA,KAAA,IACA,GAAA,KAAA,iBACA,SAAA,IAEA,KAAA,KAAA,KAAA,KAIA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,EACA,SAAA,eAAA,KAEA,EAAA,SAAA,cAAA,GACA,OAAA,mBCxCA,SAAA,GACA,YAOA,SAAA,GAAA,GACA,MAAA,KAAA,EAKA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAZA,GAAA,GAAA,EAAA,SAAA,cAEA,GADA,EAAA,gBACA,EAAA,OACA,EAAA,EAAA,gBAMA,EAAA,OAAA,IAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,UAAA,SAAA,GACA,EAAA,EAAA,EACA,IAAA,GAAA,KAAA,IACA,IAAA,EAAA,EAAA,OACA,KAAA,IAAA,OAAA,iBACA,IAAA,GAAA,EAAA,MAAA,EAAA,GACA,EAAA,EAAA,MAAA,EACA,MAAA,KAAA,CACA,IAAA,GAAA,KAAA,cAAA,eAAA,EAGA,OAFA,MAAA,YACA,KAAA,WAAA,aAAA,EAAA,KAAA,aACA,KAIA,EAAA,EAAA,EAAA,SAAA,eAAA,KAEA,EAAA,SAAA,KAAA,GACA,OAAA,mBCrCA,SAAA,GACA,YA6BA,SAAA,GAAA,EAAA,GAEA,GAAA,GAAA,EAAA,UACA,IAAA,GAAA,EAAA,WAAA,CAGA,GAAA,GAAA,EAAA,mBAAA,EACA,GAAA,mBAAA,IACA,EAAA,cAGA,QAAA,GAAA,EAAA,EAAA,GAIA,EAAA,EAAA,cACA,KAAA,EACA,UAAA,KACA,SAAA,IAIA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAsDA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,CACA,QAAA,eAAA,EAAA,GACA,IAAA,WACA,MAAA,MAAA,KAAA,IAEA,IAAA,SAAA,GACA,KAAA,KAAA,GAAA,EACA,EAAA,KAAA,IAEA,cAAA,EACA,YAAA,IAnHA,GAAA,GAAA,EAAA,mBACA,EAAA,EAAA,uBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,oBACA,EAAA,EAAA,mBAEA,GADA,EAAA,sBACA,EAAA,iBACA,EAAA,EAAA,MAEA,GADA,EAAA,MACA,EAAA,iBACA,EAAA,EAAA,SAEA,EAAA,OAAA,QAEA,GACA,UACA,qBACA,oBACA,yBACA,OAAA,SAAA,GACA,MAAA,GAAA,UAAA,KAGA,EAAA,EAAA,GAEA,EAAA,EAAA,UAAA,EA2BA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,iBAAA,WACA,GAAA,GAAA,GAAA,GAAA,WAAA,KACA,MAAA,KAAA,mBAAA,CAEA,IAAA,GAAA,EAAA,mBAAA,KAGA,OAFA,GAAA,aAEA,GAGA,GAAA,cACA,MAAA,MAAA,KAAA,oBAAA,MAGA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,KAAA,aAAA,EACA,MAAA,KAAA,aAAA,EAAA,GACA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,IAGA,gBAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,aAAA,EACA,MAAA,KAAA,gBAAA,GACA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,IAGA,QAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,KAAA,MAIA,EAAA,QAAA,SAAA,GACA,YAAA,IACA,EAAA,UAAA,GAAA,SAAA,GACA,MAAA,MAAA,QAAA,OAKA,EAAA,UAAA,yBACA,EAAA,UAAA,uBACA,EAAA,UAAA,kBAsBA,EAAA,EAAA,UAAA,MACA,EAAA,EAAA,UAAA,YAAA,SAEA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,EACA,SAAA,gBAAA,KAAA,MAIA,EAAA,aAAA,EACA,EAAA,SAAA,QAAA,GACA,OAAA,mBCzIA,SAAA,GACA,YAqBA,SAAA,GAAA,GACA,OAAA,GACA,IAAA,IACA,MAAA,OACA,KAAA,IACA,MAAA,MACA,KAAA,IACA,MAAA,MACA,KAAA,IACA,MAAA,QACA,KAAA,IACA,MAAA,UAIA,QAAA,GAAA,GACA,MAAA,GAAA,QAAA,EAAA,GAGA,QAAA,GAAA,GACA,MAAA,GAAA,QAAA,EAAA,GAGA,QAAA,GAAA,GAEA,IAAA,GADA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,KAAA,CAEA,OAAA,GAkCA,QAAA,GAAA,EAAA,GACA,OAAA,EAAA,UACA,IAAA,MAAA,aAIA,IAAA,GAAA,GAHA,EAAA,EAAA,QAAA,cACA,EAAA,IAAA,EACA,EAAA,EAAA,WACA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,GAAA,IAAA,EAAA,KAAA,KAAA,EAAA,EAAA,OAAA,GAGA,OADA,IAAA,IACA,EAAA,GACA,EAEA,EAAA,EAAA,GAAA,KAAA,EAAA,GAEA,KAAA,MAAA,UACA,GAAA,GAAA,EAAA,IACA,OAAA,IAAA,EAAA,EAAA,WACA,EACA,EAAA,EAEA,KAAA,MAAA,aACA,MAAA,OAAA,EAAA,KAAA,KAEA,SAEA,KADA,SAAA,MAAA,GACA,GAAA,OAAA,oBAIA,QAAA,GAAA,GACA,YAAA,GAAA,sBACA,EAAA,EAAA,QAGA,KAAA,GADA,GAAA,GACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,GAAA,EAAA,EAAA,EAEA,OAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,KACA,GAAA,YAAA,EACA,IAAA,GAAA,EAAA,EAAA,cAAA,cAAA,GACA,GAAA,UAAA,CAEA,KADA,GAAA,GACA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,IAUA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAwFA,QAAA,GAAA,EAAA,GAEA,GAAA,GAAA,EAAA,EAAA,WAAA,GACA,GAAA,UAAA,CAGA,KAFA,GACA,GADA,EAAA,EAAA,SAAA,0BAEA,EAAA,EAAA,YACA,EAAA,YAAA,EAEA,OAAA,GAAA,GAGA,QAAA,GAAA,GACA,MAAA,YAEA,MADA,GAAA,mBACA,KAAA,KAAA,IAIA,QAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAgBA,QAAA,GAAA,GACA,OAAA,eAAA,EAAA,UAAA,GACA,IAAA,EAAA,GACA,IAAA,SAAA,GACA,EAAA,mBACA,KAAA,KAAA,GAAA,GAEA,cAAA,EACA,YAAA,IASA,QAAA,GAAA,GACA,OAAA,eAAA,EAAA,UAAA,GACA,MAAA,WAEA,MADA,GAAA,mBACA,KAAA,KAAA,GAAA,MAAA,KAAA,KAAA,YAEA,cAAA,EACA,YAAA,IAhSA,GAAA,GAAA,EAAA,SAAA,QACA,EAAA,EAAA,aACA,EAAA,EAAA,gBACA,EAAA,EAAA,MACA,EAAA,EAAA,eACA,EAAA,EAAA,iBACA,EAAA,EAAA,gBACA,EAAA,EAAA,iBACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,SAMA,EAAA,cACA,EAAA,eAkCA,EAAA,GACA,OACA,OACA,KACA,MACA,UACA,QACA,KACA,MACA,QACA,SACA,OACA,OACA,QACA,SACA,QACA,QAGA,EAAA,GACA,QACA,SACA,MACA,SACA,UACA,WACA,YACA,aAwDA,EAAA,OAAA,KAAA,UAAA,WAEA,EAAA,OAAA,YACA,EAAA,OAAA,mBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,aACA,MAAA,GAAA,OAEA,GAAA,WAAA,GAOA,GAAA,GAAA,EAAA,KAAA,WAEA,YADA,KAAA,YAAA,EAIA,IAAA,GAAA,EAAA,KAAA,WAEA,MAAA,2BACA,eAAA,GAAA,oBACA,EAAA,KAAA,QAAA,GAEA,EAAA,KAAA,EAAA,KAAA,UAKA,GACA,eAAA,GAAA,oBACA,EAAA,KAAA,QAAA,GAEA,KAAA,KAAA,UAAA,CAGA,IAAA,GAAA,EAAA,KAAA,WAEA,GAAA,KAAA,aACA,WAAA,EACA,aAAA,IAGA,EAAA,GACA,EAAA,EAAA,OAGA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,aAEA,GAAA,WAAA,GACA,GAAA,GAAA,KAAA,UACA,IAAA,EAAA,CACA,EAAA,0BACA,IAAA,GAAA,EAAA,EAAA,EACA,GAAA,aAAA,EAAA,QAIA,mBAAA,SAAA,EAAA,GACA,GAAA,GAAA,CACA,QAAA,OAAA,GAAA,eACA,IAAA,cACA,EAAA,KAAA,WACA,EAAA,IACA,MACA,KAAA,WACA,EAAA,KAAA,WACA,EAAA,KAAA,WACA,MACA,KAAA,aACA,EAAA,KACA,EAAA,KAAA,UACA,MACA,KAAA,YACA,EAAA,KACA,EAAA,IACA,MACA,SACA,OAGA,GAAA,GAAA,EAAA,EAAA,EACA,GAAA,aAAA,EAAA,OA4BA,eACA,aACA,YACA,cACA,eACA,aACA,YACA,cACA,eACA,eACA,QAAA,IAeA,aACA,aACA,QAAA,IAcA,wBACA,iBACA,kBACA,QAAA,GAGA,EAAA,EAAA,EACA,SAAA,cAAA,MAEA,EAAA,SAAA,YAAA,EAGA,EAAA,aAAA,EACA,EAAA,aAAA,GACA,OAAA,mBCtTA,SAAA,GACA,YASA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GARA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,KAEA,EAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,WAAA,WACA,GAAA,GAAA,KAAA,KAAA,WAAA,MAAA,KAAA,KAAA,UACA,OAAA,IAAA,EAAA,MAIA,EAAA,EAAA,EACA,SAAA,cAAA,WAEA,EAAA,SAAA,kBAAA,GACA,OAAA,mBC1BA,SAAA,GACA,YAQA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAPA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,OAAA,kBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,UACA,MAAA,MAAA,aAAA,WAEA,GAAA,QAAA,GACA,KAAA,aAAA,SAAA,IAGA,aAAA,SAAA,EAAA,GACA,EAAA,UAAA,aAAA,KAAA,KAAA,EAAA,GACA,WAAA,OAAA,GAAA,eACA,KAAA,0BAAA,MAQA,GACA,EAAA,EAAA,GAEA,EAAA,SAAA,mBAAA,GACA,OAAA,mBCpCA,SAAA,GACA,YASA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAOA,QAAA,GAAA,EAAA,GACA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAGA,IAAA,GAAA,EAAA,SAAA,cAAA,OACA,GAAA,KAAA,KAAA,GACA,EAAA,EAAA,MAEA,SAAA,IACA,EAAA,MAAA,GACA,SAAA,IACA,EAAA,OAAA,GA5BA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,OAAA,gBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,EACA,SAAA,cAAA,QAkBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,MAAA,GACA,OAAA,mBCtCA,SAAA,GACA,YAQA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAPA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,cAIA,GACA,EAAA,EAAA,GAEA,EAAA,SAAA,kBAAA,GACA,OAAA,mBCrBA,SAAA,GACA,YAYA,SAAA,GAAA,GACA,IAAA,EAAA,YACA,MAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,KAAA,EAAA,CAIA,IADA,EAAA,EAAA,eAAA,mBAAA,IACA,EAAA,WACA,EAAA,YAAA,EAAA,UAEA,GAAA,IAAA,EAAA,GAEA,MAAA,GAGA,QAAA,GAAA,GAKA,IAHA,GAEA,GAFA,EAAA,EAAA,EAAA,eACA,EAAA,EAAA,EAAA,0BAEA,EAAA,EAAA,YACA,EAAA,YAAA,EAEA,OAAA,GAKA,QAAA,GAAA,GAEA,GADA,EAAA,KAAA,KAAA,IACA,EAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,IAAA,KAAA,EAAA,KA3CA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,GAAA,SACA,EAAA,GAAA,SA8BA,EAAA,OAAA,mBASA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,GAAA,WACA,MAAA,GACA,EAAA,KAAA,KAAA,SACA,EAAA,IAAA,SAOA,GACA,EAAA,EAAA,GAEA,EAAA,SAAA,oBAAA,GACA,OAAA,mBClEA,SAAA,GACA,YAOA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GANA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,gBAEA,EAAA,OAAA,gBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,EACA,SAAA,cAAA,UAEA,EAAA,SAAA,iBAAA,GACA,OAAA,mBCjBA,SAAA,GACA,YASA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAOA,QAAA,GAAA,GACA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAGA,IAAA,GAAA,EAAA,SAAA,cAAA,SACA,GAAA,KAAA,KAAA,GACA,EAAA,EAAA,MAEA,EAAA,aAAA,UAAA,QACA,SAAA,GACA,EAAA,aAAA,MAAA,GA3BA,GAAA,GAAA,EAAA,SAAA,iBACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,OAAA,gBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,EACA,SAAA,cAAA,UAiBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,MAAA,GACA,OAAA,mBCrCA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,MAAA,GAAA,QAAA,OAAA,KAAA,OAGA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAkBA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAGA,IAAA,GAAA,EAAA,SAAA,cAAA,UACA,GAAA,KAAA,KAAA,GACA,EAAA,EAAA,MAEA,SAAA,IACA,EAAA,KAAA,GACA,SAAA,GACA,EAAA,aAAA,QAAA,GACA,KAAA,GACA,EAAA,aAAA,WAAA,IACA,EAAA,SAAA,KAAA,EAhDA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,iBASA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,QACA,MAAA,GAAA,KAAA,cAEA,GAAA,MAAA,GACA,KAAA,YAAA,EAAA,OAAA,KAEA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,SAIA,EAAA,EAAA,EACA,SAAA,cAAA,WAqBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,OAAA,GACA,OAAA,mBC1DA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GATA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,IAAA,SAAA,EAAA,GACA,gBAAA,KACA,EAAA,EAAA,IACA,EAAA,MAAA,IAAA,EAAA,GAAA,IAGA,OAAA,SAAA,GAGA,MAAA,UAAA,MACA,GAAA,UAAA,OAAA,KAAA,OAIA,gBAAA,KACA,EAAA,EAAA,QAEA,GAAA,MAAA,OAAA,KAGA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,SAIA,EAAA,EAAA,EACA,SAAA,cAAA,WAEA,EAAA,SAAA,kBAAA,GACA,OAAA,mBC3CA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,mBAEA,EAAA,OAAA,gBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAEA,cAAA,WACA,MAAA,GAAA,EAAA,MAAA,kBAGA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAEA,YAAA,WACA,MAAA,GAAA,EAAA,MAAA,gBAGA,YAAA,WACA,MAAA,GAAA,EAAA,MAAA,gBAEA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAGA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAEA,YAAA,WACA,MAAA,GAAA,EAAA,MAAA,gBAGA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,OAEA,UAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,UAAA,OAIA,EAAA,EAAA,EACA,SAAA,cAAA,UAEA,EAAA,SAAA,iBAAA,GACA,OAAA,mBCzDA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,mBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,uBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,OAEA,UAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,UAAA,OAIA,EAAA,EAAA,EACA,SAAA,cAAA,UAEA,EAAA,SAAA,wBAAA,GACA,OAAA,mBC7BA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,mBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,mBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAGA,WAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,WAAA,OAIA,EAAA,EAAA,EACA,SAAA,cAAA,OAEA,EAAA,SAAA,oBAAA,GACA,OAAA,mBChCA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,OAAA,EAAA,WACA,IAAA,UACA,MAAA,IAAA,GAAA,EACA,KAAA,SACA,MAAA,IAAA,GAAA,EACA,KAAA,WACA,MAAA,IAAA,GAAA,GAEA,EAAA,KAAA,KAAA,GAlBA,GAAA,GAAA,EAAA,SAAA,mBACA,EAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,kBACA,EAAA,EAAA,SAAA,oBAEA,GADA,EAAA,MACA,EAAA,iBAEA,EAAA,OAAA,kBAaA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,GACA,EAAA,SAAA,mBAAA,GACA,OAAA,mBC1BA,SAAA,GACA,YAEA,IAAA,GAAA,EAAA,eAEA,EAAA,6BACA,EAAA,SAAA,gBAAA,EAAA,SACA,EAAA,EAAA,GACA,EAAA,OAAA,eAAA,EAAA,WAAA,WAEA,GAAA,SAAA,WAAA,GACA,OAAA,mBCXA,SAAA,GACA,YAmBA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAlBA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,cAKA,EAAA,6BACA,EAAA,EAAA,SAAA,gBAAA,EAAA,MACA,EAAA,SAAA,gBAAA,EAAA,OACA,EAAA,EAAA,YACA,EAAA,OAAA,eAAA,EAAA,WACA,EAAA,EAAA,WAMA,GAAA,UAAA,OAAA,OAAA,GAGA,gBAAA,IACA,EAAA,EAAA,WACA,GAAA,gBACA,MAAA,GAAA,EAAA,MAAA,eAEA,GAAA,wBACA,MAAA,GAAA,EAAA,MAAA,yBAKA,EAAA,EAAA,EAAA,GAEA,EAAA,SAAA,cAAA,GACA,OAAA,mBCzCA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,KAEA,EAAA,OAAA,kBACA,KAOA,EAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAEA,GAAA,wBACA,MAAA,GAAA,KAAA,KAAA,uBAIA,GAAA,2BACA,MAAA,GAAA,KAAA,KAAA,0BAIA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAIA,GAAA,cACA,KAAA,IAAA,OAAA,oBAIA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAIA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,YAIA,GAAA,mBACA,MAAA,GAAA,KAAA,KAAA,kBAIA,GAAA,eACA,MAAA,GAAA,KAAA,KAAA,gBAIA,EAAA,EAAA,GAEA,EAAA,SAAA,mBAAA,IACA,OAAA,mBC9DA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,KAAA,KAAA,EATA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,wBAMA,GAAA,EAAA,WACA,GAAA,UACA,MAAA,GAAA,KAAA,KAAA,SAGA,UAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,UAAA,MAAA,KAAA,KAAA,YAGA,cAAA,WAEA,MADA,WAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,cAAA,MAAA,KAAA,KAAA,cAIA,EAAA,EAAA,EACA,SAAA,cAAA,UAAA,WAAA,OAEA,EAAA,SAAA,yBAAA,GACA,OAAA,mBCnCA,SAAA,GACA,YAaA,SAAA,GAAA,GACA,KAAA,KAAA,EAZA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,qBAGA,IAAA,EAAA,CAOA,EAAA,EAAA,WACA,GAAA,UACA,MAAA,GAAA,KAAA,KAAA,SAGA,WAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,WAAA,MAAA,KAAA,KAAA,YAGA,cAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,cAAA,MAAA,KAAA,KAAA,aAQA,IAAA,GAAA,SAAA,KAAA,UAAA,YACA,oBAAA,KAAA,mBAAA,QAEA,GAAA,EAAA,EACA,GAEA,EAAA,SAAA,sBAAA,IACA,OAAA,mBC7CA,SAAA,GACA,YASA,SAAA,GAAA,GACA,KAAA,KAAA,EARA,GAAA,GAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,KAKA,GAAA,WACA,GAAA,kBACA,MAAA,GAAA,KAAA,KAAA,iBAEA,GAAA,gBACA,MAAA,GAAA,KAAA,KAAA,eAEA,GAAA,2BACA,MAAA,GAAA,KAAA,KAAA,0BAEA,SAAA,SAAA,EAAA,GACA,KAAA,KAAA,SAAA,EAAA,GAAA,IAEA,OAAA,SAAA,EAAA,GACA,KAAA,KAAA,OAAA,EAAA,GAAA,IAEA,eAAA,SAAA,GACA,KAAA,KAAA,eAAA,EAAA,KAEA,cAAA,SAAA,GACA,KAAA,KAAA,cAAA,EAAA,KAEA,aAAA,SAAA,GACA,KAAA,KAAA,aAAA,EAAA,KAEA,YAAA,SAAA,GACA,KAAA,KAAA,YAAA,EAAA,KAEA,WAAA,SAAA,GACA,KAAA,KAAA,WAAA,EAAA,KAEA,mBAAA,SAAA,GACA,KAAA,KAAA,mBAAA,EAAA,KAEA,sBAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,sBAAA,EAAA,EAAA,KAEA,gBAAA,WACA,MAAA,GAAA,KAAA,KAAA,oBAEA,cAAA,WACA,MAAA,GAAA,KAAA,KAAA,kBAEA,WAAA,SAAA,GACA,KAAA,KAAA,WAAA,EAAA,KAEA,iBAAA,SAAA,GACA,KAAA,KAAA,iBAAA,EAAA,KAEA,WAAA,WACA,MAAA,GAAA,KAAA,KAAA,eAEA,eAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,eAAA,EAAA,GAAA,IAEA,aAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,aAAA,EAAA,GAAA,IAEA,eAAA,SAAA,GACA,MAAA,MAAA,KAAA,eAAA,EAAA,KAEA,SAAA,WACA,MAAA,MAAA,KAAA,aAKA,EAAA,UAAA,2BACA,EAAA,UAAA,yBAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,yBAAA;GAIA,EAAA,OAAA,MAAA,EAAA,SAAA,eAEA,EAAA,SAAA,MAAA,GAEA,OAAA,mBC1FA,SAAA,GACA,YAEA,IAAA,GAAA,EAAA,uBACA,EAAA,EAAA,oBACA,EAAA,EAAA,mBACA,EAAA,EAAA,MACA,EAAA,EAAA,eAEA,EAAA,EAAA,SAAA,yBACA,GAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,EAEA,IAAA,GAAA,EAAA,SAAA,cAAA,IAEA,GAAA,SAAA,QAAA,EACA,EAAA,SAAA,iBAAA,GAEA,OAAA,mBCnBA,SAAA,GACA,YAiBA,SAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,KAAA,cAAA,yBACA,GAAA,KAAA,KAAA,GAIA,EAAA,EAAA,MAEA,KAAA,WAAA,GAAA,GAAA,KAAA,EAAA,GAEA,IAAA,GAAA,EAAA,UACA,GAAA,IAAA,KAAA,GAEA,EAAA,IAAA,KAAA,GA5BA,GAAA,GAAA,EAAA,SAAA,iBACA,EAAA,EAAA,UACA,EAAA,EAAA,iBACA,EAAA,EAAA,aACA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,OACA,EAAA,EAAA,aACA,EAAA,EAAA,OAEA,EAAA,GAAA,SACA,EAAA,GAAA,SAEA,EAAA,aAiBA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,aACA,MAAA,GAAA,OAEA,GAAA,WAAA,GACA,EAAA,KAAA,GACA,KAAA,4BAGA,GAAA,mBACA,MAAA,GAAA,IAAA,OAAA,MAGA,GAAA,QACA,MAAA,GAAA,IAAA,OAAA,MAGA,yBAAA,WACA,MAAA,GAAA,IAAA,MAAA,4BAGA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,KAAA,cAAA,EAAA,IAGA,eAAA,SAAA,GACA,MAAA,GAAA,KAAA,GACA,KACA,KAAA,cAAA,QAAA,EAAA,SAIA,EAAA,SAAA,WAAA,GAEA,OAAA,mBCpEA,SAAA,GACA,YAoBA,SAAA,GAAA,GACA,EAAA,iBAAA,EAAA,gBACA,EAAA,aAAA,EAAA,YACA,EAAA,YAAA,EAAA,WAuBA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,GAAA,IAKA,IAHA,EAAA,GACA,EAAA,GAEA,EASA,EAAA,aAAA,IACA,EAAA,YAAA,GAEA,EAAA,iBAAA,EAAA,oBAZA,CACA,EAAA,WAAA,EAAA,UACA,EAAA,YAAA,EAAA,aACA,EAAA,YAAA,EAAA,WAEA,IAAA,GAAA,EAAA,EAAA,UACA,KACA,EAAA,aAAA,EAAA,aAQA,EAAA,aAAA,EAAA,GAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,UACA,IAAA,EAAA,CAGA,GAAA,GAAA,EAAA,EACA,GAAA,GAEA,EAAA,kBACA,EAAA,gBAAA,aAAA,GACA,EAAA,cACA,EAAA,YAAA,iBAAA,GAEA,EAAA,YAAA,IACA,EAAA,WAAA,GACA,EAAA,aAAA,IACA,EAAA,YAAA,GAEA,EAAA,YAAA,IAQA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,KAAA,GACA,EAAA,EAAA,EAEA,IAAA,GAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,MACA,EAAA,KAAA,GAGA,QAAA,GAAA,GACA,EAAA,IAAA,MAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAGA,OAFA,IACA,EAAA,IAAA,EAAA,MACA,EAGA,QAAA,GAAA,GAEA,IAAA,GADA,MAAA,EAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,KAAA,CAEA,OAAA,GAUA,QAAA,GAAA,EAAA,EAAA,GAEA,IAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,GAAA,EAAA,IACA,GAAA,EAAA,MAAA,EACA,WAEA,GAAA,EAAA,EAAA,GAoCA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,aAAA,SACA,KAAA,EACA,OAAA,CAIA,IADA,EAAA,EAAA,QACA,EACA,OAAA,CAEA,MAAA,YAAA,IACA,OAAA,CAMA,IAAA,MAAA,GAAA,IAAA,EAAA,UACA,OAAA,CAGA,KAAA,EAAA,KAAA,GACA,OAAA,CAGA,IAAA,MAAA,EAAA,KAAA,EAAA,KAAA,GACA,OAAA,CAEA,KACA,MAAA,GAAA,QAAA,GACA,MAAA,GAEA,OAAA,GAcA,QAAA,KAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,cACA,IAAA,EAAA,OAEA,EAAA,SAGA,KAGA,QAAA,KACA,EAAA,KACA,IAQA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAKA,OAJA,KACA,EAAA,GAAA,GAAA,GACA,EAAA,IAAA,EAAA,IAEA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,GAAA,IACA,OAAA,aAAA,GACA,EACA,KAGA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,MAaA,QAAA,GAAA,GACA,KAAA,MAAA,EACA,KAAA,KAAA,EACA,KAAA,cA8DA,QAAA,GAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EACA,KAAA,uBACA,KAAA,cAAA,GAoOA,QAAA,GAAA,GAEA,MAAA,aAAA,GAGA,QAAA,GAAA,GAEA,MAAA,aAAA,GAGA,QAAA,GAAA,GACA,MAAA,aAAA,GAGA,QAAA,GAAA,GAEA,MAAA,aAAA,GAGA,QAAA,GAAA,GACA,MAAA,GAAA,WAGA,QAAA,GAAA,GAGA,IAAA,GAFA,MAEA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,gBACA,EAAA,KAAA,EAEA,OAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,IAAA,EAAA,GA9lBA,GA4NA,GA5NA,EAAA,EAAA,SAAA,QACA,EAAA,EAAA,SAAA,mBACA,EAAA,EAAA,SAAA,kBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,SAAA,WAEA,GADA,EAAA,OACA,EAAA,cAEA,GADA,EAAA,MACA,EAAA,OACA,EAAA,EAAA,OACA,EAAA,EAAA,KAkFA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SAsDA,EAAA,mBAEA,EAAA,GAAA,QAAA,OACA,OACA,UACA,SACA,UACA,WACA,UACA,gBACA,YACA,iBACA,cACA,mBACA,cACA,aACA,gBACA,eACA,gBACA,KAAA,KAAA,KA4CA,EAAA,EAAA,QACA,wBACA,2BACA,8BACA,eAGA,KA+CA,EAAA,GAAA,YACA,GAAA,OAAA,SAAA,EAAA,GACA,MAAA,GAAA,EAAA,QAAA,GAcA,EAAA,WACA,OAAA,SAAA,GACA,GAAA,GAAA,GAAA,GAAA,EAEA,OADA,MAAA,WAAA,KAAA,GACA,GAGA,KAAA,SAAA,GACA,IAAA,KAAA,KAAA,CAcA,IAAA,GAXA,GAAA,KAAA,KAEA,EAAA,KAAA,WAEA,EAAA,EAAA,EAAA,IACA,EAAA,GAAA,GAAA,SAEA,EAAA,EAAA,iBAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAEA,IADA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,MAAA,IACA,IACA,EAAA,KAAA,KAAA,EAIA,KAAA,GADA,GAAA,EAAA,QAAA,OACA,EAAA,EAAA,EAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAAA,KACA,GAAA,IAAA,IACA,EAAA,GAKA,IAAA,GAFA,GAAA,EAAA,WACA,EAAA,EAAA,IAAA,EAAA,EAAA,IACA,EAAA,EAAA,EAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,KACA,EAAA,EAAA,IACA,GAAA,EAAA,EAAA,GAIA,EAAA,IAAA,GAAA,GAEA,EAAA,KAAA,GAGA,GAAA,EAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,KAAA,MAYA,EAAA,WAGA,OAAA,SAAA,GACA,GAAA,KAAA,MAAA,CAGA,KAAA,uBACA,KAAA,iBAEA,IAAA,GAAA,KAAA,KACA,EAAA,EAAA,UAEA,MAAA,cAAA,EAIA,KAAA,GAHA,IAAA,EACA,EAAA,GAAA,GAAA,GAAA,GAEA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,KAAA,WAAA,EAAA,EAAA,GAAA,EAGA,IACA,EAAA,OAEA,KAAA,OAAA,IAGA,GAAA,kBACA,MAAA,GAAA,KAAA,MAAA,UAGA,WAAA,WACA,IAAA,KAAA,MAAA,CAGA,GAFA,KAAA,OAAA,EACA,EAAA,KAAA,MACA,EACA,MACA,GAAA,OAAA,GAAA,EAAA,KAIA,WAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,EAAA,GAAA,CACA,EAAA,EAAA,OAAA,EACA,IAAA,GAAA,EAAA,EACA,GAAA,OAAA,EACA,EAAA,OAAA,OACA,GAAA,GACA,KAAA,qBAAA,EAAA,EAAA,EAAA,GACA,EAAA,GACA,KAAA,2BAAA,EAAA,EAAA,GAEA,KAAA,mBAAA,EAAA,EAAA,EAAA,IAIA,mBAAA,SAAA,EAAA,EAAA,EAAA,GAGA,GAFA,EAAA,EAAA,OAAA,GAEA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,MAAA,EAAA,MACA,EAAA,OAAA,OAEA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,KAAA,WAAA,EAAA,EAAA,EAAA,IAKA,qBAAA,SAAA,EAAA,EAAA,EACA,GACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,OAAA,CACA,KAAA,cAAA,EAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,IAAA,EACA,KAAA,qBAAA,EAAA,EAAA,EAAA,GAEA,KAAA,mBAAA,EAAA,EAAA,EAAA,QAGA,MAAA,sBAAA,EAAA,EAAA,EAEA,MAAA,cAAA,EAAA,aAGA,2BAAA,SAAA,EAAA,EACA,GACA,GAAA,GAAA,EAAA,eACA,IAAA,EAAA,CACA,EAAA,EAAA,GACA,KAAA,cAAA,EAAA,WACA,KAAA,GAAA,GAAA,EAAA,WACA,EACA,EAAA,EAAA,YACA,KAAA,WAAA,EAAA,EAAA,GAAA,OAGA,MAAA,sBAAA,EAAA,EACA,IAIA,sBAAA,SAAA,EAAA,EAAA,GACA,KAAA,cAAA,GACA,KAAA,cAAA,EAAA,WACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,KAAA,mBAAA,EAAA,EAAA,GAAA,IAQA,qBAAA,WACA,KAAA,WAAA,OAAA,OAAA,OAQA,0BAAA,SAAA,GACA,GAAA,EAAA,CAGA,GAAA,GAAA,KAAA,UAGA,SAAA,KAAA,KACA,EAAA,UAAA,GAGA,OAAA,KAAA,KACA,EAAA,IAAA,GAEA,EAAA,QAAA,uBAAA,SAAA,EAAA,GACA,EAAA,IAAA,MAMA,mBAAA,SAAA,GACA,MAAA,MAAA,WAAA,IAIA,WAAA,SAAA,EAAA,GACA,GAAA,GAAA,IAEA,GAAA,EAAA,EACA,SAAA,GACA,EAAA,GACA,EAAA,0BACA,EAAA,aAAA,UAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,UAAA,GAEA,EAAA,EAAA,KACA,EAAA,EAAA,GACA,EAAA,GAAA,YAOA,gBAAA,WAKA,IAAA,GAJA,GAAA,KAAA,KACA,EAAA,EAAA,WACA,KAEA,EAAA,EAAA,WACA,EACA,EAAA,EAAA,YACA,GAAA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,EAEA,IAAA,EAAA,SACA,EAAA,EAAA,IACA,EAAA,KAAA,MAAA,EAAA,OAEA,GAAA,KAAA,EAKA,KADA,GAAA,GAAA,EACA,GAAA,CAUA,GARA,EAAA,OACA,EAAA,EAAA,EAAA,SAAA,GAEA,MADA,GAAA,GACA,IAEA,EAAA,EAEA,KAAA,WAAA,EAAA,GACA,EAAA,CACA,GAAA,GAAA,EAAA,eACA,IAAA,EAEA,CACA,EAAA,EACA,EAAA,EAAA,EACA,UAJA,MAOA,QAKA,cAAA,SAAA,GACA,EAAA,KAAA,uBAAA,OA0DA,EAAA,UAAA,yBAAA,WACA,GAAA,GAAA,KAAA,KAAA,sBACA,OAAA,IACA,EAAA,cACA,IAGA,GAGA,EAAA,UAAA,oBAAA,WAIA,MADA,KACA,EAAA,OAGA,EAAA,UAAA,gBACA,EAAA,UAAA,gBAAA,WAEA,KAAA,0BAEA,IACA,GADA,EAAA,EAAA,KAEA,KACA,EAAA,EAAA,IACA,KAAA,KAAA,uBAAA,EACA,GACA,EAAA,cAGA,EAAA,kBAAA,EACA,EAAA,mBAAA,EACA,EAAA,eAAA,EACA,EAAA,qBAAA,EACA,EAAA,iBAAA,EAGA,EAAA,QACA,aAAA,EACA,OAAA,IAGA,OAAA,mBCjqBA,SAAA,GACA,YAuBA,SAAA,GAAA,GACA,GAAA,OAAA,GAAA,CAIA,GAAA,EAAA,SAAA,GAEA,IAAA,GAAA,SAAA,GAEA,EAAA,KAAA,KAAA,GAEA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,SAIA,EAAA,OAAA,GAAA,EACA,SAAA,cAAA,EAAA,MAAA,EAAA,MACA,EAAA,SAAA,GAAA,GAzCA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,OACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,GACA,oBACA,sBACA,mBACA,oBACA,mBACA,oBACA,oBAEA,oBAEA,sBA0BA,GAAA,QAAA,IAEA,OAAA,mBCjDA,SAAA,GACA,YASA,SAAA,GAAA,GACA,KAAA,KAAA,EARA,CAAA,GAAA,GAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,IAEA,QAAA,UAKA,EAAA,WACA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAEA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,YAEA,SAAA,SAAA,GACA,KAAA,KAAA,SAAA,EAAA,KAEA,SAAA,SAAA,EAAA,GACA,KAAA,KAAA,SAAA,EAAA,GAAA,IAEA,aAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,aAAA,EAAA,GAAA,IAEA,OAAA,SAAA,EAAA,GACA,KAAA,KAAA,OAAA,EAAA,GAAA,IAEA,WAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,WAAA,KAEA,YAAA,SAAA,GACA,KAAA,KAAA,YAAA,EAAA,KAEA,kBAAA,SAAA,GACA,KAAA,KAAA,kBAAA,EAAA,KAEA,SAAA,WACA,MAAA,MAAA,KAAA,aAgBA,EAAA,OAAA,UAAA,EAAA,OAAA,gBAEA,EAAA,SAAA,UAAA,GAEA,OAAA,mBC9DA,SAAA,GACA,YAyBA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GACA,KAAA,WAAA,GAAA,GAAA,KAAA,MAcA,QAAA,GAAA,GACA,GAAA,GAAA,SAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,KAAA,KAAA,aAkBA,QAAA,GAAA,EAAA,GACA,EAAA,KAAA,EAAA,KAAA,EAAA,IACA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,YACA,EAAA,UAAA,EAAA,YACA,YAAA,IACA,EAAA,EAAA,EACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,EAAA,GAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,eACA,IACA,EAAA,UAAA,GAsMA,QAAA,GAAA,GACA,KAAA,KAAA,EAGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,SAAA,eAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,KAAA,KAAA,aAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,SAAA,eAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,MAAA,KAAA,KAAA,YAlSA,GAAA,GAAA,EAAA,uBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,oBACA,EAAA,EAAA,SAAA,UACA,EAAA,EAAA,mBACA,EAAA,EAAA,SAAA,WACA,EAAA,EAAA,UACA,EAAA,EAAA,UACA,EAAA,EAAA,iBACA,EAAA,EAAA,iBACA,EAAA,EAAA,wBACA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,iBACA,EAAA,EAAA,OACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,uBAGA,GAFA,EAAA,aAEA,GAAA,SAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,mBAIA,EAAA,EAAA,QACA,EAAA,EAAA,SAaA,gBACA,yBACA,gBACA,kBACA,cACA,gBACA,cACA,iBACA,kBACA,QAAA,EAEA,IAAA,GAAA,SAAA,UAuBA,EAAA,SAAA,YAqBA,IAnBA,EAAA,EAAA,WACA,UAAA,SAAA,GAIA,MAHA,GAAA,YACA,EAAA,WAAA,YAAA,GACA,EAAA,EAAA,MACA,GAEA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,KAAA,EAAA,IAEA,WAAA,SAAA,EAAA,GACA,MAAA,GAAA,EAAA,EAAA,KAAA,OAEA,aAAA,WAEA,MADA,KACA,GAAA,GAAA,EAAA,KAAA,EAAA,WAIA,SAAA,gBAAA,CACA,GAAA,GAAA,SAAA,eACA,GAAA,UAAA,gBAAA,SAAA,EAAA,GAyEA,QAAA,GAAA,GACA,MAAA,QAOA,KAAA,KAAA,GANA,EACA,SAAA,cAAA,EAAA,GAEA,SAAA,cAAA,GA7EA,GAAA,GAAA,CAYA,IAXA,SAAA,IACA,EAAA,EAAA,UACA,EAAA,EAAA,SAGA,IACA,EAAA,OAAA,OAAA,YAAA,YAKA,EAAA,qBAAA,IAAA,GAEA,KAAA,IAAA,OAAA,oBASA,KAHA,GACA,GADA,EAAA,OAAA,eAAA,GAEA,KACA,KACA,EAAA,EAAA,qBAAA,IAAA,KAGA,EAAA,KAAA,GACA,EAAA,OAAA,eAAA,EAGA,KAAA,EAEA,KAAA,IAAA,OAAA,oBAQA,KAAA,GADA,GAAA,OAAA,OAAA,GACA,EAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IACA,EAAA,OAAA,OAAA,IAQA,kBACA,mBACA,mBACA,4BACA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,EACA,KAEA,EAAA,GAAA,WAGA,EAAA,eAAA,IACA,EAAA,MAEA,EAAA,MAAA,EAAA,MAAA,cAIA,IAAA,IAAA,UAAA,EACA,KACA,EAAA,QAAA,GAYA,EAAA,UAAA,EACA,EAAA,UAAA,YAAA,EAEA,EAAA,iBAAA,IAAA,EAAA,GACA,EAAA,qBAAA,IAAA,EAAA,EAGA,GAAA,KAAA,EAAA,MACA,EAAA,EACA,OAAA,IAGA,GACA,OAAA,cAAA,OAAA,WAEA,oBAMA,GACA,OAAA,gBACA,OAAA,cAAA,OAAA,SACA,OAAA,gBACA,OAAA,kBAEA,cACA,0BACA,WACA,yBACA,uBACA,yBACA,eACA,gBACA,mBACA,cACA,gBACA,OAAA,IAEA,GACA,OAAA,cAAA,OAAA,WAEA,YACA,aACA,WACA,gBACA,yBACA,gBACA,kBACA,cACA,gBACA,cACA,iBACA,mBACA,iBACA,iBAGA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,WACA,GAAA,kBACA,GAAA,GAAA,EAAA,IAAA,KACA,OAAA,GACA,GACA,EACA,GAAA,GAAA,EAAA,MAAA,gBACA,EAAA,IAAA,KAAA,GACA,MAIA,EAAA,OAAA,SAAA,EACA,SAAA,eAAA,mBAAA,KAIA,OAAA,cACA,EAAA,OAAA,aAAA,GAEA,GACA,OAAA,gBACA,OAAA,cAAA,OAAA,SACA,OAAA,kBAqBA,EAAA,EAAA,sBACA,EAAA,EAAA,kBACA,EAAA,EAAA,sBACA,EAAA,EAAA,cAEA,EAAA,OAAA,kBAAA,GAEA,GACA,OAAA,oBAEA,qBACA,iBACA,qBACA,eAGA,EAAA,kBAAA,EACA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,SAAA,GAEA,OAAA,mBC7TA,SAAA,GACA,YAeA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAdA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,UACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,iBACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,OACA,EAAA,OAAA,iBACA,EAAA,OAAA,YAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,UAAA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,QAAA,iBAAA,EAAA,GAAA,IAGA,EAAA,UAAA,aAAA,WACA,MAAA,GAAA,MAAA,QAAA,sBAIA,QAAA,uBACA,QAAA,cAEA,mBAAA,sBAAA,iBAAA,QACA,SAAA,GACA,EAAA,UAAA,GAAA,WACA,GAAA,GAAA,EAAA,MAAA,OACA,OAAA,GAAA,GAAA,MAAA,EAAA,kBAIA,QAAA,KAGA,EAAA,EAAA,WACA,iBAAA,SAAA,EAAA,GAEA,MADA,KACA,EAAA,KAAA,EAAA,MAAA,EAAA,GACA,IAEA,aAAA,WAEA,MADA,KACA,GAAA,GAAA,EAAA,KAAA,EAAA,WAIA,EAAA,EAAA,GAEA,EAAA,SAAA,OAAA,GAEA,OAAA,mBC1DA,SAAA,GACA,YAEA,IAAA,GAAA,EAAA,OAMA,EAAA,OAAA,cAAA,OAAA,UACA,EACA,EAAA,UAAA,YAEA,GAAA,UAAA,aAAA,SAAA,EAAA,EAAA,GACA,EAAA,KAAA,KAAA,EAAA,GAAA,EAAA,KAGA,OAAA,mBCnBA,SAAA,GACA,YAsFA,SAAA,GAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,OAAA,EACA,IAAA,EAAA,CAEA,GAAA,GAAA,SAAA,cAAA,GACA,EAAA,EAAA,WACA,QAAA,GAAA,GA3FA,GAIA,IAJA,EAAA,cAKA,EAAA,oBAKA,KAAA,kBACA,MAAA,mBACA,KAAA,kBACA,KAAA,kBACA,GAAA,gBACA,OAAA,oBACA,OAAA,oBACA,QAAA,0BACA,IAAA,sBAEA,QAAA,qBACA,KAAA,kBACA,SAAA,sBACA,IAAA,iBACA,IAAA,uBACA,IAAA,iBACA,GAAA,mBACA,MAAA,mBACA,SAAA,sBACA,KAAA,kBACA,KAAA,kBACA,MAAA,mBACA,SAAA,sBACA,GAAA,qBACA,KAAA,kBACA,GAAA,gBACA,KAAA,kBACA,OAAA,oBACA,IAAA,mBACA,MAAA,mBACA,OAAA,oBACA,MAAA,mBACA,OAAA,oBACA,GAAA,gBACA,KAAA,kBACA,IAAA,iBACA,QAAA,qBACA,KAAA,kBACA,SAAA,sBACA,KAAA,kBACA,MAAA,mBACA,OAAA,oBACA,GAAA,mBACA,SAAA,sBACA,OAAA,oBACA,OAAA,oBACA,EAAA,uBACA,MAAA,mBACA,IAAA,iBACA,SAAA,sBACA,EAAA,mBACA,OAAA,oBACA,OAAA,oBACA,OAAA,oBACA,OAAA,oBACA,KAAA,kBACA,MAAA,mBACA,MAAA,mBACA,MAAA,0BAKA,SAAA,sBACA,SAAA,sBACA,MAAA,0BACA,KAAA,kBACA,MAAA,mBACA,GAAA,sBACA,MAAA,mBACA,GAAA,mBACA,MAAA,oBAaA,QAAA,KAAA,GAAA,QAAA,GAEA,OAAA,oBAAA,EAAA,UAAA,QAAA,SAAA,GACA,OAAA,GAAA,EAAA,SAAA,MAGA,OAAA,mBCtGA,WAGA,OAAA,KAAA,kBAAA,aACA,OAAA,OAAA,kBAAA,eAkBA,OAAA,eAAA,QAAA,UAAA,mBACA,OAAA,yBAAA,QAAA,UAAA,cAEA,IAAA,GAAA,QAAA,UAAA,gBACA,SAAA,UAAA,iBAAA,WACA,GAAA,GAAA,EAAA,KAAA,KAEA,OADA,gBAAA,YAAA,MACA,GAGA,QAAA,UAAA,uBAAA,QAAA,UAAA,oBCmFA,SAAA,GA0aA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAQA,OAPA,OAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GACA,GAAA,EAAA,YAAA,SAGA,IACA,EAAA,EAAA,QAAA,EAAA,KAEA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,SAAA,cAAA,QAEA,OADA,GAAA,YAAA,EACA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,EACA,UAAA,KAAA,YAAA,EACA,IAAA,KACA,IAAA,EAAA,MAIA,IACA,EAAA,EAAA,MAAA,SACA,MAAA,QAIA,SAAA,KAAA,kBAAA,EAGA,OADA,GAAA,WAAA,YAAA,GACA,EAMA,QAAA,KACA,EAAA,aAAA,EACA,SAAA,KAAA,YAAA,EACA,IAAA,GAAA,EAAA,gBACA,EAAA,EAAA,cAAA,OACA,GAAA,KAAA,SAAA,QACA,EAAA,KAAA,YAAA,GAGA,QAAA,GAAA,GACA,EAAA,aACA,IAEA,SAAA,KAAA,YAAA,GACA,EAAA,EAAA,iBACA,SAAA,KAAA,YAAA,GAMA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CAGA,GAAA,EACA,IAAA,EAAA,MAAA,YAAA,EAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,SAAA,GACA,EAAA,KAAA,YAAA,EAAA,MACA,EAAA,EAAA,MAAA,SACA,EAAA,SAGA,GAAA,EAAA,GACA,EAAA,IAWA,QAAA,GAAA,GACA,GACA,IAAA,YAAA,SAAA,eAAA,IAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,EACA,GAAA,aAAA,EAAA,IACA,EAAA,aAAA,EAAA,IACA,SAAA,KAAA,YAAA,GAQA,QAAA,KAMA,MALA,KACA,EAAA,SAAA,cAAA,SACA,EAAA,aAAA,EAAA,IACA,EAAA,IAAA,GAEA,EAvhBA,GAAA,IACA,eAAA,EACA,YAMA,YAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,YAAA,EAAA,EAAA,GACA,EAAA,KAAA,gBAAA,GACA,EAAA,KAAA,kBAAA,EAAA,GAGA,EAAA,EAAA,GAAA,EACA,GAAA,KAAA,aAAA,EAAA,GAEA,IACA,EAAA,aAAA,GAGA,KAAA,iBAAA,EAAA,IAMA,UAAA,SAAA,EAAA,GACA,MAAA,MAAA,YAAA,EAAA,YAAA,IAMA,YAAA,SAAA,EAAA,GAEA,MADA,GAAA,KAAA,iBAAA,GACA,KAAA,aAAA,EAAA,IAEA,kBAAA,SAAA,EAAA,GACA,MAAA,GACA,EAAA,OAAA,EAAA,IAAA,EAEA,IAEA,gBAAA,SAAA,GACA,MAAA,IAAA,EAAA,QAAA,KAAA,GAEA,YAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,aAAA,EAAA,EAAA,EAQA,OAPA,MAAA,oBAAA,EAAA,WAAA,KAAA,kBAEA,KAAA,aAAA,EAAA,EAAA,YAEA,KAAA,eACA,KAAA,oBAAA,EAAA,GAEA,EAAA,aAEA,aAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,WAAA,YAAA,IAGA,aAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,SAAA,IACA,KAAA,EACA,KAAA,EACA,YAAA,GAEA,EAAA,KAAA,WAAA,EACA,GAAA,WAAA,EACA,EAAA,YAAA,EAAA,UACA,IAAA,GAAA,KAAA,SAAA,EAAA,YAIA,OAHA,KACA,EAAA,YAAA,EAAA,YAAA,OAAA,EAAA,cAEA,GAEA,WAAA,SAAA,GACA,IAAA,EACA,QAEA,IAAA,GAAA,EAAA,iBAAA,QACA,OAAA,OAAA,UAAA,OAAA,KAAA,EAAA,SAAA,GACA,OAAA,EAAA,aAAA,MAGA,oBAAA,SAAA,EAAA,GACA,IAEA,MAAA,UAAA,QAAA,KAAA,EAAA,iBAAA,KACA,SAAA,GACA,EAAA,aAAA,EAAA,MAGA,MAAA,UAAA,QAAA,KAAA,EAAA,iBAAA,YACA,SAAA,GACA,KAAA,oBAAA,EAAA,QAAA,IAEA,QAGA,iBAAA,SAAA,GAEA,MADA,GAAA,KAAA,kCAAA,GACA,KAAA,6BAAA,IAgBA,kCAAA,SAAA,GAMA,MAJA,GAAA,EAAA,QAAA,EAAA,SAAA,EAAA,GAEA,MAAA,GAAA,MAAA,EAAA,IAAA,MAEA,EAAA,QAAA,EAAA,SAAA,EAAA,GACA,MAAA,GAAA,QAkBA,6BAAA,SAAA,GAMA,MAJA,GAAA,EAAA,QAAA,EAAA,SAAA,EAAA,GAEA,MAAA,GAAA,MAAA,EAAA,MAEA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,EAAA,IAAA,QAAA,EAAA,GACA,OAAA,GAAA,KAWA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,gCAAA,EAKA,IAJA,EAAA,KAAA,4BAAA,GACA,EAAA,KAAA,iBAAA,GACA,EAAA,KAAA,wBAAA,GACA,EAAA,KAAA,mBAAA,GACA,EAAA,CACA,GAAA,GAAA,EAAA,IACA,GAAA,EAAA,SAAA,GACA,EAAA,EAAA,WAAA,EAAA,KAKA,MADA,GAAA,EAAA,KAAA,EACA,EAAA,QAgBA,gCAAA,SAAA,GAGA,IADA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,KAAA,IACA,GAAA,EAAA,GAAA,MAAA,EAAA,IAAA,MAEA,MAAA,EAAA,EAAA,KAAA,IACA,GAAA,EAAA,GAAA,QAAA,EAAA,GAAA,IAAA,QAAA,EAAA,GAAA,EAAA,IAAA,MAEA,OAAA,IASA,iBAAA,SAAA,GACA,MAAA,MAAA,iBAAA,EAAA,eACA,KAAA,wBAiBA,wBAAA,SAAA,GACA,MAAA,MAAA,iBAAA,EAAA,sBACA,KAAA,+BAEA,iBAAA,SAAA,EAAA,EAAA,GAEA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GAEA,GADA,EAAA,yBACA,EAAA,CAEA,IAAA,GAAA,GADA,EAAA,EAAA,MAAA,KAAA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,EAAA,OACA,EAAA,KAAA,EAAA,EAAA,EAAA,GAEA,OAAA,GAAA,KAAA,KAEA,MAAA,GAAA,KAIA,6BAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,MAAA,GACA,KAAA,sBAAA,EAAA,EAAA,GAEA,EAAA,EAAA,EAAA,KAAA,EAAA,IAAA,EAAA,GAGA,sBAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,EAAA,QAAA,EAAA,IAAA,GAKA,mBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,cAAA,OAAA,IACA,EAAA,EAAA,QAAA,cAAA,GAAA,IAEA,OAAA,IAGA,WAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAgBA,OAfA,IACA,MAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GACA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,SACA,GAAA,KAAA,cAAA,EAAA,aAAA,EACA,KAAA,eAAA,QACA,GAAA,KAAA,mBAAA,GAAA,WACA,EAAA,OAAA,QAAA,YACA,GAAA,UAAA,EAAA,MAAA,UAAA,OACA,GAAA,KAAA,WAAA,EAAA,SAAA,GACA,GAAA,WACA,EAAA,UACA,GAAA,EAAA,QAAA,SAEA,MAEA,GAEA,cAAA,SAAA,EAAA,EAAA,GACA,GAAA,MAAA,EAAA,EAAA,MAAA,IAUA,OATA,GAAA,QAAA,SAAA,GACA,EAAA,EAAA,OACA,KAAA,qBAAA,EAAA,KACA,EAAA,IAAA,EAAA,MAAA,0BACA,KAAA,yBAAA,EAAA,GACA,KAAA,yBAAA,EAAA,IAEA,EAAA,KAAA,IACA,MACA,EAAA,KAAA,OAEA,qBAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,iBAAA,EACA,QAAA,EAAA,MAAA,IAEA,iBAAA,SAAA,GAEA,MADA,GAAA,EAAA,QAAA,MAAA,OAAA,QAAA,MAAA,OACA,GAAA,QAAA,KAAA,EAAA,IAAA,iBAAA,MAGA,yBAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,iBACA,EAAA,EAAA,QAAA,yBAAA,GACA,EAAA,QAAA,eAAA,EAAA,MAEA,EAAA,IAAA,GAKA,yBAAA,SAAA,EAAA,GACA,EAAA,EAAA,QAAA,mBAAA,KACA,IAAA,IAAA,IAAA,IAAA,IAAA,KACA,EAAA,EACA,EAAA,IAAA,EAAA,GAYA,OAXA,GAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,MAAA,EACA,GAAA,EAAA,IAAA,SAAA,GAEA,GAAA,GAAA,EAAA,OAAA,QAAA,eAAA,GAIA,OAHA,IAAA,EAAA,QAAA,GAAA,GAAA,EAAA,QAAA,GAAA,IACA,EAAA,EAAA,QAAA,kBAAA,KAAA,EAAA,SAEA,IACA,KAAA,KAEA,GAEA,4BAAA,SAAA,GACA,MAAA,GAAA,QAAA,mBAAA,GAAA,QACA,YAAA,IAEA,mBAAA,SAAA,GACA,GAAA,GAAA,EAAA,MAAA,OAIA,GAAA,MAAA,UAAA,EAAA,MAAA,QAAA,MAAA,gBACA,EAAA,EAAA,QAAA,kBAAA,aACA,EAAA,MAAA,QAAA,MAQA,IAAA,GAAA,EAAA,KACA,KAAA,GAAA,KAAA,GACA,YAAA,EAAA,KACA,GAAA,EAAA,cAGA,OAAA,IAEA,oBAAA,SAAA,EAAA,GACA,GAAA,IACA,YAAA,SACA,GAAA,IAEA,MAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GACA,EAAA,YAAA,EAAA,KAAA,KAAA,EAAA,cACA,QAGA,iBAAA,SAAA,EAAA,GACA,EAAA,MAAA,WACA,EAAA,EAAA,GAEA,EAAA,KAMA,EAAA,oCAEA,EAAA,4DACA,EAAA,uEAEA,EAAA,sDACA,EAAA,+DAEA,EAAA,+DACA,EAAA,wEAIA,EAAA,iBAEA,EAAA,oBACA,EAAA,iDAGA,gBAAA,GAAA,QAAA,IAAA,EAAA,EAAA,OACA,sBAAA,GAAA,QAAA,IAAA,EAAA,EAAA,OACA,iBAAA,6BACA,YAAA,YACA,mBAAA,oBAEA,yBAAA,EAAA,iBACA,eAAA,GAAA,QAAA,EAAA,OACA,sBAAA,GAAA,QAAA,EAAA,OACA,eACA,QACA,MACA,cACA,mBACA,YACA,YAyCA,IAAA,GAAA,SAAA,cAAA,SACA,GAAA,MAAA,QAAA,MAsBA,IA2CA,GA3CA,EAAA,UAAA,UAAA,MAAA,UAuCA,EAAA,iBACA,EAAA,qBACA,EAAA,SAaA,IAAA,OAAA,kBAAA,CACA,EAAA,wCACA,IAAA,GAAA,KAAA,UACA,EAAA,EAAA,cAAA,OACA,GAAA,aAAA,IAAA,EAAA,WAAA,IAIA,SAAA,iBAAA,mBAAA,WACA,GAAA,GAAA,EAAA,WAEA,IAAA,OAAA,cAAA,YAAA,UAAA,CACA,GAAA,GAAA,wBACA,EAAA,IACA,EAAA,SAAA,EAAA,GACA,aAAA,SAAA,0BAAA,IAAA,EACA,YAAA,SAAA,yBAAA,IAAA,EAEA,YAAA,OAAA,mBACA,YAAA,OAAA,kBACA,EACA,GACA,KAAA,IAEA,IAAA,GAAA,YAAA,OAAA,YAEA,aAAA,OAAA,aAAA,SAAA,GACA,IAAA,EAAA,GAAA,CAGA,GAAA,GAAA,EAAA,iBAAA,CACA,KAAA,EAAA,aAAA,GAEA,WADA,GAAA,KAAA,KAAA,EAGA,GAAA,YACA,EAAA,EAAA,cAAA,cAAA,SACA,EAAA,YAAA,EAAA,eACA,EAAA,WAAA,EAAA,OAEA,EAAA,aAAA,GAEA,EAAA,YAAA,EAAA,UAAA,GACA,EAAA,gBAAA,EAAA,IACA,EAAA,aAAA,EAAA,IACA,EAAA,IAAA,EAEA,EAAA,aAAA,IAEA,EAAA,aAAA,EACA,EAAA,aAAA,EAAA,GAEA,EAAA,YAAA,IAGA,EAAA,gBAAA,EACA,KAAA,oBAAA,IAGA,IAAA,GAAA,YAAA,OAAA,WACA,aAAA,OAAA,YAAA,SAAA,GACA,MAAA,SAAA,EAAA,WAAA,eAAA,EAAA,KACA,EAAA,aAAA,GACA,EAAA,WAEA,EAAA,KAAA,KAAA,OASA,EAAA,UAAA,GAEA,OAAA,YC5tBA,WAGA,OAAA,gBAAA,OAAA,iBAAA,SAAA,GACA,MAAA,GAAA,SAKA,OAAA,KAAA,OAAA,OAAA,SAAA,GACA,MAAA,IAGA,iBAAA,mBAAA,WACA,GAAA,eAAA,aAAA,EAAA,CACA,GAAA,GAAA,QAAA,UAAA,gBACA,SAAA,UAAA,iBAAA,WACA,GAAA,GAAA,EAAA,KAAA,KAEA,OADA,gBAAA,YAAA,MACA,MAKA,OAAA,gBAAA,SAAA,GAOA,GALA,OAAA,qBAAA,oBAAA,WACA,oBAAA,UAAA,IAIA,EAAA,UAAA,EAAA,SAAA,CAEA,IADA,GAAA,GAAA,SAAA,yBACA,EAAA,YACA,EAAA,YAAA,EAAA,WAEA,GAAA,SAAA,EAEA,MAAA,GAAA,SAAA,EAAA,aCxCA,SAAA,GACA,YA6BA,SAAA,GAAA,GACA,MAAA,UAAA,EAAA,GAGA,QAAA,KACA,EAAA,KAAA,MACA,KAAA,YAAA,EAGA,QAAA,GAAA,GAKA,MAJA,IAAA,GACA,EAAA,KAAA,MAGA,EAAA,cAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,WAAA,EACA,OAAA,GAAA,IACA,IAAA,GAEA,KAAA,GAAA,GAAA,GAAA,GAAA,GAAA,IAAA,QAAA,GAEA,EAEA,mBAAA,GAGA,QAAA,GAAA,GAIA,GAAA,GAAA,EAAA,WAAA,EACA,OAAA,GAAA,IACA,IAAA,GAEA,KAAA,GAAA,GAAA,GAAA,GAAA,IAAA,QAAA,GAEA,EAEA,mBAAA,GAOA,QAAA,GAAA,EAAA,EAAA,GACA,QAAA,GAAA,GACA,EAAA,KAAA,GAGA,GAAA,GAAA,GAAA,eACA,EAAA,EACA,EAAA,GACA,GAAA,EACA,GAAA,EACA,IAEA,GAAA,MAAA,EAAA,EAAA,IAAA,GAAA,GAAA,KAAA,KAAA,YAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,GACA,IAAA,eACA,IAAA,IAAA,EAAA,KAAA,GAGA,CAAA,GAAA,EAIA,CACA,EAAA,kBACA,MAAA,GALA,EAAA,GACA,EAAA,WACA,UALA,GAAA,EAAA,cACA,EAAA,QASA,MAEA,KAAA,SACA,GAAA,GAAA,EAAA,KAAA,GACA,GAAA,EAAA,kBACA,CAAA,GAAA,KAAA,EAkBA,CAAA,GAAA,EAKA,CAAA,GAAA,GAAA,EACA,KAAA,EAEA,GAAA,qCAAA,EACA,MAAA,GARA,EAAA,GACA,EAAA,EACA,EAAA,WACA,UAnBA,GAFA,KAAA,QAAA,EACA,EAAA,GACA,EACA,KAAA,EAEA,GAAA,KAAA,WACA,KAAA,aAAA,GAGA,EADA,QAAA,KAAA,QACA,WACA,KAAA,aAAA,GAAA,EAAA,SAAA,KAAA,QACA,wBACA,KAAA,YACA,wBAEA,cAaA,KAEA,KAAA,cACA,KAAA,GACA,MAAA,IACA,EAAA,SACA,KAAA,GACA,KAAA,UAAA,IACA,EAAA,YAGA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,KAAA,aAAA,EAAA,GAGA,MAEA,KAAA,YACA,GAAA,GAAA,EAAA,EAAA,SAGA,CACA,EAAA,UACA,UAJA,EAAA,mBACA,EAAA,KAAA,KAKA,MAEA,KAAA,wBACA,GAAA,KAAA,GAAA,KAAA,EAAA,EAAA,GAEA,CACA,EAAA,oBAAA,GACA,EAAA,UACA,UAJA,EAAA,0BAMA,MAEA,KAAA,WAIA,GAHA,KAAA,aAAA,EACA,QAAA,KAAA,UACA,KAAA,QAAA,EAAA,SACA,GAAA,EAAA,CACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,EAAA,MACA,MAAA,GACA,GAAA,KAAA,GAAA,MAAA,EACA,MAAA,GACA,EAAA,gCACA,EAAA,qBACA,IAAA,KAAA,EACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,IACA,EAAA,YACA,CAAA,GAAA,KAAA,EAOA,CACA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,IAEA,QAAA,KAAA,UAAA,EAAA,KAAA,IACA,KAAA,GAAA,KAAA,GACA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,KACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,MAAA,OAEA,EAAA,eACA,UAnBA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,EAAA,OACA,KAAA,UAAA,IACA,EAAA,WAgBA,KAEA,KAAA,iBACA,GAAA,KAAA,GAAA,MAAA,EASA,CACA,QAAA,KAAA,UACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,OAEA,EAAA,eACA,UAdA,MAAA,GACA,EAAA,gCAGA,EADA,QAAA,KAAA,QACA,YAEA,0BAUA,MAEA,KAAA,wBACA,GAAA,KAAA,EAEA,CACA,EAAA,sBAAA,GACA,EAAA,0BACA,UAJA,EAAA,wBAMA,MAEA,KAAA,yBAEA,GADA,EAAA,2BACA,KAAA,EAAA,CACA,EAAA,sBAAA,EACA,UAEA,KAEA,KAAA,2BACA,GAAA,KAAA,GAAA,MAAA,EAAA,CACA,EAAA,WACA,UAEA,EAAA,4BAAA,EAEA,MAEA,KAAA,YACA,GAAA,KAAA,EAAA,CACA,IACA,EAAA,mBACA,GAAA,OAEA,GAAA,CACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,KAAA,GAAA,MAAA,GAAA,MAAA,EAKA,GAAA,KAAA,GAAA,OAAA,KAAA,UAAA,CAIA,GAAA,GAAA,EAAA,EACA,QAAA,KAAA,UAAA,KAAA,WAAA,EAAA,KAAA,WAAA,MAJA,MAAA,UAAA,OALA,GAAA,oCAWA,EAAA,OACA,CAAA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,EAAA,CACA,GAAA,EAAA,OACA,EAAA,GACA,EAAA,MACA,UAEA,GAAA,EAEA,KAEA,KAAA,YACA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,EAAA,CACA,GAAA,EAAA,SAAA,EAAA,KAAA,EAAA,KAAA,KAAA,EAAA,IAAA,KAAA,EAAA,GAEA,GAAA,EAAA,OACA,EAAA,uBAEA,KAAA,MAAA,EAAA,KAAA,KAAA,GACA,EAAA,GACA,EAAA,uBANA,EAAA,eAQA,UACA,KAAA,GAAA,MAAA,GAAA,MAAA,EACA,EAAA,oCAEA,GAAA,CAEA,MAEA,KAAA,OACA,IAAA,WACA,GAAA,KAAA,GAAA,EAQA,CAAA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,EAAA,CAIA,GAHA,KAAA,MAAA,EAAA,KAAA,KAAA,GACA,EAAA,GACA,EAAA,sBACA,EACA,KAAA,EAEA,UACA,KAAA,GAAA,MAAA,GAAA,MAAA,GACA,KAAA,EACA,GAAA,EACA,KAAA,IACA,GAAA,GAEA,GAAA,GAEA,EAAA,wCAAA,OAnBA,IAHA,KAAA,MAAA,EAAA,KAAA,KAAA,GACA,EAAA,GACA,EAAA,OACA,YAAA,EACA,KAAA,EAoBA,MAEA,KAAA,OACA,GAAA,QAAA,KAAA,GACA,GAAA,MACA,CAAA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA,GAAA,EAAA,CACA,GAAA,IAAA,EAAA,CACA,GAAA,GAAA,SAAA,EAAA,GACA,IAAA,EAAA,KAAA,WACA,KAAA,MAAA,EAAA,IAEA,EAAA,GAEA,GAAA,EACA,KAAA,EAEA,GAAA,qBACA,UACA,KAAA,GAAA,MAAA,GAAA,MAAA,EACA,EAAA,+BAAA,GAEA,EAAA,KAAA,MAEA,KAEA,KAAA,sBAIA,GAHA,MAAA,GACA,EAAA,6BACA,EAAA,gBACA,KAAA,GAAA,MAAA,EACA,QAEA,MAEA,KAAA,gBACA,GAAA,GAAA,GAAA,KAAA,GAAA,MAAA,IAAA,GAAA,KAAA,GAAA,KAAA,GA6BA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,GAAA,EAAA,QA9BA,CACA,MAAA,GACA,EAAA,mCAEA,IAAA,IACA,EAAA,EAAA,EAAA,kBACA,EAAA,GAEA,MAAA,GACA,KAAA,MAAA,MACA,KAAA,GAAA,MAAA,GACA,KAAA,MAAA,KAAA,KAEA,KAAA,GAAA,KAAA,GAAA,MAAA,EACA,KAAA,MAAA,KAAA,IACA,KAAA,IACA,QAAA,KAAA,SAAA,GAAA,KAAA,MAAA,QAAA,GAAA,EAAA,QAAA,EAAA,KAAA,EAAA,KAAA,KAAA,EAAA,KACA,EAAA,EAAA,GAAA,KAEA,KAAA,MAAA,KAAA,IAEA,EAAA,GACA,KAAA,GACA,KAAA,OAAA,IACA,EAAA,SACA,KAAA,IACA,KAAA,UAAA,IACA,EAAA,YAKA,KAEA,KAAA,QACA,GAAA,KAAA,EAGA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,KAAA,QAAA,EAAA,KAHA,KAAA,UAAA,IACA,EAAA,WAIA,MAEA,KAAA,WACA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,KAAA,WAAA,GAKA,KAIA,QAAA,KACA,KAAA,QAAA,GACA,KAAA,YAAA,GACA,KAAA,UAAA,GACA,KAAA,UAAA,KACA,KAAA,MAAA,GACA,KAAA,MAAA,GACA,KAAA,SACA,KAAA,OAAA,GACA,KAAA,UAAA,GACA,KAAA,YAAA,EACA,KAAA,aAAA,EAKA,QAAA,GAAA,EAAA,GACA,SAAA,GAAA,YAAA,KACA,EAAA,GAAA,GAAA,OAAA,KAEA,KAAA,KAAA,EACA,EAAA,KAAA,KAEA,IAAA,GAAA,EAAA,QAAA,+BAAA,GAGA,GAAA,KAAA,KAAA,EAAA,KAAA,GAzcA,GAAA,IAAA,CACA,KAAA,EAAA,UACA,IACA,GAAA,GAAA,GAAA,KAAA,IAAA,WACA,GAAA,eAAA,EAAA,KACA,MAAA,IAGA,IAAA,EAAA,CAGA,GAAA,GAAA,OAAA,OAAA,KACA,GAAA,IAAA,GACA,EAAA,KAAA,EACA,EAAA,OAAA,GACA,EAAA,KAAA,GACA,EAAA,MAAA,IACA,EAAA,GAAA,GACA,EAAA,IAAA,GAEA,IAAA,GAAA,OAAA,OAAA,KACA,GAAA,OAAA,IACA,EAAA,QAAA,KACA,EAAA,QAAA,KACA,EAAA,UAAA,IA8CA,IAAA,GAAA,OACA,EAAA,WACA,EAAA,mBAoYA,GAAA,WACA,GAAA,QACA,GAAA,KAAA,WACA,MAAA,MAAA,IAEA,IAAA,GAAA,EAMA,QALA,IAAA,KAAA,WAAA,MAAA,KAAA,aACA,EAAA,KAAA,WACA,MAAA,KAAA,UAAA,IAAA,KAAA,UAAA,IAAA,KAGA,KAAA,UACA,KAAA,YAAA,KAAA,EAAA,KAAA,KAAA,IACA,KAAA,SAAA,KAAA,OAAA,KAAA,WAEA,GAAA,MAAA,GACA,EAAA,KAAA,MACA,EAAA,KAAA,KAAA,IAGA,GAAA,YACA,MAAA,MAAA,QAAA,KAEA,GAAA,UAAA,GACA,KAAA,YAEA,EAAA,KAAA,KAAA,EAAA,IAAA,iBAGA,GAAA,QACA,MAAA,MAAA,WAAA,GAAA,KAAA,MACA,KAAA,MAAA,IAAA,KAAA,MAAA,KAAA,OAEA,GAAA,MAAA,IACA,KAAA,YAAA,KAAA,aAEA,EAAA,KAAA,KAAA,EAAA,SAGA,GAAA,YACA,MAAA,MAAA,OAEA,GAAA,UAAA,IACA,KAAA,YAAA,KAAA,aAEA,EAAA,KAAA,KAAA,EAAA,aAGA,GAAA,QACA,MAAA,MAAA,OAEA,GAAA,MAAA,IACA,KAAA,YAAA,KAAA,aAEA,EAAA,KAAA,KAAA,EAAA,SAGA,GAAA,YACA,MAAA,MAAA,WAAA,GAAA,KAAA,YACA,IAAA,KAAA,MAAA,KAAA,KAAA,KAAA,aAEA,GAAA,UAAA,IACA,KAAA,YAAA,KAAA,cAEA,KAAA,SACA,EAAA,KAAA,KAAA,EAAA;EAGA,GAAA,UACA,MAAA,MAAA,aAAA,KAAA,QAAA,KAAA,KAAA,OACA,GAAA,KAAA,QAEA,GAAA,QAAA,IACA,KAAA,YAAA,KAAA,cAEA,KAAA,OAAA,IACA,KAAA,EAAA,KACA,EAAA,EAAA,MAAA,IACA,EAAA,KAAA,KAAA,EAAA,WAGA,GAAA,QACA,MAAA,MAAA,aAAA,KAAA,WAAA,KAAA,KAAA,UACA,GAAA,KAAA,WAEA,GAAA,MAAA,GACA,KAAA,aAEA,KAAA,UAAA,IACA,KAAA,EAAA,KACA,EAAA,EAAA,MAAA,IACA,EAAA,KAAA,KAAA,EAAA,eAIA,EAAA,IAAA,IAEA,QC9iBA,SAAA,GAmBA,QAAA,GAAA,GAEA,IAAA,GADA,GAAA,MACA,EAAA,EAAA,EAAA,UAAA,OAAA,IAAA,CACA,GAAA,GAAA,UAAA,EACA,KACA,IAAA,GAAA,KAAA,GACA,EAAA,EAAA,EAAA,GAEA,MAAA,KAGA,MAAA,GAIA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,EACA,QAAA,eAAA,EAAA,EAAA,GAKA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CACA,GAAA,GAAA,OAAA,yBAAA,EAAA,EACA,OAAA,IAAA,EAAA,OAAA,eAAA,GAAA,IAxCA,SAAA,UAAA,OACA,SAAA,UAAA,KAAA,SAAA,GACA,GAAA,GAAA,KACA,EAAA,MAAA,UAAA,MAAA,KAAA,UAAA,EACA,OAAA,YACA,GAAA,GAAA,EAAA,OAEA,OADA,GAAA,KAAA,MAAA,EAAA,WACA,EAAA,MAAA,EAAA,MAuCA,EAAA,MAAA,GAEA,OAAA,UC5CA,SAAA,GAEA,YAiFA,SAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,gBAAA,GACA,SAAA,cAAA,GAAA,EAAA,WAAA,EAEA,IADA,EAAA,UAAA,EACA,EACA,IAAA,GAAA,KAAA,GACA,EAAA,aAAA,EAAA,EAAA,GAGA,OAAA,GAnFA,GAAA,GAAA,aAAA,UAAA,IACA,EAAA,aAAA,UAAA,MACA,cAAA,UAAA,IAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,UAAA,OAAA,IACA,EAAA,KAAA,KAAA,UAAA,KAGA,aAAA,UAAA,OAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,UAAA,OAAA,IACA,EAAA,KAAA,KAAA,UAAA,KAGA,aAAA,UAAA,OAAA,SAAA,EAAA,GACA,GAAA,UAAA,SACA,GAAA,KAAA,SAAA,IAEA,EAAA,KAAA,IAAA,GAAA,KAAA,OAAA,IAEA,aAAA,UAAA,OAAA,SAAA,EAAA,GACA,GAAA,KAAA,OAAA,GACA,GAAA,KAAA,IAAA,GAKA,IAAA,GAAA,WACA,MAAA,OAAA,UAAA,MAAA,KAAA,OAGA,EAAA,OAAA,cAAA,OAAA,mBAQA,IANA,SAAA,UAAA,MAAA,EACA,EAAA,UAAA,MAAA,EACA,eAAA,UAAA,MAAA,GAIA,OAAA,YAAA,CACA,GAAA,GAAA,KAAA,KAEA,QAAA,aAAA,IAAA,WAAA,MAAA,MAAA,MAAA,IAKA,OAAA,wBACA,OAAA,sBAAA,WACA,GAAA,GAAA,OAAA,6BACA,OAAA,wBAEA,OAAA,GACA,SAAA,GACA,MAAA,GAAA,WACA,EAAA,YAAA,UAGA,SAAA,GACA,MAAA,QAAA,WAAA,EAAA,IAAA,SAKA,OAAA,uBACA,OAAA,qBAAA,WACA,MAAA,QAAA,4BACA,OAAA,yBACA,SAAA,GACA,aAAA,OAwBA,IAAA,MAEA,EAAA,WACA,EAAA,KAAA,WAEA,QAAA,QAAA,EAGA,EAAA,oBAAA,WAIA,MAHA,GAAA,oBAAA,WACA,KAAA,0CAEA,GAMA,OAAA,iBAAA,mBAAA,WACA,OAAA,UAAA,IACA,OAAA,QAAA,WACA,QAAA,MAAA,sIAQA,EAAA,UAAA,GAEA,OAAA,UC1IA,OAAA,gBAAA,OAAA,iBAAA,SAAA,GACA,MAAA,GAAA,SCRA,SAAA,GAEA,EAAA,IAAA,OAAA,aAEA,IAAA,EAEA,QAAA,SAAA,SAAA,EAAA,GACA,IACA,EAAA,OAAA,KAAA,GAAA,sBAAA,MAAA,GACA,EAAA,SAAA,MAAA,GAEA,EAAA,KACA,UAAA,YAGA,EAAA,GAAA,KAAA,SAAA,MAAA,GAGA,IAAA,IACA,kBACA,SACA,WACA,yCACA,cACA,eACA,UACA,cACA,8CACA,8BACA,UACA,cACA,yBACA,UACA,aACA,sBACA,uBACA,6BACA,UACA,aACA,kCACA,sCACA,6BACA,+BACA,8BACA,UACA,eACA,YACA,WACA,uBACA,YACA,4BACA,YACA,WACA,KAAA,MAEA,KAEA,EAAA,WAEA,GAAA,GAAA,EAAA,SAEA,EAAA,EAAA,cAAA,UAEA,GAAA,YAAA,EAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAAA,IAAA,CACA,GAAA,GAAA,EAAA,cAAA,IACA,GAAA,KAAA,IACA,EAAA,YAAA,EAAA,UACA,EAAA,IAAA,EACA,EAAA,QAAA,SAAA,GAEA,IADA,GAAA,GACA,EAAA,OAAA,KAAA,KACA,EAAA,EAAA,KAEA,GAAA,EAAA,QAAA,EAAA,GACA,EAAA,kBAEA,EAAA,YAAA,EAAA,cAAA,OAAA,YAAA,KAIA,EAAA,SAAA,EAAA,GAEA,GAAA,GAAA,EAAA,QAEA,KAEA,IAAA,GAAA,GAAA,CACA,GAAA,KAAA,GAEA,IAEA,EAAA,KAAA,cAAA,SAAA,UACA,QAAA,EAAA,EAAA,EAAA,YAAA,UAGA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,SAEA,GAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,SAAA,GACA,EAAA,SAAA,GACA,MAAA,GAAA,EAAA,WAGA,EAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,GACA,MAAA,EAEA,IAAA,GAAA,GAAA,EACA,IAAA,EAAA,WAAA,IAAA,EAAA,SAAA,CACA,GAAA,GAAA,EAAA,WAAA,cAEA,EAAA,EAAA,EAAA,EAOA,YAAA,IACA,EAAA,EAAA,uBAEA,GAAA,OACA,IAAA,GAAA,EAAA,cACA,GAAA,EAAA,SAAA,GACA,GAAA,EAAA,EAAA,EAAA,WAAA,KAEA,GAAA,GAEA,GAAA,GAAA,KACA,GAAA,aAAA,EAAA,aACA,GAAA,aAEA,CACA,GAAA,GAAA,EAAA,YAAA,MACA,GAAA,EAAA,EAAA,IAAA,EAAA,SAAA,GAEA,MAAA,IAWA,KAEA,EAAA,SAAA,GACA,GAAA,GAAA,YACA,EAAA,EAAA,WAAA,aAcA,OAbA,GAAA,kBAAA,EAAA,YACA,GAAA,iBAAA,EAAA,OACA,wCAAA,EAAA,YACA,EAAA,KAAA,IAEA,GAAA,GAAA,cAEA,EAAA,YACA,EAAA,EAAA,WAAA,SAAA,GACA,GAAA,IAAA,EAAA,MAAA,EAAA,MAAA,KAAA,EAAA,MAAA,IAAA,MAGA,GAAA,aAMA,WAAA,WACA,GAAA,GAAA,OAAA,KAAA,WAAA,IAAA,OAEA,EAAA,EAAA,EACA,GACA,EAAA,EAAA,kBAAA,EAAA,WAAA,IAEA,QAAA,IAAA,sBACA,QAAA,IAAA,QAMA,EAAA,OAAA,GAEA,OAAA,WCtLA,WASA,GAAA,GAAA,SAAA,cAAA,QACA,GAAA,YAAA,kHAQA,IAAA,GAAA,SAAA,cAAA,OACA,GAAA,aAAA,EAAA,EAAA,aAEA,UC1BA,SAAA,GAEA,QAAA,GAAA,EAAA,GAKA,MAJA,GAAA,MACA,EAAA,MACA,GAAA,IAEA,EAAA,MAAA,KAAA,EAAA,IAAA,IAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,EACA,QAAA,UAAA,QACA,IAAA,GACA,MACA,KAAA,GACA,EAAA,IACA,MACA,KAAA,GACA,EAAA,EAAA,MAAA,KACA,MACA,SACA,EAAA,EAAA,EAAA,GAGA,EAAA,GAAA,EAGA,QAAA,GAAA,GACA,MAAA,GAAA,GAKA,QAAA,GAAA,EAAA,GACA,YAAA,iBAAA,WACA,EAAA,EAAA,KAJA,GAAA,KAUA,GAAA,QAAA,EACA,EAAA,OAAA,EACA,EAAA,MAAA,GAEA,QCzCA,SAAA,GAMA,QAAA,GAAA,GACA,EAAA,YAAA,IACA,EAAA,KAAA,GAGA,QAAA,KACA,KAAA,EAAA,QACA,EAAA,UAXA,GAAA,GAAA,EACA,KACA,EAAA,SAAA,eAAA,GAaA,KAAA,OAAA,kBAAA,oBAAA,GACA,QAAA,GAAA,eAAA,IAKA,EAAA,eAAA,GAEA,UCxBA,SAAA,GAmEA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,QAAA,GAEA,OADA,GAAA,EAAA,EAAA,GACA,EAAA,IAAA,EAAA,IAAA,IAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,GAAA,KAAA,EAAA,EACA,OAAA,GAAA,EAAA,MAGA,QAAA,GAAA,GACA,GAAA,GAAA,SAAA,QACA,EAAA,GAAA,KAAA,EAAA,EACA,OAAA,GAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MACA,EAAA,WAAA,EAAA,SACA,EAAA,EAAA,SAAA,EAAA,UAEA,EAKA,QAAA,GAAA,EAAA,GAGA,IAFA,GAAA,GAAA,EAAA,MAAA,KACA,EAAA,EAAA,MAAA,KACA,EAAA,QAAA,EAAA,KAAA,EAAA,IACA,EAAA,QACA,EAAA,OAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IACA,EAAA,QAAA,KAEA,OAAA,GAAA,KAAA,KApGA,GAAA,IACA,WAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,KAAA,kBAAA,EAAA,GACA,KAAA,cAAA,EAAA,EAEA,IAAA,GAAA,EAAA,iBAAA,WACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,SACA,KAAA,WAAA,EAAA,QAAA,IAKA,gBAAA,SAAA,GACA,KAAA,WAAA,EAAA,QAAA,EAAA,cAAA,UAEA,cAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBAAA,QACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,aAAA,EAAA,IAIA,aAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,EAAA,YAAA,KAAA,eAAA,EAAA,YAAA,IAEA,eAAA,SAAA,EAAA,GAEA,MADA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,IAEA,kBAAA,SAAA,EAAA,GACA,EAAA,eAAA,EAAA,iBACA,KAAA,yBAAA,EAAA,EAGA,IAAA,GAAA,GAAA,EAAA,iBAAA,EACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,yBAAA,EAAA,IAIA,yBAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,EAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,WAAA,EACA,IAAA,GAAA,EAAA,OACA,EAAA,MAAA,OAAA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAAA,EAAA,MACA,GAAA,MAAA,OAMA,EAAA,sBACA,EAAA,qCACA,GAAA,OAAA,MAAA,UACA,EAAA,IAAA,EAAA,KAAA,OAAA,IACA,EAAA,QAyCA,GAAA,YAAA,GAEA,UC5GA,SAAA,GAoCA,QAAA,GAAA,GACA,EAAA,KAAA,GACA,IACA,GAAA,EACA,EAAA,IAIA,QAAA,GAAA,GACA,MAAA,QAAA,mBACA,OAAA,kBAAA,aAAA,IACA,EAGA,QAAA,KAGA,GAAA,CAEA,IAAA,GAAA,CACA,MAEA,EAAA,KAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,EAAA,MAGA,IAAA,IAAA,CACA,GAAA,QAAA,SAAA,GAGA,GAAA,GAAA,EAAA,aAEA,GAAA,GAGA,EAAA,SACA,EAAA,UAAA,EAAA,GACA,GAAA,KAKA,GACA,IAGA,QAAA,GAAA,GACA,EAAA,OAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,IAAA,EACA,IAEA,EAAA,QAAA,SAAA,GACA,EAAA,WAAA,GACA,EAAA,+BAiBA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,WAAA,CACA,GAAA,GAAA,EAAA,IAAA,EAEA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAGA,IAAA,IAAA,GAAA,EAAA,QAAA,CAGA,GAAA,GAAA,EAAA,EACA,IACA,EAAA,QAAA,MAaA,QAAA,GAAA,GACA,KAAA,UAAA,EACA,KAAA,UACA,KAAA,YACA,KAAA,OAAA,EAoFA,QAAA,GAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EACA,KAAA,cACA,KAAA,gBACA,KAAA,gBAAA,KACA,KAAA,YAAA,KACA,KAAA,cAAA,KACA,KAAA,mBAAA,KACA,KAAA,SAAA,KAGA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,GAAA,EAAA,KAAA,EAAA,OAQA,OAPA,GAAA,WAAA,EAAA,WAAA,QACA,EAAA,aAAA,EAAA,aAAA,QACA,EAAA,gBAAA,EAAA,gBACA,EAAA,YAAA,EAAA,YACA,EAAA,cAAA,EAAA,cACA,EAAA,mBAAA,EAAA,mBACA,EAAA,SAAA,EAAA,SACA,EAYA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,GAAA,GAAA,EAAA,GAQA,QAAA,GAAA,GACA,MAAA,GACA,GACA,EAAA,EAAA,GACA,EAAA,SAAA,EACA,GAGA,QAAA,KACA,EAAA,EAAA,OAQA,QAAA,GAAA,GACA,MAAA,KAAA,GAAA,IAAA,EAWA,QAAA,GAAA,EAAA,GACA,MAAA,KAAA,EACA,EAIA,GAAA,EAAA,GACA,EAEA,KAUA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,SAAA,EACA,KAAA,OAAA,EACA,KAAA,QAAA,EACA,KAAA,0BA1TA,GAAA,GAAA,GAAA,SAGA,EAAA,OAAA,cAGA,KAAA,EAAA,CACA,GAAA,MACA,EAAA,OAAA,KAAA,SACA,QAAA,iBAAA,UAAA,SAAA,GACA,GAAA,EAAA,OAAA,EAAA,CACA,GAAA,GAAA,CACA,MACA,EAAA,QAAA,SAAA,GACA,SAIA,EAAA,SAAA,GACA,EAAA,KAAA,GACA,OAAA,YAAA,EAAA,MAKA,GAAA,IAAA,EAGA,KAiGA,EAAA,CAcA,GAAA,WACA,QAAA,SAAA,EAAA,GAIA,GAHA,EAAA,EAAA,IAGA,EAAA,YAAA,EAAA,aAAA,EAAA,eAGA,EAAA,oBAAA,EAAA,YAGA,EAAA,iBAAA,EAAA,gBAAA,SACA,EAAA,YAGA,EAAA,wBAAA,EAAA,cAEA,KAAA,IAAA,YAGA,IAAA,GAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,KAOA,KAAA,GADA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,GAAA,WAAA,KAAA,CACA,EAAA,EAAA,GACA,EAAA,kBACA,EAAA,QAAA,CACA,OASA,IACA,EAAA,GAAA,GAAA,KAAA,EAAA,GACA,EAAA,KAAA,GACA,KAAA,OAAA,KAAA,IAGA,EAAA,gBAGA,WAAA,WACA,KAAA,OAAA,QAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,WAAA,KAAA,CACA,EAAA,kBACA,EAAA,OAAA,EAAA,EAGA,UAGA,MACA,KAAA,aAGA,YAAA,WACA,GAAA,GAAA,KAAA,QAEA,OADA,MAAA,YACA,GAkCA,IAAA,GAAA,CAwEA,GAAA,WACA,QAAA,SAAA,GACA,GAAA,GAAA,KAAA,SAAA,SACA,EAAA,EAAA,MAMA,IAAA,EAAA,OAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EACA,IAAA,EAEA,YADA,EAAA,EAAA,GAAA,OAIA,GAAA,KAAA,SAGA,GAAA,GAAA,GAGA,aAAA,WACA,KAAA,cAAA,KAAA,SAGA,cAAA,SAAA,GACA,GAAA,GAAA,KAAA,OACA,GAAA,YACA,EAAA,iBAAA,kBAAA,MAAA,GAEA,EAAA,eACA,EAAA,iBAAA,2BAAA,MAAA,GAEA,EAAA,WACA,EAAA,iBAAA,kBAAA,MAAA,IAEA,EAAA,WAAA,EAAA,UACA,EAAA,iBAAA,iBAAA,MAAA,IAGA,gBAAA,WACA,KAAA,iBAAA,KAAA,SAGA,iBAAA,SAAA,GACA,GAAA,GAAA,KAAA,OACA,GAAA,YACA,EAAA,oBAAA,kBAAA,MAAA,GAEA,EAAA,eACA,EAAA,oBAAA,2BAAA,MAAA,GAEA,EAAA,WACA,EAAA,oBAAA,kBAAA,MAAA,IAEA,EAAA,WAAA,EAAA,UACA,EAAA,oBAAA,iBAAA,MAAA,IAQA,qBAAA,SAAA,GAGA,GAAA,IAAA,KAAA,OAAA,CAGA,KAAA,cAAA,GACA,KAAA,uBAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,MAIA,EAAA,KAAA,QAGA,yBAAA,WACA,GAAA,GAAA,KAAA,sBACA,MAAA,0BAEA,EAAA,QAAA,SAAA,GAEA,KAAA,iBAAA,EAGA,KAAA,GADA,GAAA,EAAA,IAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,KAAA,KAAA,CACA,EAAA,OAAA,EAAA,EAGA,SAGA,OAGA,YAAA,SAAA,GAMA,OAFA,EAAA,2BAEA,EAAA,MACA,IAAA,kBAGA,GAAA,GAAA,EAAA,SACA,EAAA,EAAA,YAAA,aACA,EAAA,EAAA,OAGA,EAAA,GAAA,GAAA,aAAA,EACA,GAAA,cAAA,EACA,EAAA,mBAAA,CAGA,IAAA,GACA,EAAA,aAAA,cAAA,SAAA,KAAA,EAAA,SAEA,GAAA,EAAA,SAAA,GAEA,OAAA,EAAA,YAIA,EAAA,iBAAA,EAAA,gBAAA,QACA,KAAA,EAAA,gBAAA,QAAA,IACA,KAAA,EAAA,gBAAA,QAAA,GANA,OAUA,EAAA,kBACA,EAAA,GAGA,GAGA,MAEA,KAAA,2BAEA,GAAA,GAAA,EAAA,OAGA,EAAA,EAAA,gBAAA,GAGA,EAAA,EAAA,SAGA,GAAA,EAAA,SAAA,GAEA,MAAA,GAAA,cAIA,EAAA,sBACA,EAAA,GAGA,EARA,QAWA,MAEA,KAAA,iBACA,KAAA,qBAAA,EAAA,OAEA,KAAA,kBAEA,GAEA,GAAA,EAFA,EAAA,EAAA,YACA,EAAA,EAAA,MAEA,qBAAA,EAAA,MACA,GAAA,GACA,OAGA,KACA,GAAA,GAEA,IAAA,GAAA,EAAA,gBACA,EAAA,EAAA,YAGA,EAAA,EAAA,YAAA,EACA,GAAA,WAAA,EACA,EAAA,aAAA,EACA,EAAA,gBAAA,EACA,EAAA,YAAA,EAEA,EAAA,EAAA,SAAA,GAEA,MAAA,GAAA,UAIA,EAJA,SASA,MAIA,EAAA,mBAAA,EAEA,EAAA,mBACA,EAAA,iBAAA,IAGA,MC5hBA,OAAA,YAAA,OAAA,cAAA,UCCA,SAAA,GAGA,GACA,IADA,EAAA,KACA,EAAA,KACA,EAAA,EAAA,MAMA,EAAA,SAAA,EAAA,GACA,KAAA,SACA,KAAA,OAAA,EACA,KAAA,WAAA,EACA,KAAA,SAAA,EACA,KAAA,WAGA,GAAA,WACA,SAAA,SAAA,GAEA,KAAA,UAAA,EAAA,MAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,QAAA,EAGA,MAAA,aAEA,QAAA,SAAA,GAEA,KAAA,WAEA,KAAA,QAAA,GAEA,KAAA,aAEA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,KAAA,EAAA,IAIA,GAAA,UAAA,EAEA,KAAA,OAAA,EAAA,IAEA,KAAA,MAAA,EAAA,IAGA,OAAA,SAAA,EAAA,GACA,GAAA,KAAA,QAAA,GAIA,MAFA,MAAA,QAAA,GAAA,KAAA,IAEA,CAGA,OAAA,MAAA,MAAA,IACA,KAAA,OAAA,EAAA,EAAA,KAAA,MAAA,IAEA,KAAA,QAEA,IAGA,KAAA,QAAA,IAAA,IAEA,IAEA,MAAA,SAAA,EAAA,GAEA,GADA,EAAA,MAAA,QAAA,IAAA,QAAA,EAAA,GACA,EAAA,MAAA,UAAA,CAEA,GAAA,GAAA,EAAA,MAAA,KACA,EAAA,EAAA,GACA,EAAA,EAAA,EAEA,GADA,EAAA,QAAA,WAAA,GACA,KAAA,GAEA,mBAAA,GAEA,WAAA,WACA,KAAA,QAAA,EAAA,EAAA,KAAA,IACA,KAAA,MAAA,OACA,CACA,GAAA,GAAA,SAAA,EAAA,GACA,KAAA,QAAA,EAAA,EAAA,EAAA,IACA,KAAA,KACA,GAAA,KAAA,EAAA,KAgBA,QAAA,SAAA,EAAA,EAAA,EAAA,GACA,KAAA,MAAA,GAAA,CAEA,KAAA,GAAA,GADA,EAAA,KAAA,QAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAEA,KAAA,OAAA,EAAA,EAAA,GAEA,KAAA,MAEA,MAAA,QAAA,GAAA,MAEA,KAAA,aACA,KAAA,SACA,KAAA,aAEA,UAAA,WACA,KAAA,UACA,KAAA,eAKA,EAAA,IACA,OAAA,EACA,GAAA,SAAA,GACA,MAAA,GAAA,QAAA,KAAA,EAAA,OAAA,KACA,MAAA,EAAA,QACA,IAAA,EAAA,QAEA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,eAYA,QAXA,EAAA,MAAA,OAAA,EAAA,MAAA,QACA,GAAA,IAAA,KAAA,UAEA,EAAA,KAAA,MAAA,EAAA,EAAA,OACA,EAAA,iBAAA,mBAAA,WACA,IAAA,EAAA,YACA,EAAA,KAAA,GAAA,EAAA,GAAA,IAAA,EACA,EAAA,UAAA,EAAA,aAAA,KAGA,EAAA,OACA,GAEA,aAAA,SAAA,EAAA,EAAA,GACA,KAAA,KAAA,EAAA,EAAA,GAAA,aAAA,aAKA,EAAA,IAAA,EACA,EAAA,OAAA,GAEA,OAAA,aC9JA,SAAA,GA4MA,QAAA,GAAA,GACA,MAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,EACA,KACA,EAAA,KAAA,GACA,MAAA,GACA,EAAA,KAAA,SAAA,mBAAA,KACA,QAAA,KAAA,iGACA,GAEA,MAAA,+BAAA,EAGA,QAAA,GAAA,GACA,MAAA,GAAA,YAAA,EAAA,GAIA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,SACA,KAAA,EAAA,CACA,EAAA,EAAA,cAAA,OAEA,IAAA,GAAA,IAAA,KAAA,MAAA,KAAA,KAAA,SAAA,IAAA,IAGA,EAAA,EAAA,YAAA,MAAA,wBACA,GAAA,GAAA,EAAA,IAAA,EAEA,GAAA,IAAA,EAAA,MAEA,MAAA,mBAAA,EAAA,KAOA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,cAAA,cAAA,QAGA,OAFA,GAAA,YAAA,EAAA,YACA,EAAA,mBAAA,GACA,EAvPA,GAAA,GAAA,SACA,EAAA,EAAA,MACA,EAAA,UAAA,KAAA,UAAA,WAEA,EAAA,OAAA,kBACA,OAAA,kBAAA,aAAA,UAAA,SAUA,GAEA,kBAAA,YAAA,EAAA,IAEA,kBACA,YAAA,EAAA,IACA,uBACA,QACA,qBACA,kCACA,KAAA,KACA,KACA,KAAA,YACA,OAAA,cACA,MAAA,cAGA,UAAA,WACA,GAAA,GAAA,KAAA,aACA,IACA,KAAA,MAAA,IAGA,MAAA,SAAA,GACA,GAAA,KAAA,SAAA,GAEA,YADA,EAAA,OAAA,QAAA,IAAA,yBAAA,EAAA,WAGA,IAAA,GAAA,KAAA,KAAA,IAAA,EAAA,WACA,KACA,KAAA,YAAA,GACA,EAAA,KAAA,KAAA,KAMA,YAAA,SAAA,GACA,EAAA,OAAA,QAAA,IAAA,UAAA,GACA,KAAA,eAAA,GAEA,oBAAA,SAAA,GACA,EAAA,gBAAA,EACA,EAAA,kBACA,EAAA,gBAAA,gBAAA,GAEA,KAAA,eAAA,KACA,EAAA,OAAA,QAAA,IAAA,YAAA,GACA,KAAA,aAEA,YAAA,SAAA,GAgBA,GAfA,EAAA,OAAA,gBAAA,EAIA,YAAA,sBACA,YAAA,qBAAA,GAIA,EAAA,cADA,EAAA,WACA,GAAA,aAAA,QAAA,SAAA,IAEA,GAAA,aAAA,SAAA,SAAA,KAIA,EAAA,UAEA,IADA,GAAA,GACA,EAAA,UAAA,QACA,EAAA,EAAA,UAAA,QACA,GACA,GAAA,OAAA,GAIA,MAAA,oBAAA,IAEA,UAAA,SAAA,GACA,EAAA,GACA,KAAA,YAAA,IAGA,EAAA,KAAA,EAAA,KACA,KAAA,aAAA,KAGA,WAAA,SAAA,GAEA,GAAA,GAAA,CACA,GAAA,EAAA,GACA,EAAA,gBAAA,EACA,KAAA,aAAA,IAEA,aAAA,SAAA,GACA,KAAA,aAAA,GACA,SAAA,KAAA,YAAA,IAGA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KACA,EAAA,SAAA,GACA,GACA,EAAA,GAEA,EAAA,oBAAA,GAOA,IALA,EAAA,iBAAA,OAAA,GACA,EAAA,iBAAA,QAAA,GAIA,GAAA,UAAA,EAAA,UAAA,CACA,GAAA,IAAA,CAEA,IAAA,IAAA,EAAA,YAAA,QAAA,WACA,GAAA,MAEA,IAAA,EAAA,MAAA,CACA,GAAA,CAIA,KAAA,GAAA,GAHA,EAAA,EAAA,MAAA,SACA,EAAA,EAAA,EAAA,OAAA,EAEA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,OAAA,QAAA,cAEA,EAAA,GAAA,QAAA,EAAA,aAKA,GACA,EAAA,cAAA,GAAA,aAAA,QAAA,SAAA,OAUA,YAAA,SAAA,GACA,GAAA,GAAA,SAAA,cAAA,SACA,GAAA,gBAAA,EACA,EAAA,IAAA,EAAA,IAAA,EAAA,IACA,EAAA,GACA,EAAA,cAAA,EACA,KAAA,aAAA,EAAA,WACA,EAAA,WAAA,YAAA,GACA,EAAA,cAAA,OAEA,SAAA,KAAA,YAAA,IAGA,YAAA,WACA,OAAA,KAAA,gBAAA,KAAA,iBAAA,IAEA,iBAAA,SAAA,EAAA,GAEA,IAAA,GAAA,GADA,EAAA,EAAA,iBAAA,KAAA,sBAAA,IACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,IAAA,KAAA,SAAA,GACA,MAAA,MAAA,YAAA,GACA,EAAA,GAAA,KAAA,iBAAA,EAAA,OAAA,GAAA,EAEA,MAKA,OAAA,IAGA,sBAAA,SAAA,GACA,GAAA,GAAA,EAAA,eAAA,CACA,OAAA,KAAA,EAAA,KAAA,kBAAA,KAAA,kBAEA,SAAA,SAAA,GACA,MAAA,GAAA,gBAEA,YAAA,SAAA,GACA,MAAA,GAAA,KAAA,EAAA,QACA,GAEA,IAsDA,EAAA,sBACA,EAAA,qCAEA,GACA,mBAAA,SAAA,GACA,GAAA,GAAA,EAAA,cACA,EAAA,EAAA,cAAA,IAEA,OADA,GAAA,YAAA,KAAA,qBAAA,EAAA,YAAA,GACA,GAEA,qBAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,YAAA,EAAA,EAAA,EAEA,OADA,GAAA,KAAA,YAAA,EAAA,EAAA,IAGA,YAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,QAAA,GAGA,OAFA,GAAA,KAAA,EACA,EAAA,EAAA,KACA,EAAA,IAAA,EAAA,IAAA,KAMA,GAAA,OAAA,EACA,EAAA,KAAA,EACA,EAAA,KAAA,GAEA,aC5RA,SAAA,GA0FA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GACA,MAAA,SAAA,EAAA,WAAA,EAAA,aAAA,SAAA,EAOA,QAAA,GAAA,EAAA,GAEA,GAAA,GAAA,CACA,aAAA,YACA,EAAA,SAAA,eAAA,mBAAA,IAGA,EAAA,KAAA,CAEA,IAAA,GAAA,EAAA,cAAA,OACA,GAAA,aAAA,OAAA,GAEA,EAAA,UACA,EAAA,QAAA,EAGA,IAAA,GAAA,EAAA,cAAA,OAmBA,OAlBA,GAAA,aAAA,UAAA,SAEA,EAAA,KAAA,YAAA,GACA,EAAA,KAAA,YAAA,GAMA,YAAA,YAEA,EAAA,KAAA,UAAA,GAIA,OAAA,qBAAA,oBAAA,WACA,oBAAA,UAAA,GAEA,EAsCA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,EAEA,EAAA,WACA,EAAA,EAAA,IACA,GAMA,QAAA,GAAA,GACA,MAAA,aAAA,EAAA,YACA,EAAA,aAAA,EAIA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,GASA,GACA,QAVA,CACA,GAAA,GAAA,YACA,aAAA,EAAA,YACA,EAAA,aAAA,KACA,EAAA,oBAAA,EAAA,GACA,EAAA,EAAA,IAGA,GAAA,iBAAA,EAAA,IAOA,QAAA,GAAA,EAAA,GAGA,QAAA,KACA,GAAA,GAEA,sBAAA,GAGA,QAAA,KACA,IACA,IAVA,GAAA,GAAA,EAAA,iBAAA,oBACA,EAAA,EAAA,EAAA,EAAA,MAWA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,GACA,EAAA,KAAA,IAEA,EAAA,iBAAA,OAAA,GACA,EAAA,iBAAA,QAAA,QAIA,KAIA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,QAAA,YAAA,EAAA,OAAA,WACA,EAAA,eA3OA,GAAA,GAAA,UAAA,UAAA,cAAA,QACA,EAAA,EACA,EAAA,EAAA,MACA,EAAA,SAGA,EAAA,OAAA,kBACA,kBAAA,aAAA,UAAA,QAEA,IAAA,EAkIA,GAAA,UA/HA,IACA,IADA,EAAA,IACA,EAAA,QACA,EAAA,EAAA,OAQA,GACA,aAEA,yBAAA,YAAA,EAAA,IAEA,yBACA,YAAA,EAAA,KACA,KAAA,KACA,SAAA,SAAA,GACA,EAAA,QAAA,IAGA,YAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EAEA,GAAA,SAAA,IAEA,aAAA,SAAA,GAEA,MAAA,GAAA,iBAAA,KAAA,qBAAA,KAGA,qBAAA,SAAA,GACA,GAAA,GAAA,EAAA,eAAA,CACA,OAAA,KAAA,EAAA,KAAA,yBACA,KAAA,yBAEA,OAAA,SAAA,EAAA,EAAA,GAMA,GALA,EAAA,MAAA,QAAA,IAAA,SAAA,EAAA,GAIA,EAAA,WAAA,EACA,EAAA,GAAA,CACA,GAAA,GAAA,KAAA,UAAA,EAEA,KAEA,EAAA,EAAA,EAAA,GACA,EAAA,aAAA,EAGA,KAAA,aAAA,GAEA,KAAA,UAAA,GAAA,GAIA,EAAA,OAAA,EAEA,EAAA,aAEA,aAAA,SAAA,GACA,KAAA,YAAA,GACA,KAAA,QAAA,GACA,EAAA,aAEA,UAAA,WACA,EAAA,cAKA,EAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GACA,EAAA,UAAA,KAAA,GA4DA,IAAA,IACA,IAAA,WACA,MAAA,aAAA,eAAA,SAAA,eAEA,cAAA,EAOA,IAJA,OAAA,eAAA,SAAA,iBAAA,GACA,OAAA,eAAA,EAAA,iBAAA,IAGA,SAAA,QAAA,CACA,GAAA,IACA,IAAA,WACA,MAAA,QAAA,SAAA,MAEA,cAAA,EAGA,QAAA,eAAA,SAAA,UAAA,GACA,OAAA,eAAA,EAAA,UAAA,GAgBA,GAAA,GAAA,YAAA,KAAA,WAAA,cACA,EAAA,kBAwDA,GAAA,UAAA,EACA,EAAA,UAAA,EACA,EAAA,SAAA,EACA,EAAA,iBAAA,EACA,EAAA,iBAAA,EACA,EAAA,eAAA,EACA,EAAA,aAAA,GAEA,OAAA,aCzPA,SAAA,GAOA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,cAAA,EAAA,MAAA,EAAA,WAAA,QACA,EAAA,EAAA,YAMA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,IACA,EAAA,SAAA,GAEA,EAAA,UAAA,EAAA,SAAA,QACA,EAAA,EAAA,UAKA,QAAA,GAAA,GACA,MAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EACA,EAAA,qBAAA,IAaA,QAAA,GAAA,GACA,EAAA,QAAA,GAAA,WAAA,EAAA,SAAA,IAzCA,GAEA,IAFA,EAAA,iBAEA,EAAA,UA6BA,EAAA,YAAA,UAAA,SACA,YAAA,UAAA,iBACA,YAAA,UAAA,uBACA,YAAA,UAAA,oBACA,YAAA,UAAA,kBAEA,EAAA,GAAA,kBAAA,EASA,GAAA,QAAA,EACA,EAAA,QAAA,GAEA,aCpDA,WAmCA,QAAA,KACA,YAAA,SAAA,aAAA,GA/BA,kBAAA,QAAA,cACA,OAAA,YAAA,SAAA,EAAA,GACA,GAAA,GAAA,SAAA,YAAA,aAKA,OAJA,GAAA,UAAA,EACA,EAAA,WAAA,GAAA,GAAA,EACA,EAAA,cAAA,GAAA,GAAA,EACA,EAAA,QACA,GAKA,IAAA,GAAA,OAAA,kBACA,OAAA,kBAAA,aAAA,UAAA,QAMA,aAAA,iBAAA,WACA,YAAA,OAAA,EACA,YAAA,WAAA,GAAA,OAAA,UACA,EAAA,cACA,GAAA,aAAA,qBAAA,SAAA,OAMA,YAAA,YAQA,aAAA,SAAA,YACA,gBAAA,SAAA,aAAA,OAAA,YACA,IAEA,SAAA,iBAAA,mBAAA,OC9CA,OAAA,eAAA,OAAA,iBAAA,UCCA,SAAA,GAQA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBACA,KAAA,EAEA,IADA,EAAA,EAAA,WACA,GAAA,EAAA,WAAA,KAAA,cACA,EAAA,EAAA,WAGA,MAAA,GACA,EAAA,EAAA,MAAA,GACA,EAAA,EAAA,EAAA,GAEA,EAAA,EAAA,kBAEA,OAAA,MAIA,QAAA,GAAA,EAAA,GAEA,IADA,GAAA,GAAA,EAAA,WACA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,gBAMA,QAAA,GAAA,EAAA,GAEA,EAAA,EAAA,SAAA,GACA,MAAA,GAAA,IACA,MAEA,GAAA,EAAA,KAEA,EAAA,EAAA,GAKA,QAAA,GAAA,GACA,MAAA,GAAA,IACA,EAAA,IACA,OAEA,GAAA,GAIA,QAAA,GAAA,GACA,EAAA,EAAA,SAAA,GACA,MAAA,GAAA,IACA,EADA,SAOA,QAAA,GAAA,GACA,MAAA,GAAA,IAAA,EAAA,GAIA,QAAA,GAAA,GACA,IAAA,EAAA,cAAA,EAAA,WAAA,KAAA,aAAA,CACA,GAAA,GAAA,EAAA,aAAA,OAAA,EAAA,UACA,EAAA,EAAA,SAAA,EACA,IAAA,EAIA,MAHA,GAAA,KAAA,QAAA,MAAA,WAAA,EAAA,WACA,EAAA,QAAA,GACA,EAAA,KAAA,QAAA,YACA,GAKA,QAAA,GAAA,GACA,EAAA,GACA,EAAA,IACA,EAAA,EAAA,SAAA,GACA,EAAA,KAiBA,QAAA,GAAA,GAEA,GADA,EAAA,KAAA,IACA,EAAA,CACA,GAAA,CACA,IAAA,GAAA,OAAA,UAAA,OAAA,SAAA,gBACA,UACA,GAAA,IAIA,QAAA,KACA,GAAA,CAEA,KAAA,GAAA,GADA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,GAEA,MAGA,QAAA,GAAA,GACA,EACA,EAAA,WACA,EAAA,KAGA,EAAA,GAKA,QAAA,GAAA,IAWA,EAAA,kBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,OACA,EAAA,KAAA,QAAA,MAAA,YAAA,EAAA,WACA,EAAA,KACA,EAAA,YAAA,EAAA,YAAA,GAAA,EAEA,EAAA,WAAA,IACA,EAAA,WAAA,GAGA,EAAA,WAAA,EACA,EAAA,KAAA,QAAA,KAAA,YAAA,EAAA,UACA,uBAAA,EAAA,YACA,EAAA,mBACA,EAAA,KAAA,QAAA,IAAA,YAAA,EAAA,WACA,EAAA,qBAGA,EAAA,KAAA,QAAA,YAIA,QAAA,GAAA,GACA,EAAA,GACA,EAAA,EAAA,SAAA,GACA,EAAA,KAIA,QAAA,GAAA,GACA,EACA,EAAA,WACA,EAAA,KAGA,EAAA,GAIA,QAAA,GAAA,IAGA,EAAA,kBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,OACA,EAAA,KAAA,QAAA,MAAA,WAAA,EAAA,WACA,EAAA,KACA,EAAA,YAAA,EAAA,YAAA,GAAA,EAEA,EAAA,WAAA,IACA,EAAA,WAAA,GAGA,EAAA,WAAA,EACA,EAAA,KAAA,QAAA,KAAA,WAAA,EAAA,UACA,uBAAA,EAAA,YACA,EAAA,kBACA,EAAA,oBAGA,EAAA,KAAA,QAAA,YAMA,QAAA,GAAA,GACA,MAAA,QAAA,kBAAA,kBAAA,aAAA,GACA,EAGA,QAAA,GAAA,GAGA,IAFA,GAAA,GAAA,EACA,EAAA,EAAA,UACA,GAAA,CACA,GAAA,GAAA,EACA,OAAA,CAEA,GAAA,EAAA,YAAA,EAAA,MAIA,QAAA,GAAA,GACA,GAAA,EAAA,aAAA,EAAA,WAAA,UAAA,CACA,EAAA,KAAA,QAAA,IAAA,6BAAA,EAAA,UAGA,KADA,GAAA,GAAA,EAAA,WACA,GACA,EAAA,GACA,EAAA,EAAA,iBAKA,QAAA,GAAA,GACA,EAAA,YACA,EAAA,GACA,EAAA,WAAA,GAIA,QAAA,GAAA,GAEA,GAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,GAAA,cAAA,EAAA,MAAA,EAAA,YACA,EAAA,WAAA,CAEA,IADA,GAAA,GAAA,EAAA,WAAA,GACA,GAAA,IAAA,WAAA,EAAA,MACA,EAAA,EAAA,UAEA,IAAA,GAAA,IAAA,EAAA,KAAA,EAAA,MAAA,EAAA,MAAA,EAAA,KAAA,YAAA,EACA,GAAA,EAAA,MAAA,MAAA,QAAA,MAAA,KAAA,MAGA,QAAA,MAAA,sBAAA,EAAA,OAAA,GAAA,IAGA,EAAA,QAAA,SAAA,GAEA,cAAA,EAAA,OACA,EAAA,EAAA,WAAA,SAAA,GAEA,EAAA,WAIA,EAAA,KAGA,EAAA,EAAA,aAAA,SAAA,GAEA,EAAA,WAGA,EAAA,QAKA,EAAA,KAAA,QAAA,WAKA,QAAA,KAEA,EAAA,EAAA,eACA,IAKA,QAAA,GAAA,GACA,EAAA,QAAA,GAAA,WAAA,EAAA,SAAA,IAGA,QAAA,GAAA,GACA,EAAA,GAGA,QAAA,GAAA,GACA,EAAA,KAAA,QAAA,MAAA,oBAAA,EAAA,QAAA,MAAA,KAAA,OACA,EAAA,GACA,EAAA,KAAA,QAAA,WAGA,QAAA,GAAA,GACA,EAAA,EAAA,EAIA,KAAA,GAAA,GADA,EAAA,EAAA,iBAAA,YAAA,EAAA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,QAAA,EAAA,OAAA,UACA,EAAA,EAAA,OAGA,GAAA,GA/TA,GAAA,GAAA,OAAA,aACA,EAAA,OAAA,YAAA,YAAA,iBAAA,OAiGA,GAAA,OAAA,kBACA,OAAA,mBAAA,OAAA,kBACA,GAAA,qBAAA,CAEA,IAAA,IAAA,EACA,KAsLA,EAAA,GAAA,kBAAA,GAQA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,QA8BA,GAAA,iBAAA,EACA,EAAA,YAAA,EACA,EAAA,oBAAA,EACA,EAAA,WAAA,EACA,EAAA,eAAA,EACA,EAAA,aAAA,EAEA,EAAA,gBAAA,EACA,EAAA,gBAAA,EAEA,EAAA,YAAA,GAEA,OAAA,gBCvUA,SAAA,GA8EA,QAAA,GAAA,EAAA,GAIA,GAAA,GAAA,KACA,KAAA,EAGA,KAAA,IAAA,OAAA,oEAEA,IAAA,EAAA,QAAA,KAAA,EAGA,KAAA,IAAA,OAAA,uGAAA,OAAA,GAAA,KAGA,IAAA,EAAA,GACA,KAAA,IAAA,OAAA,oFAAA,OAAA,GAAA,+BAGA,IAAA,EAAA,GACA,KAAA,IAAA,OAAA,+CAAA,OAAA,GAAA,0BAIA,KAAA,EAAA,UAGA,KAAA,IAAA,OAAA,8CA+BA,OA5BA,GAAA,OAAA,EAAA,cAEA,EAAA,UAAA,EAAA,cAIA,EAAA,SAAA,EAAA,EAAA,SAGA,EAAA,GAGA,EAAA,GAEA,EAAA,EAAA,WAEA,EAAA,EAAA,OAAA,GAGA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,UAAA,EAAA,UAEA,EAAA,UAAA,YAAA,EAAA,KAEA,EAAA,OAEA,EAAA,oBAAA,UAEA,EAAA,KAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,IAAA,EAAA,GACA,OAAA,EAUA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,EACA,OAAA,GACA,EAAA,EAAA,SAAA,QAAA,OAKA,QAAA,GAAA,GAMA,IAAA,GAAA,GAHA,EAAA,EAAA,QAGA,EAAA,EAAA,EAAA,EAAA,SAAA,GAAA,IACA,EAAA,EAAA,IAAA,EAAA,GAGA,GAAA,IAAA,GAAA,EAAA,OACA,IAEA,EAAA,GAAA,EAAA,QAIA,QAAA,GAAA,GAGA,IAAA,OAAA,UAAA,CAEA,GAAA,GAAA,YAAA,SAEA,IAAA,EAAA,GAAA,CACA,GAAA,GAAA,SAAA,cAAA,EAAA,IACA,GAAA,OAAA,eAAA,GAQA,IADA,GAAA,GAAA,EAAA,EAAA,UACA,GAAA,IAAA,GAAA,CACA,GAAA,GAAA,OAAA,eAAA,EACA,GAAA,UAAA,EACA,EAAA,GAIA,EAAA,OAAA,EAKA,QAAA,GAAA,GAOA,MAAA,GAAA,EAAA,EAAA,KAAA,GAGA,QAAA,GAAA,EAAA,GAkBA,MAhBA,GAAA,IACA,EAAA,aAAA,KAAA,EAAA,IAGA,EAAA,gBAAA,cAEA,EAAA,EAAA,GAEA,EAAA,cAAA,EAEA,EAAA,GAEA,EAAA,aAAA,GAEA,EAAA,eAAA,GAEA,EAGA,QAAA,GAAA,EAAA,GAEA,OAAA,UACA,EAAA,UAAA,EAAA,WAKA,EAAA,EAAA,EAAA,UAAA,EAAA,QACA,EAAA,UAAA,EAAA,WAIA,QAAA,GAAA,EAAA,EAAA,GASA,IALA,GAAA,MAEA,EAAA,EAGA,IAAA,GAAA,IAAA,YAAA,WAAA,CAEA,IAAA,GAAA,GADA,EAAA,OAAA,oBAAA,GACA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,EAAA,KACA,OAAA,eAAA,EAAA,EACA,OAAA,yBAAA,EAAA,IACA,EAAA,GAAA,EAGA,GAAA,OAAA,eAAA,IAIA,QAAA,GAAA,GAEA,EAAA,iBACA,EAAA,kBAMA,QAAA,GAAA,GAIA,IAAA,EAAA,aAAA,YAAA,CAGA,GAAA,GAAA,EAAA,YACA,GAAA,aAAA,SAAA,EAAA,GACA,EAAA,KAAA,KAAA,EAAA,EAAA,GAEA,IAAA,GAAA,EAAA,eACA,GAAA,gBAAA,SAAA,GACA,EAAA,KAAA,KAAA,EAAA,KAAA,IAEA,EAAA,aAAA,aAAA,GAKA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,MAAA,KAAA,UACA,IAAA,GAAA,KAAA,aAAA,EACA,MAAA,0BACA,IAAA,GACA,KAAA,yBAAA,EAAA,EAAA,GAQA,QAAA,GAAA,GACA,MAAA,GACA,EAAA,EAAA,eADA,OAKA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,EAGA,QAAA,GAAA,GACA,MAAA,YACA,MAAA,GAAA,IAKA,QAAA,GAAA,EAAA,EAAA,GAGA,MAAA,KAAA,EACA,EAAA,EAAA,GAEA,EAAA,EAAA,GAIA,QAAA,GAAA,EAAA,GAGA,GAAA,GAAA,EAAA,GAAA,EACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,KAAA,GAAA,EAAA,GACA,MAAA,IAAA,GAAA,IAGA,KAAA,IAAA,EAAA,GACA,MAAA,IAAA,GAAA,KAIA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAEA,OADA,GAAA,aAAA,KAAA,GACA,EAEA,GAAA,GAAA,EAAA,EAKA,OAHA,GAAA,QAAA,MAAA,GACA,EAAA,EAAA,aAEA,EAGA,QAAA,GAAA,GACA,IAAA,EAAA,cAAA,EAAA,WAAA,KAAA,aAAA,CACA,GAAA,GAAA,EAAA,aAAA,MACA,EAAA,EAAA,GAAA,EAAA,UACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,KAAA,EAAA,UACA,MAAA,GAAA,EAAA,EACA,KAAA,IAAA,EAAA,QACA,MAAA,GAAA,EAAA,KAMA,QAAA,GAAA,GAEA,GAAA,GAAA,EAAA,KAAA,KAAA,EAIA,OAFA,GAAA,WAAA,GAEA,EAlYA,IACA,EAAA,OAAA,gBAAA,UAEA,IAAA,GAAA,EAAA,MAIA,EAAA,QAAA,SAAA,iBAMA,GAAA,EAAA,UAAA,IAAA,OAAA,iBAEA,IAAA,EAAA,CAGA,GAAA,GAAA,YAGA,GAAA,YACA,EAAA,eAAA,EAEA,EAAA,YAAA,EACA,EAAA,QAAA,EACA,EAAA,WAAA,EACA,EAAA,eAAA,EACA,EAAA,gBAAA,EACA,EAAA,gBAAA,EACA,EAAA,oBAAA,EACA,EAAA,YAAA,EACA,EAAA,uBAEA,CA8GA,GAAA,IACA,iBAAA,gBAAA,YAAA,gBACA,gBAAA,mBAAA,iBAAA,iBAoKA,KAkBA,EAAA,+BA8DA,EAAA,SAAA,cAAA,KAAA,UACA,EAAA,SAAA,gBAAA,KAAA,UAIA,EAAA,KAAA,UAAA,SAIA,UAAA,gBAAA,EACA,SAAA,cAAA,EACA,SAAA,gBAAA,EACA,KAAA,UAAA,UAAA,EAEA,EAAA,SAAA,EAaA,EAAA,QAAA,EAKA,GAAA,EAgBA,GAfA,OAAA,WAAA,EAeA,SAAA,EAAA,GACA,MAAA,aAAA,IAfA,SAAA,EAAA,GAEA,IADA,GAAA,GAAA,EACA,GAAA,CAIA,GAAA,IAAA,EAAA,UACA,OAAA,CAEA,GAAA,EAAA,UAEA,OAAA,GASA,EAAA,WAAA,EACA,EAAA,gBAAA,EAGA,SAAA,SAAA,SAAA,gBAEA,EAAA,UAAA,EACA,EAAA,UAAA,GAEA,OAAA,gBCndA,SAAA,GA6CA,QAAA,GAAA,GACA,MAAA,SAAA,EAAA,WACA,EAAA,aAAA,SAAA,EA3CA,GAAA,GAAA,EAAA,iBAIA,GACA,WACA,YAAA,EAAA,KAEA,KACA,KAAA,aAEA,MAAA,SAAA,GACA,IAAA,EAAA,SAAA,CAEA,EAAA,UAAA,CAEA,IAAA,GAAA,EAAA,iBAAA,EAAA,UAEA,GAAA,EAAA,SAAA,GACA,EAAA,EAAA,IAAA,EAAA,YAAA,KAIA,eAAA,gBAAA,GAEA,eAAA,gBAAA,KAGA,UAAA,SAAA,GAEA,EAAA,IACA,KAAA,YAAA,IAGA,YAAA,SAAA,GACA,EAAA,QACA,EAAA,MAAA,EAAA,UAUA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,QAIA,GAAA,OAAA,EACA,EAAA,iBAAA,GAEA,OAAA,gBC1DA,SAAA,GAGA,QAAA,KAEA,eAAA,OAAA,MAAA,UAEA,eAAA,gBAAA,SAEA,IAAA,GAAA,OAAA,UAAA,SAAA,eACA,SAAA,eACA,UACA,GAAA,WAGA,eAAA,OAAA,EAEA,eAAA,UAAA,KAAA,MACA,OAAA,cACA,eAAA,QAAA,eAAA,UAAA,YAAA,WAGA,SAAA,cACA,GAAA,aAAA,sBAAA,SAAA,KAIA,OAAA,cACA,YAAA,qBAAA,SAAA,GACA,eAAA,OAAA,MAAA,EAAA,YAkBA,GAXA,kBAAA,QAAA,cACA,OAAA,YAAA,SAAA,GACA,GAAA,GAAA,SAAA,YAAA,aAEA,OADA,GAAA,UAAA,GAAA,GAAA,GACA,IAOA,aAAA,SAAA,YAAA,EAAA,MAAA,MACA,QAGA,IAAA,gBAAA,SAAA,YAAA,OAAA,aACA,OAAA,cAAA,OAAA,YAAA,MAIA,CACA,GAAA,GAAA,OAAA,cAAA,YAAA,MACA,oBAAA,kBACA,QAAA,iBAAA,EAAA,OANA,MASA,OAAA,gBC9DA,WAEA,GAAA,OAAA,kBAAA,CAGA,GAAA,IAAA,aAAA,iBAAA,kBACA,mBAGA,IACA,GAAA,QAAA,SAAA,GACA,EAAA,GAAA,eAAA,KAIA,EAAA,QAAA,SAAA,GACA,eAAA,GAAA,SAAA,GACA,MAAA,GAAA,GAAA,KAAA,WCjBA,SAAA,GAIA,QAAA,GAAA,GACA,KAAA,MAAA,EAJA,GAAA,GAAA,EAAA,cAMA,GAAA,WAGA,YAAA,SAAA,EAAA,GAGA,IAFA,GACA,GAAA,EADA,KAEA,EAAA,KAAA,MAAA,KAAA,IACA,EAAA,GAAA,KAAA,EAAA,GAAA,GACA,EAAA,MAAA,QAAA,EAAA,GAAA,IAAA,EAAA,MAEA,OAAA,IAIA,QAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,YAAA,EAAA,EACA,MAAA,MAAA,KAAA,IAGA,MAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,MAGA,KAAA,EACA,MAAA,GAAA,EAwBA,KAAA,GADA,GAAA,EAAA,EApBA,EAAA,WACA,MAAA,GACA,EAAA,IAKA,EAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,GAEA,IAAA,EAEA,MADA,GAAA,GAAA,GACA,GAEA;GAAA,GAAA,EAAA,UAAA,EAAA,YACA,GAAA,GAAA,EACA,KAAA,MAAA,KAAA,YAAA,EAAA,GAAA,EAAA,IAIA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,GAEA,EAAA,IAGA,EAAA,KAAA,IAAA,EAAA,EAAA,MACA,EAAA,MAAA,EAEA,EAAA,GAAA,IAGA,IAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,eASA,OARA,GAAA,KAAA,MAAA,GAAA,GACA,EAAA,OACA,EAAA,OAAA,WACA,EAAA,KAAA,EAAA,KAAA,IAEA,EAAA,QAAA,WACA,EAAA,KAAA,EAAA,KAAA,IAEA,IAIA,EAAA,OAAA,GACA,OAAA,UCrFA,SAAA,GAKA,QAAA,KACA,KAAA,OAAA,GAAA,GAAA,KAAA,OAJA,GAAA,GAAA,EAAA,YACA,EAAA,EAAA,MAKA,GAAA,WACA,MAAA,+CAEA,QAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,SAAA,GACA,EAAA,KAAA,QAAA,EAAA,EAAA,KACA,KAAA,KACA,MAAA,OAAA,QAAA,EAAA,EAAA,IAGA,YAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,YACA,EAAA,EAAA,cAAA,QACA,EAAA,SAAA,GACA,EAAA,YAAA,EACA,EAAA,GAEA,MAAA,QAAA,EAAA,EAAA,IAGA,QAAA,SAAA,EAAA,EAAA,GAGA,IAAA,GADA,GAAA,EAAA,EADA,EAAA,KAAA,OAAA,YAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,EAAA,eAAA,EAAA,GAAA,GAEA,EAAA,KAAA,QAAA,EAAA,EAAA,GACA,EAAA,EAAA,QAAA,EAAA,QAAA,EAEA,OAAA,IAEA,WAAA,SAAA,EAAA,GAGA,QAAA,KACA,IACA,IAAA,GAAA,GACA,IAGA,IAAA,GAAA,GARA,EAAA,EAAA,EAAA,EAAA,OAQA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,YAAA,EAAA,IAKA,IAAA,GAAA,GAAA,EAGA,GAAA,cAAA,GAEA,OAAA,UC7DA,SAAA,GACA,EAAA,MACA,EAAA,SAAA,EAAA,YACA,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,EAAA,CACA,GACA,GAAA,EADA,EAAA,EAAA,iBAAA,EAAA,EAIA,KADA,EAAA,KAAA,gBAAA,GACA,GAAA,CAGA,GADA,EAAA,EAAA,iBAAA,EAAA,GAIA,CAEA,GAAA,GAAA,KAAA,gBAAA,EACA,OAAA,MAAA,WAAA,EAAA,EAAA,IAAA,EAJA,EAAA,KAAA,YAAA,GAQA,MAAA,KAGA,MAAA,SAAA,GAGA,IAFA,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,QAAA,EAAA,EAAA,QAEA,EAAA,KAAA,MAAA,EAAA,OAKA,OAHA,GAAA,iBAAA,EAAA,KACA,EAAA,UAEA,KAAA,WAAA,EAAA,EAAA,IAGA,GAAA,cAAA,EACA,EAAA,WAAA,EAAA,WAAA,KAAA,GAEA,OAAA,sBAAA,GACA,OAAA,uBCtFA,WACA,QAAA,GAAA,GACA,MAAA,sBAAA,EAAA,GAEA,QAAA,GAAA,GACA,MAAA,kBAAA,EAAA,KAEA,QAAA,GAAA,GACA,MAAA,uBAAA,EAAA,mBAAA,EAAA,gCAEA,GAAA,IACA,OACA,OACA,QACA,SAEA,KAAA,cACA,WACA,cACA,iBAIA,EAAA,GAGA,GADA,SAAA,KACA,OAAA,cAAA,OAAA,gBAEA,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,OChCA,SAAA,GAwCA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,OAAA,OAAA,KAEA,IAAA,GAAA,SAAA,YAAA,QACA,GAAA,UAAA,EAAA,EAAA,UAAA,EAAA,EAAA,aAAA,EAGA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,GAAA,EAAA,IAAA,EAAA,EAEA,GAAA,QAAA,EAAA,SAAA,CAIA,IAAA,GAAA,CAqBA,OAnBA,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,EA1EA,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,EA2CA,GAAA,eACA,EAAA,aAAA,IAEA,QC9FA,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,uBCzDA,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,SAGA,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,GAGA,EAAA,mBAAA,oBAcA,GACA,WAAA,GAAA,GAAA,WACA,SAAA,OAAA,OAAA,MACA,YAAA,OAAA,OAAA,MAGA,aAAA,OAAA,OAAA,MACA,mBASA,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,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,IAGA,SAAA,EAAA,SAAA,UAAA,SAAA,EAAA,GACA,MAAA,GAAA,SAAA,IAGA,KAAA,SAAA,GACA,EAAA,SAAA,EACA,KAAA,UAAA,cAAA,IAEA,KAAA,SAAA,GACA,EAAA,SAAA,EACA,KAAA,UAAA,cAAA,IAEA,GAAA,SAAA,GACA,EAAA,SAAA,EACA,KAAA,UAAA,YAAA,IAEA,MAAA,SAAA,GACA,EAAA,SAAA,EACA,KAAA,UAAA,eAAA,IAEA,MAAA,SAAA,GACA,EAAA,SAAA,EACA,KAAA,UAAA,eAAA,IAEA,KAAA,SAAA,GACA,EAAA,SAAA,EACA,KAAA,UAAA,cAAA,IAEA,IAAA,SAAA,GACA,EAAA,SAAA,EACA,KAAA,UAAA,aAAA,IAEA,OAAA,SAAA,GACA,EAAA,SAAA,EACA,KAAA,UAAA,gBAAA,IAEA,SAAA,SAAA,GACA,KAAA,IAAA,GACA,KAAA,SAAA,EAAA,OAAA,EAAA,gBACA,KAAA,MAAA,IAGA,UAAA,SAAA,GACA,KAAA,KAAA,GACA,KAAA,SAAA,EAAA,OAAA,EAAA,gBACA,KAAA,MAAA,IAIA,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,EAAA,QAAA,SAAA,GACA,KAAA,SAAA,EAAA,IACA,OAGA,SAAA,SAAA,EAAA,GACA,EAAA,QAAA,SAAA,GACA,KAAA,YAAA,EAAA,IACA,OAEA,SAAA,EAAA,SAAA,UAAA,SAAA,EAAA,GACA,EAAA,iBAAA,EAAA,KAAA,eAEA,YAAA,EAAA,SAAA,aAAA,SAAA,EAAA,GACA,EAAA,oBAAA,EAAA,KAAA,eAWA,UAAA,SAAA,EAAA,GAEA,KAAA,YAAA,EAAA,aACA,EAAA,cAAA,KAEA,IAAA,GAAA,GAAA,cAAA,EAAA,EAKA,OAJA,GAAA,iBACA,EAAA,eAAA,EAAA,gBAEA,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,GAAA,WAAA,GAAA,kBAAA,GACA,EAAA,YAAA,sBACA,EAAA,GAAA,EAAA,GAAA,wBAUA,OALA,GAAA,iBACA,EAAA,eAAA,WACA,EAAA,mBAGA,GAEA,UAAA,SAAA,GAGA,MAAA,MAAA,YAAA,EAAA,YAAA,EAAA,SAEA,WAAA,SAAA,EAAA,GACA,KAAA,YAAA,IACA,KAAA,eAAA,GAEA,KAAA,YAAA,GAAA,CACA,IAAA,GAAA,SAAA,YAAA,QACA,GAAA,UAAA,qBAAA,GAAA,GACA,EAAA,UAAA,EACA,KAAA,gBAAA,KAAA,eAAA,KAAA,KAAA,GACA,SAAA,iBAAA,YAAA,KAAA,iBACA,SAAA,iBAAA,gBAAA,KAAA,iBACA,EAAA,QAAA,EACA,KAAA,mBAAA,IAEA,eAAA,SAAA,GACA,GAAA,GAAA,KAAA,YAAA,EACA,IAAA,EAAA,CACA,GAAA,GAAA,SAAA,YAAA,QACA,GAAA,UAAA,sBAAA,GAAA,GACA,EAAA,UAAA,EACA,KAAA,YAAA,GAAA,OACA,SAAA,oBAAA,YAAA,KAAA,iBACA,SAAA,oBAAA,gBAAA,KAAA,iBACA,EAAA,QAAA,EACA,KAAA,mBAAA,KASA,cAAA,EAAA,SAAA,eAAA,SAAA,GACA,GAAA,GAAA,KAAA,UAAA,EACA,OAAA,GACA,EAAA,cAAA,GADA,QAIA,mBAAA,SAAA,GACA,sBAAA,KAAA,cAAA,KAAA,KAAA,KAGA,GAAA,aAAA,EAAA,aAAA,KAAA,GACA,EAAA,WAAA,EACA,EAAA,SAAA,EAAA,SAAA,KAAA,GACA,EAAA,WAAA,EAAA,WAAA,KAAA,IACA,OAAA,uBCzTA,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,uGAIA,EAAA,UAAA,GACA,OAAA,uBClHA,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,UACA,YACA,YAEA,SAAA,SAAA,GACA,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,GAEA,EAAA,EAAA,cAWA,OAVA,GAAA,eAAA,WACA,EAAA,iBACA,KAEA,EAAA,UAAA,KAAA,WACA,EAAA,WAAA,EACA,EAAA,YAAA,KAAA,aACA,IACA,EAAA,QAAA,EAAA,EAAA,QAAA,GAEA,GAEA,UAAA,SAAA,GACA,IAAA,KAAA,0BAAA,GAAA,CACA,GAAA,GAAA,EAAA,IAAA,KAAA,WAGA,IACA,KAAA,OAAA,EAEA,IAAA,GAAA,KAAA,aAAA,EACA,GAAA,IAAA,KAAA,WAAA,GACA,EAAA,KAAA,KAGA,UAAA,SAAA,GACA,IAAA,KAAA,0BAAA,GAAA,CACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,KAAA,KAGA,QAAA,SAAA,GACA,IAAA,KAAA,0BAAA,GAAA,CACA,GAAA,GAAA,EAAA,IAAA,KAAA,WACA,IAAA,GAAA,EAAA,SAAA,EAAA,OAAA,CACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,GAAA,GACA,KAAA,kBAIA,UAAA,SAAA,GACA,IAAA,KAAA,0BAAA,GAAA,CACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,UAAA,KAGA,SAAA,SAAA,GACA,IAAA,KAAA,0BAAA,GAAA,CACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,SAAA,KAGA,OAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,OAAA,GACA,KAAA,gBAEA,aAAA,WACA,EAAA,UAAA,KAAA,aAIA,GAAA,YAAA,GACA,OAAA,uBC/GA,SAAA,GACA,GAUA,GAVA,EAAA,EAAA,WACA,EAAA,EAAA,YACA,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,eAOA,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,0CAEA,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,WAAA,EACA,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,eAAA,SAAA,GACA,GAAA,GAAA,KAAA,kBACA,EAAA,EAAA,WAAA,GAIA,EAAA,EAAA,UAAA,EAAA,WAAA,CACA,GAAA,OAAA,EAAA,IAAA,EAAA,GACA,EAAA,SAAA,EACA,EAAA,YAAA,EACA,EAAA,OAAA,KAAA,WACA,EAAA,OAAA,EACA,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,YAEA,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,OAAA,IACA,EAAA,EAAA,GACA,EAAA,KAAA,KAAA,KAAA,eAAA,KAKA,aAAA,SAAA,GACA,GAAA,KAAA,QAAA,CACA,GAAA,GACA,EAAA,EAAA,cAAA,WACA,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,EAGA,MADA,MAAA,QAAA,KACA,IAGA,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,EAAA,GACA,GAAA,KAAA,KAEA,MACA,EAAA,QAAA,KAAA,UAAA,QAGA,WAAA,SAAA,GACA,KAAA,cAAA,GACA,KAAA,gBAAA,EAAA,eAAA,IACA,KAAA,gBAAA,GACA,KAAA,YACA,KAAA,aACA,KAAA,eAAA,EAAA,KAAA,YAGA,SAAA,SAAA,GACA,EAAA,IAAA,EAAA,WACA,OAAA,EAAA,OACA,IAAA,EACA,UAAA,EAAA,QAEA,GAAA,KAAA,GACA,EAAA,MAAA,GACA,EAAA,KAAA,IAEA,UAAA,SAAA,GACA,KAAA,YACA,KAAA,aAAA,IACA,KAAA,WAAA,EACA,KAAA,YAAA,KAEA,EAAA,iBACA,KAAA,eAAA,EAAA,KAAA,gBAIA,YAAA,SAAA,GACA,GAAA,GAAA,EACA,EAAA,EAAA,IAAA,EAAA,UAEA,IAAA,EAAA,CAGA,GAAA,GAAA,EAAA,IACA,EAAA,EAAA,SACA,GAAA,KAAA,GACA,GAAA,IAAA,EAAA,SACA,EAAA,cAAA,EAAA,OACA,EAAA,cAAA,EAEA,EAAA,OAAA,EACA,EAAA,QACA,EAAA,SAAA,GACA,EAAA,UAAA,KAGA,EAAA,OAAA,EACA,EAAA,cAAA,KACA,KAAA,UAAA,KAGA,EAAA,IAAA,EACA,EAAA,UAAA,EAAA,SAEA,SAAA,SAAA,GACA,KAAA,gBAAA,GACA,KAAA,eAAA,EAAA,KAAA,QAEA,MAAA,SAAA,GACA,KAAA,YACA,EAAA,GAAA,GACA,EAAA,IAAA,GACA,EAAA,MAAA,IAEA,KAAA,eAAA,IAEA,YAAA,SAAA,GACA,KAAA,eAAA,EAAA,KAAA,YAEA,UAAA,SAAA,GACA,EAAA,OAAA,GACA,EAAA,IAAA,GACA,EAAA,MAAA,GACA,KAAA,eAAA,IAEA,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,uBCrVA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,WACA,EAAA,OAAA,gBAAA,gBAAA,QAAA,eAAA,qBACA,GACA,QACA,gBACA,gBACA,cACA,eACA,gBACA,kBACA,sBACA,wBAEA,SAAA,SAAA,GACA,EAAA,OAAA,EAAA,KAAA,SAEA,WAAA,SAAA,GACA,EAAA,SAAA,EAAA,KAAA,SAEA,eACA,GACA,cACA,QACA,MACA,SAEA,aAAA,SAAA,GACA,GAAA,GAAA,CAKA,OAJA,KACA,EAAA,EAAA,WAAA,GACA,EAAA,YAAA,KAAA,cAAA,EAAA,cAEA,GAEA,QAAA,SAAA,GACA,EAAA,UAAA,IAEA,cAAA,SAAA,GACA,EAAA,IAAA,EAAA,UAAA,EACA,IAAA,GAAA,KAAA,aAAA,EACA,GAAA,KAAA,IAEA,cAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,KAAA,IAEA,YAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,GAAA,GACA,KAAA,QAAA,EAAA,YAEA,aAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,SAAA,IAEA,cAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,UAAA,IAEA,gBAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EACA,GAAA,OAAA,GACA,KAAA,QAAA,EAAA,YAEA,qBAAA,SAAA,GACA,GAAA,GAAA,EAAA,UAAA,qBAAA,EACA,GAAA,cAAA,IAEA,oBAAA,SAAA,GACA,GAAA,GAAA,EAAA,UAAA,oBAAA,EACA,GAAA,cAAA,IAIA,GAAA,SAAA,GACA,OAAA,uBCxEA,SAAA,GACA,GAAA,GAAA,EAAA,UAGA,IAAA,OAAA,eAAA,EAAA,aAAA,CAEA,GAAA,OAAA,UAAA,iBAAA,CACA,GAAA,GAAA,OAAA,UAAA,gBACA,QAAA,eAAA,OAAA,UAAA,kBACA,MAAA,EACA,YAAA,IAEA,EAAA,eAAA,KAAA,EAAA,cAEA,GAAA,eAAA,QAAA,EAAA,aACA,SAAA,OAAA,cACA,EAAA,eAAA,QAAA,EAAA,YAIA,GAAA,SAAA,YAEA,OAAA,uBC3BA,SAAA,GAIA,QAAA,GAAA,GACA,IAAA,EAAA,WAAA,IAAA,GACA,KAAA,IAAA,OAAA,oBALA,GAEA,GAAA,EAFA,EAAA,EAAA,WACA,EAAA,OAAA,SAOA,GAAA,kBACA,EAAA,SAAA,GACA,EAAA,GACA,KAAA,oBAAA,IAEA,EAAA,SAAA,GACA,EAAA,GACA,KAAA,wBAAA,MAGA,EAAA,SAAA,GACA,EAAA,GACA,EAAA,WAAA,EAAA,OAEA,EAAA,SAAA,GACA,EAAA,GACA,EAAA,eAAA,EAAA,QAGA,OAAA,UAAA,QAAA,UAAA,mBACA,OAAA,iBAAA,QAAA,WACA,mBACA,MAAA,GAEA,uBACA,MAAA,MAIA,OAAA,uBnFDA,oBAAA,UAAA,WAAA,WACA,KAAA,cAAA,GoFtCA,SAAA,GAQA,EAAA,MACA,EAAA,OACA,KAEA,KAAA,SAAA,EAAA,GACA,GAAA,IAAA,EACA,MAAA,EAGA,IAAA,EAAA,SAAA,CACA,GAAA,EAAA,SAAA,GACA,MAAA,EAEA,IAAA,EAAA,SAAA,GACA,MAAA,GAGA,GAAA,GAAA,KAAA,MAAA,GACA,EAAA,KAAA,MAAA,GACA,EAAA,EAAA,CAMA,KALA,EAAA,EACA,EAAA,KAAA,KAAA,EAAA,GAEA,EAAA,KAAA,KAAA,GAAA,GAEA,GAAA,GAAA,IAAA,GACA,EAAA,KAAA,KAAA,EAAA,GACA,EAAA,KAAA,KAAA,EAAA,EAEA,OAAA,IAEA,KAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IACA,EAAA,EAAA,UAEA,OAAA,IAEA,MAAA,SAAA,GAEA,IADA,GAAA,GAAA,EACA,GACA,IACA,EAAA,EAAA,UAEA,OAAA,MAIA,EAAA,QAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,IAAA,KAAA,EAAA,IAEA,OAAA,gBAAA,GACA,OAAA,iBCxDA,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,UACA,UACA,QACA,QACA,gBAGA,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,GAGA,GACA,cAAA,GAAA,SACA,QAAA,GAAA,SACA,YACA,eACA,UAGA,mBAAA,SAAA,EAAA,GACA,GAAA,GAAA,CACA,MAAA,YAAA,GAAA,EACA,EAAA,OAAA,QAAA,SAAA,GACA,GAAA,EAAA,GAAA,CACA,KAAA,OAAA,IAAA,CACA,IAAA,GAAA,EAAA,GAAA,KAAA,EACA,MAAA,WAAA,EAAA,KAEA,OAEA,WAAA,SAAA,EAAA,GACA,GAAA,GAAA,CACA,MAAA,SAAA,KACA,KAAA,SAAA,OAEA,KAAA,SAAA,GAAA,KAAA,IAGA,eAAA,SAAA,GACA,KAAA,OAAA,OAAA,KAAA,KAAA,QAAA,IAGA,iBAAA,SAAA,GACA,KAAA,SAAA,OAAA,KAAA,KAAA,QAAA,IAGA,aAAA,SAAA,GACA,IAAA,KAAA,cAAA,IAAA,GAAA,CAGA,GAAA,GAAA,EAAA,KAAA,EAAA,KAAA,SAAA,EACA,IACA,KAAA,UAAA,EAAA,GAEA,KAAA,cAAA,IAAA,GAAA,KAGA,UAAA,SAAA,EAAA,GAGA,GAAA,GAAA,KAAA,WAAA,EACA,uBAAA,KAAA,SAAA,KAAA,KAAA,EAAA,KAGA,SAAA,SAAA,EAAA,GACA,KAAA,iBAAA,EAAA,SACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,EAEA,MAAA,iBAAA,GAGA,OAAA,SAAA,EAAA,GACA,EAAA,QAAA,SAAA,GACA,KAAA,SAAA,EAAA,KAAA,cAAA,EAAA,IACA,OAGA,SAAA,SAAA,GACA,EAAA,QAAA,SAAA,GACA,KAAA,YAAA,EAAA,KAAA,cAAA,EAAA,WACA,OAEA,SAAA,SAAA,EAAA,EAAA,EAAA,GACA,EAAA,iBAAA,EAAA,EAAA,IAEA,YAAA,SAAA,EAAA,EAAA,EAAA,GACA,EAAA,oBAAA,EAAA,EAAA,IAKA,UAAA,SAAA,EAAA,GACA,MAAA,IAAA,qBAAA,EAAA,IAUA,WAAA,SAAA,GAEA,IAAA,GADA,GAAA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,GAAA,EAAA,IAAA,EAAA,EAEA,OAAA,IAGA,cAAA,SAAA,EAAA,GACA,GAAA,GAAA,GAAA,KAAA,QAAA,IAAA,EACA,KACA,EAAA,cAAA,GACA,EAAA,cACA,KAAA,WAAA,KAAA,oBAIA,mBAAA,SAAA,EAAA,GACA,sBAAA,KAAA,cAAA,KAAA,KAAA,EAAA,KAEA,WAAA,SAAA,GACA,GAAA,GAAA,KAAA,YAAA,GACA,IACA,EAAA,WAAA,IAIA,GAAA,aAAA,EAAA,aAAA,KAAA,GAGA,EAAA,iBACA,EAAA,mBAAA,EACA,EAAA,WAAA,EAUA,EAAA,SAAA,SAAA,GACA,GAAA,EAAA,kBAAA,CACA,GAAA,GAAA,OAAA,qBACA,IACA,EAAA,SAAA,GAEA,EAAA,WAAA,eAAA,OAEA,GAAA,cAAA,KAAA,IAGA,EAAA,SAAA,WACA,OAAA,iBCrLA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,GAEA,WAAA,IAEA,iBAAA,GACA,QACA,cACA,cACA,YACA,iBAEA,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,YAAA,SAAA,GACA,EAAA,YAAA,KAAA,cACA,KAAA,YAAA,EACA,KAAA,OAAA,EAAA,OACA,KAAA,QAAA,YAAA,KAAA,MAAA,KAAA,MAAA,KAAA,cAGA,UAAA,SAAA,GACA,KAAA,aAAA,KAAA,YAAA,YAAA,EAAA,WACA,KAAA,UAGA,cAAA,WACA,KAAA,UAEA,YAAA,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,YAAA,KAAA,YAAA,YACA,QAAA,KAAA,YAAA,QACA,QAAA,KAAA,YAAA,QAEA,KACA,EAAA,SAAA,EAEA,IAAA,GAAA,EAAA,UAAA,EAAA,EACA,GAAA,cAAA,EAAA,KAAA,QACA,EAAA,cACA,EAAA,WAAA,KAAA,YAAA,YAIA,GAAA,mBAAA,OAAA,IACA,OAAA,iBCpBA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,GAAA,GAAA,WACA,GACA,QACA,cACA,cACA,YACA,iBAEA,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,IACA,GAAA,EAAA,EACA,GAAA,EAAA,EACA,IAAA,EAAA,EACA,IAAA,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,OACA,YAAA,EAAA,aAEA,EAAA,EAAA,UAAA,EAAA,EACA,GAAA,cAAA,EACA,EAAA,cAAA,EAAA,EAAA,aAEA,YAAA,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,YAAA,SAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAAA,UACA,IAAA,EACA,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,MAOA,UAAA,SAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAAA,UACA,KACA,EAAA,UACA,KAAA,UAAA,WAAA,EAAA,GAEA,EAAA,OAAA,EAAA,aAGA,cAAA,SAAA,GACA,KAAA,UAAA,IAGA,GAAA,mBAAA,QAAA,IACA,OAAA,iBCxJA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,GAGA,aAAA,GACA,UAAA,EACA,aACA,OAAA,KACA,UAAA,KACA,QACA,cACA,cACA,YACA,iBAEA,YAAA,SAAA,GACA,EAAA,YAAA,KAAA,YACA,KAAA,UAAA,EAAA,UACA,KAAA,OAAA,EAAA,OACA,KAAA,QAAA,KAGA,YAAA,SAAA,GACA,EAAA,YAAA,KAAA,WACA,KAAA,QAAA,IAGA,UAAA,SAAA,GACA,EAAA,YAAA,KAAA,WACA,KAAA,UAAA,GAEA,KAAA,WAEA,cAAA,WACA,KAAA,WAEA,QAAA,WACA,KAAA,aACA,KAAA,OAAA,KACA,KAAA,UAAA,MAEA,QAAA,SAAA,GACA,KAAA,UAAA,QAAA,KAAA,WACA,KAAA,UAAA,QAEA,KAAA,UAAA,KAAA,IAEA,UAAA,SAAA,GAKA,IAAA,GAFA,GAAA,EAAA,EAAA,EAAA,EAAA,EAEA,EAJA,EAAA,EACA,EAAA,KAAA,UAAA,OACA,EAAA,EAAA,EAAA,EAAA,EAAA,EAEA,EAAA,EAAA,EAAA,IAAA,EAAA,KAAA,UAAA,IAAA,IACA,EAAA,EAAA,UAAA,EAAA,UACA,EAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,QAAA,EAAA,QACA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,KAAA,KAAA,EAAA,EAAA,EAAA,GACA,EAAA,IACA,EAAA,EAAA,EAAA,EAAA,EAAA,EAGA,IAAA,GAAA,KAAA,IAAA,GAAA,KAAA,IAAA,GAAA,IAAA,IACA,EAAA,KAAA,UAAA,EAAA,EACA,IAAA,KAAA,IAAA,IAAA,KAAA,aAAA,CACA,GAAA,GAAA,EAAA,UAAA,SACA,UAAA,EACA,UAAA,EACA,SAAA,EACA,MAAA,EACA,UAAA,EACA,YAAA,EAAA,aAEA,GAAA,cAAA,EAAA,KAAA,UAGA,UAAA,SAAA,EAAA,GACA,MAAA,KAAA,KAAA,MAAA,EAAA,GAAA,KAAA,IAGA,GAAA,mBAAA,QAAA,IACA,OAAA,iBC5EA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,GAAA,GAAA,WACA,EAAA,IAAA,KAAA,GACA,GACA,QACA,cACA,cACA,YACA,iBAEA,aACA,YAAA,SAAA,GAEA,GADA,EAAA,IAAA,EAAA,UAAA,GACA,GAAA,EAAA,WAAA,CACA,GAAA,GAAA,KAAA,YACA,EAAA,KAAA,UAAA,EACA,MAAA,WACA,MAAA,EACA,SAAA,EAAA,SACA,OAAA,EAAA,QAAA,EAAA,EAAA,OAAA,EAAA,EAAA,WAIA,UAAA,SAAA,GACA,EAAA,OAAA,EAAA,YAEA,YAAA,SAAA,GACA,EAAA,IAAA,EAAA,aACA,EAAA,IAAA,EAAA,UAAA,GACA,EAAA,WAAA,GACA,KAAA,oBAIA,cAAA,SAAA,GACA,KAAA,UAAA,IAEA,cAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,KAAA,UAAA,SACA,EAAA,EAAA,UAAA,SACA,MAAA,EACA,QAAA,EAAA,OAAA,EACA,QAAA,EAAA,OAAA,GAEA,GAAA,cAAA,EAAA,KAAA,UAAA,SAEA,eAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,OAAA,EAAA,KAAA,UAAA,OAAA,KACA,EAAA,EAAA,UAAA,UACA,MAAA,EACA,QAAA,EAAA,OAAA,EACA,QAAA,EAAA,OAAA,GAEA,GAAA,cAAA,EAAA,KAAA,UAAA,SAEA,gBAAA,WACA,GAAA,GAAA,KAAA,YACA,EAAA,EAAA,SACA,EAAA,KAAA,UAAA,EACA,IAAA,KAAA,UAAA,UACA,KAAA,cAAA,EAAA,GAEA,GAAA,KAAA,UAAA,OACA,KAAA,eAAA,EAAA,IAGA,UAAA,WACA,GAAA,KACA,GAAA,QAAA,SAAA,GACA,EAAA,KAAA,IAMA,KAAA,GADA,GAAA,EAAA,EAHA,EAAA,EAEA,GAAA,EAAA,EAAA,GAAA,EAAA,EAAA,IAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,KAAA,IAAA,EAAA,QAAA,EAAA,SACA,EAAA,KAAA,IAAA,EAAA,QAAA,EAAA,SACA,EAAA,EAAA,EACA,EAAA,IACA,EAAA,EACA,GAAA,EAAA,EAAA,EAAA,IAQA,MAJA,GAAA,KAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EACA,EAAA,KAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EACA,EAAA,QAAA,EAAA,EAAA,EAAA,GACA,EAAA,SAAA,EACA,GAEA,UAAA,SAAA,GACA,GAAA,GAAA,EAAA,EAAA,QAAA,EAAA,EAAA,QACA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,OACA,QAAA,IAAA,KAAA,MAAA,EAAA,GAAA,GAAA,KAGA,GAAA,mBAAA,QAAA,IACA,OAAA,iBCvHA,SAAA,GACA,GAAA,GAAA,EAAA,WACA,EAAA,GAAA,GAAA,WACA,GACA,QACA,cACA,cACA,YACA,gBACA,SAEA,YAAA,SAAA,GACA,EAAA,YAAA,EAAA,cACA,EAAA,IAAA,EAAA,WACA,OAAA,EAAA,OACA,QAAA,EAAA,QACA,EAAA,EAAA,QACA,EAAA,EAAA,WAIA,YAAA,SAAA,GACA,GAAA,EAAA,UAAA,CACA,GAAA,GAAA,EAAA,IAAA,EAAA,UACA,IACA,EAAA,cACA,EAAA,OAAA,EAAA,aAKA,UAAA,SAAA,EAAA,GACA,MAAA,GAAA,aAAA,OACA,UAAA,EAAA,YAEA,IAAA,EAAA,SAEA,GAIA,UAAA,SAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAAA,UACA,IAAA,GAAA,KAAA,UAAA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,QAAA,EAAA,OAAA,EAAA,OACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,UAAA,OACA,EAAA,EAAA,QACA,EAAA,EAAA,QACA,OAAA,EAAA,OACA,YAAA,EAAA,aAEA,GAAA,cAAA,EAAA,IAGA,EAAA,OAAA,EAAA,YAEA,cAAA,SAAA,GACA,EAAA,OAAA,EAAA,YAEA,MAAA,SAAA,GACA,GAAA,GAAA,EAAA,OAEA,IAAA,KAAA,EAAA,CACA,GAAA,GAAA,EAAA,MACA,aAAA,mBAAA,YAAA,sBACA,EAAA,cAAA,EAAA,UAAA,OACA,EAAA,EACA,EAAA,EACA,OAAA,EACA,YAAA,gBACA,KAIA,WAAA,SAAA,GACA,EAAA,OAAA,IAGA,GAAA,mBAAA,MAAA,IACA,OAAA,iBCzGA,SAAA,GAEA,QAAA,KACA,EAAA,mBAAA,CACA,IAAA,GAAA,EAAA,aACA,GAAA,QAAA,EAAA,UACA,EAAA,OAAA,EALA,GAAA,GAAA,EAAA,UAOA,cAAA,SAAA,WACA,IAIA,SAAA,iBAAA,mBAAA,WACA,aAAA,SAAA,YACA,OAIA,OAAA,iBCtBA,WACA,YAIA,SAAA,GAAA,GACA,KAAA,EAAA,YACA,EAAA,EAAA,UAGA,OAAA,kBAAA,GAAA,eAAA,EAAA,KAOA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,SAOA,OANA,KACA,EAAA,EAAA,cAEA,EAAA,IACA,EAAA,GAAA,QAEA,EAAA,GAAA,EAGA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,GAGA,QAAA,GAAA,GACA,MAAA,OAAA,EAAA,GAAA,EAGA,QAAA,GAAA,EAAA,GACA,EAAA,KAAA,EAAA,GAGA,QAAA,GAAA,GACA,MAAA,UAAA,GACA,MAAA,GAAA,EAAA,IA6BA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,MAAA,QACA,EACA,EAAA,aAAA,EAAA,IAEA,EAAA,gBAAA,QAIA,GAAA,aAAA,EAAA,EAAA,IAGA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,UAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAiDA,QAAA,GAAA,GACA,OAAA,EAAA,MACA,IAAA,WACA,MAAA,EACA,KAAA,QACA,IAAA,kBACA,IAAA,aACA,MAAA,QACA,KAAA,QACA,GAAA,eAAA,KAAA,UAAA,WACA,MAAA,QACA,SACA,MAAA,SAIA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,IAAA,GAAA,GAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,UAAA,GACA,MAAA,GAAA,EAAA,EAAA,EAAA,IAIA,QAAA,MAEA,QAAA,GAAA,EAAA,EAAA,EAAA,GAGA,QAAA,KACA,EAAA,SAAA,EAAA,IACA,EAAA,kBACA,GAAA,GAAA,GACA,SAAA,6BANA,GAAA,GAAA,EAAA,EAUA,OAFA,GAAA,iBAAA,EAAA,IAGA,MAAA,WACA,EAAA,oBAAA,EAAA,GACA,EAAA,SAGA,YAAA,GAIA,QAAA,GAAA,GACA,MAAA,SAAA,GAYA,QAAA,GAAA,GACA,GAAA,EAAA,KACA,MAAA,GAAA,EAAA,KAAA,SAAA,SAAA,GACA,MAAA,IAAA,GACA,SAAA,EAAA,SACA,SAAA,EAAA,MACA,EAAA,MAAA,EAAA,MAGA,IAAA,GAAA,EAAA,EACA,KAAA,EACA,QACA,IAAA,GAAA,EAAA,iBACA,6BAAA,EAAA,KAAA,KACA,OAAA,GAAA,EAAA,SAAA,GACA,MAAA,IAAA,IAAA,EAAA,OAKA,QAAA,GAAA,GAIA,UAAA,EAAA,SACA,UAAA,EAAA,MACA,EAAA,GAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,UAAA,OACA,IAEA,EAAA,YAAA,UAAA,KA4CA,QAAA,GAAA,EAAA,GACA,GACA,GACA,EACA,EAHA,EAAA,EAAA,UAIA,aAAA,oBACA,EAAA,WACA,EAAA,UAAA,QACA,EAAA,EACA,EAAA,EAAA,UAAA,MACA,EAAA,EAAA,OAGA,EAAA,MAAA,EAAA,GAEA,GAAA,EAAA,OAAA,IACA,EAAA,YAAA,SAAA,EAAA,OACA,EAAA,YAAA,iBACA,SAAA,8BAIA,QAAA,GAAA,GACA,MAAA,UAAA,GACA,EAAA,EAAA,IAnSA,GAAA,GAAA,MAAA,UAAA,OAAA,KAAA,KAAA,MAAA,UAAA,OAUA,MAAA,UAAA,KAAA,SAAA,EAAA,GACA,QAAA,MAAA,8BAAA,KAAA,EAAA,GAgCA,IAAA,GAAA,CAEA,QAAA,eAAA,SAAA,4BACA,IAAA,WACA,MAAA,KAAA,GAEA,IAAA,SAAA,GAEA,MADA,GAAA,EAAA,EAAA,EACA,GAEA,cAAA,IAGA,KAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,gBAAA,EACA,MAAA,MAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAEA,IAAA,EACA,MAAA,GAAA,KAAA,EAEA;GAAA,GAAA,CAEA,OADA,GAAA,KAAA,EAAA,KAAA,EAAA,QACA,EAAA,KAAA,EAAA,IAqBA,QAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,EAAA,EAAA,OAAA,EAMA,IALA,IACA,KAAA,gBAAA,GACA,EAAA,EAAA,MAAA,EAAA,KAGA,EACA,MAAA,GAAA,KAAA,EAAA,EAAA,EAGA,IAAA,GAAA,CAIA,OAHA,GAAA,KAAA,EAAA,EACA,EAAA,KAAA,EAAA,KAAA,EAAA,KAEA,EAAA,KAAA,EAAA,GAGA,IAAA,IACA,WAGA,GAAA,GAAA,SAAA,cAAA,OACA,EAAA,EAAA,YAAA,SAAA,cAAA,SACA,GAAA,aAAA,OAAA,WACA,IAAA,GACA,EAAA,CACA,GAAA,iBAAA,QAAA,WACA,IACA,EAAA,GAAA,UAEA,EAAA,iBAAA,SAAA,WACA,IACA,EAAA,GAAA,UAGA,IAAA,GAAA,SAAA,YAAA,aACA,GAAA,eAAA,SAAA,GAAA,EAAA,OAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,MACA,EAAA,cAAA,GAGA,EAAA,GAAA,EAAA,SAAA,KAqGA,iBAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,UAAA,GAAA,YAAA,EACA,MAAA,aAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAEA,MAAA,gBAAA,EACA,IAAA,GAAA,WAAA,EAAA,EAAA,EACA,EAAA,WAAA,EAAA,EAAA,CAEA,IAAA,EACA,MAAA,GAAA,KAAA,EAAA,EAAA,EAGA,IAAA,GAAA,EACA,EAAA,EAAA,KAAA,EAAA,EAAA,EAMA,OALA,GAAA,KAAA,EACA,EAAA,KAAA,EAAA,KAAA,EAAA,IACA,GAGA,EAAA,KAAA,EAAA,IAGA,oBAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,UAAA,EACA,MAAA,aAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAIA,IAFA,KAAA,gBAAA,SAEA,EACA,MAAA,GAAA,KAAA,QAAA,EAEA,IAAA,GAAA,EACA,EAAA,EAAA,KAAA,QAAA,EAGA,OAFA,GAAA,KAAA,QACA,EAAA,KAAA,EAAA,KAAA,QAAA,KACA,EAAA,KAAA,EAAA,IA+BA,kBAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,UAAA,EACA,MAAA,aAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAIA,IAFA,KAAA,gBAAA,SAEA,EACA,MAAA,GAAA,KAAA,EAEA,IAAA,GAAA,EACA,EAAA,EAAA,KAAA,QAAA,EAEA,OADA,GAAA,KAAA,EAAA,KAAA,EAAA,QACA,EAAA,KAAA,EAAA,IAGA,kBAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GAIA,GAHA,kBAAA,IACA,EAAA,iBAEA,kBAAA,GAAA,UAAA,EACA,MAAA,aAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAIA,IAFA,KAAA,gBAAA,GAEA,EACA,MAAA,GAAA,KAAA,EAAA,EAEA,IAAA,GAAA,EACA,EAAA,EAAA,KAAA,EAAA,EAKA,OAJA,GAAA,KAAA,EACA,EAAA,KAAA,EAAA,KAAA,KAGA,EAAA,KAAA,EAAA,KAEA,MC7UA,SAAA,GACA,YAEA,SAAA,GAAA,GACA,IAAA,EACA,KAAA,IAAA,OAAA,oBAKA,QAAA,GAAA,GAEA,IADA,GAAA,GACA,EAAA,EAAA,YACA,EAAA,CAGA,OAAA,GAGA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CAKA,IAFA,GAAA,GACA,EAAA,IAAA,GACA,IACA,EAAA,EAAA,GAEA,EAAA,cACA,EAAA,EAAA,cAAA,cAAA,GACA,EAAA,iBACA,EAAA,EAAA,eAAA,KAEA,GAAA,EAAA,mBAGA,EAAA,EAAA,gBAGA,OAAA,IAiIA,QAAA,GAAA,GACA,MAAA,YAAA,EAAA,SACA,8BAAA,EAAA,aAGA,QAAA,GAAA,GACA,MAAA,YAAA,EAAA,SACA,gCAAA,EAAA,aAGA,QAAA,GAAA,GACA,MAAA,SAAA,EAAA,EAAA,UACA,EAAA,aAAA,aAGA,QAAA,GAAA,GAIA,MAHA,UAAA,EAAA,cACA,EAAA,YAAA,YAAA,EAAA,SAAA,EAAA,IAEA,EAAA,YAYA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBAAA,EAEA,GAAA,IACA,EAAA,GACA,EAAA,EAAA,GAGA,QAAA,GAAA,GACA,QAAA,GAAA,GACA,oBAAA,SAAA,IACA,EAAA,EAAA,SAGA,EAAA,EAAA,GAgBA,QAAA,GAAA,EAAA,GACA,OAAA,oBAAA,GAAA,QAAA,SAAA,GACA,OAAA,eAAA,EAAA,EACA,OAAA,yBAAA,EAAA,MAKA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,aACA,KAAA,EAAA,YACA,MAAA,EACA,IAAA,GAAA,EAAA,sBACA,KAAA,EAAA,CAIA,IADA,EAAA,EAAA,eAAA,mBAAA,IACA,EAAA,WACA,EAAA,YAAA,EAAA,UAEA,GAAA,uBAAA,EAEA,MAAA,GAGA,QAAA,GAAA,GACA,IAAA,EAAA,iBAAA,CACA,GAAA,GAAA,EAAA,aACA,KAAA,EAAA,iBAAA,CACA,EAAA,iBAAA,EAAA,eAAA,mBAAA,GAKA,IAAA,GAAA,EAAA,iBAAA,cAAA,OACA,GAAA,KAAA,SAAA,QACA,EAAA,iBAAA,KAAA,YAAA,GAEA,EAAA,iBAAA,iBAAA,EAAA,iBAGA,EAAA,iBAAA,EAAA,iBAGA,MAAA,GAAA,iBAgBA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,cAAA,cAAA,WACA,GAAA,WAAA,aAAA,EAAA,EAIA,KAFA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,OACA,IAAA,GAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,EAAA,QACA,aAAA,EAAA,MACA,EAAA,aAAA,EAAA,KAAA,EAAA,OACA,EAAA,gBAAA,EAAA,OAIA,MAAA,GAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,cAAA,cAAA,WACA,GAAA,WAAA,aAAA,EAAA,EAIA,KAFA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,OACA,IAAA,GAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,aAAA,EAAA,KAAA,EAAA,OACA,EAAA,gBAAA,EAAA,MAIA,MADA,GAAA,WAAA,YAAA,GACA,EAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,OACA,IAAA,EAEA,WADA,GAAA,YAAA,EAKA,KADA,GAAA,GACA,EAAA,EAAA,YACA,EAAA,YAAA,GA4FA,QAAA,GAAA,GACA,EACA,EAAA,UAAA,oBAAA,UAEA,EAAA,EAAA,oBAAA,WAGA,QAAA,GAAA,GACA,EAAA,cACA,EAAA,YAAA,WACA,EAAA,sBAAA,CACA,IAAA,GAAA,EAAA,EACA,EAAA,WAAA,EAAA,UAAA,eACA,GAAA,EAAA,EAAA,EAAA,UAIA,EAAA,uBACA,EAAA,sBAAA,EACA,SAAA,QAAA,EAAA,cAkNA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,OAAA,CAOA,IAJA,GAAA,GACA,EAAA,EAAA,OACA,EAAA,EAAA,EAAA,EAAA,EAAA,EACA,GAAA,EACA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,QAAA,KAAA,GACA,EAAA,EAAA,QAAA,KAAA,GACA,GAAA,EACA,EAAA,IAWA,IATA,GAAA,IACA,EAAA,GAAA,EAAA,KACA,EAAA,EACA,GAAA,EACA,EAAA,MAGA,EAAA,EAAA,EAAA,GAAA,EAAA,QAAA,EAAA,EAAA,GAEA,EAAA,EAAA,CACA,IAAA,EACA,MAEA,GAAA,KAAA,EAAA,MAAA,GACA,OAGA,EAAA,MACA,EAAA,KAAA,EAAA,MAAA,EAAA,GACA,IAAA,GAAA,EAAA,MAAA,EAAA,EAAA,GAAA,MACA,GAAA,KAAA,GACA,EAAA,GAAA,CACA,IAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAGA,GAAA,KADA,MAAA,EACA,KAAA,IAAA,GAEA,MAEA,EAAA,KAAA,GACA,EAAA,EAAA,EAyBA,MAtBA,KAAA,GACA,EAAA,KAAA,IAEA,EAAA,WAAA,IAAA,EAAA,OACA,EAAA,aAAA,EAAA,YACA,IAAA,EAAA,IACA,IAAA,EAAA,GACA,EAAA,YAAA,EAEA,EAAA,WAAA,SAAA,GAGA,IAAA,GAFA,GAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,WAAA,EAAA,GAAA,EAAA,GAAA,EACA,UAAA,IACA,GAAA,GACA,GAAA,EAAA,EAAA,GAGA,MAAA,IAGA,GAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,EAAA,WAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,GAAA,GACA,EAAA,GAAA,aAAA,EACA,OAAA,GAAA,aAAA,EAAA,EAAA,WAAA,GAIA,IAAA,GADA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAAA,EACA,IAAA,EAAA,GAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,GAAA,aAAA,GAGA,MAAA,GAAA,WAAA,GAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,GAAA,GACA,GAAA,cAAA,EAAA,EAAA,GAEA,OAAA,GAAA,aAAA,EACA,GAAA,mBAAA,EAAA,EAAA,YAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,EAAA,YACA,MAAA,GAAA,EAAA,EAAA,EAAA,EAEA,IAAA,EAAA,WACA,MAAA,GAAA,EAAA,EAAA,EAAA,EAIA,KAAA,GAFA,GAAA,GAAA,kBAEA,EAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAEA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAAA,EAAA,EACA,GACA,EAAA,QAAA,GAEA,EAAA,YAAA,OALA,CASA,GAAA,GAAA,EAAA,EAAA,EACA,GACA,EAAA,QAAA,EAAA,aAAA,IAEA,EAAA,QAAA,EAAA,IAGA,MAAA,IAAA,mBAAA,EAAA,EAAA,YAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,KAAA,EAAA,EAAA,EAAA,YACA,IAAA,GACA,EAAA,KAAA,GAGA,GAAA,EAAA,WAAA,CAGA,EAAA,OAAA,CACA,IAAA,GAAA,EAAA,0BAAA,EACA,IAAA,GACA,EAAA,KAAA,IAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,aAAA,EACA,OAAA,GAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAMA,KAAA,GAJA,MAIA,EAAA,EAAA,EAAA,EAAA,WAAA,OAAA,IAAA,CAUA,IATA,GAAA,GAAA,EAAA,WAAA,GACA,EAAA,EAAA,KACA,EAAA,EAAA,MAOA,MAAA,EAAA,IACA,EAAA,EAAA,UAAA,EAGA,KAAA,EAAA,IACA,IAAA,GAAA,IAAA,GAAA,IAAA,EADA,CAKA,GAAA,GAAA,EAAA,EAAA,EAAA,EACA,EACA,IAGA,EAAA,KAAA,EAAA,IAaA,MAVA,GAAA,KACA,EAAA,YAAA,EACA,EAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,KAAA,EAAA,EAAA,EAAA,GACA,EAAA,OAAA,EAAA,EAAA,EAAA,IAEA,EAAA,IAAA,EAAA,MAAA,EAAA,SACA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,KAGA,EAGA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,WAAA,KAAA,aACA,MAAA,GAAA,EAAA,EAEA,IAAA,EAAA,WAAA,KAAA,UAAA,CACA,GAAA,GAAA,EAAA,EAAA,KAAA,cAAA,EACA,EACA,IAAA,EACA,OAAA,cAAA,GAGA,SAGA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EACA,EACA,GAKA,IAAA,GAHA,GAAA,EAAA,YAAA,EAAA,WAAA,GAAA,IAEA,EAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,EAAA,EAAA,EACA,EAAA,SAAA,KACA,EACA,EACA,EAUA,OAPA,GAAA,aACA,oBAAA,SAAA,EAAA,GACA,GACA,EAAA,aAAA,IAGA,EAAA,EAAA,EAAA,EAAA,GACA,EAGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,EACA,GAAA,WAEA,KAAA,GADA,GAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,SAAA,KAAA,EAAA,EAAA,EAGA,OAAA,GAeA,QAAA,GAAA,GACA,KAAA,QAAA,EACA,KAAA,iBAAA,EACA,KAAA,aACA,KAAA,KAAA,OACA,KAAA,iBACA,KAAA,aAAA,OACA,KAAA,cAAA,OAr5BA,GAyCA,GAzCA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,QA0CA,GAAA,KAAA,kBAAA,GAAA,IAAA,UAAA,QACA,EAAA,EAAA,KAEA,EAAA,WACA,KAAA,QACA,KAAA,WAGA,EAAA,WACA,IAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,KAAA,QAAA,EACA,GAAA,GACA,KAAA,KAAA,KAAA,GACA,KAAA,OAAA,KAAA,IAEA,KAAA,OAAA,GAAA,GAIA,IAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,QAAA,EACA,MAAA,EAAA,GAGA,MAAA,MAAA,OAAA,IAGA,SAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,QAAA,EACA,OAAA,GAAA,GACA,GAEA,KAAA,KAAA,OAAA,EAAA,GACA,KAAA,OAAA,OAAA,EAAA,IACA,IAGA,QAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,KAAA,OAAA,IACA,EAAA,KAAA,GAAA,KAAA,KAAA,OAAA,GAAA,KAAA,KAAA,GAAA,QAyBA,mBAAA,UAAA,WACA,SAAA,UAAA,SAAA,SAAA,GACA,MAAA,KAAA,MAAA,EAAA,aAAA,MACA,EACA,KAAA,gBAAA,SAAA,IAIA,IAAA,GAAA,OACA,EAAA,SACA,EAAA,KAEA,GACA,UAAA,EACA,QAAA,EACA,MAAA,EACA,KAAA,GAGA,GACA,OAAA,EACA,OAAA,EACA,OAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,UAAA,EACA,KAAA,EACA,SAAA,EACA,QAAA,EACA,UAAA,GAGA,EAAA,mBAAA,oBACA,KAIA,WACA,GAAA,GAAA,SAAA,cAAA,YACA,EAAA,EAAA,QAAA,cACA,EAAA,EAAA,YAAA,EAAA,cAAA,SACA,EAAA,EAAA,YAAA,EAAA,cAAA,SACA,EAAA,EAAA,cAAA,OACA,GAAA,KAAA,SAAA,QACA,EAAA,YAAA,KAIA,IAAA,GAAA,aACA,OAAA,KAAA,GAAA,IAAA,SAAA,GACA,MAAA,GAAA,cAAA,eACA,KAAA,KA2BA,UAAA,iBAAA,mBAAA,WACA,EAAA,UAEA,SAAA,+BACA,GAmBA,IAMA,EAAA,oBAAA,WACA,KAAA,WAAA,wBAIA,IA6GA,GA7GA,EAAA,eA8GA,mBAAA,oBACA,EAAA,GAAA,kBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,OAAA,iBAWA,oBAAA,SAAA,SAAA,EAAA,GACA,GAAA,EAAA,qBACA,OAAA,CAEA,IAAA,GAAA,CACA,GAAA,sBAAA,CAEA,IAAA,GAAA,EAAA,IACA,EACA,EAAA,EACA,GAAA,EACA,GAAA,CAgBA,IAdA,IACA,EAAA,IACA,GAAA,GACA,EAAA,EAAA,GACA,EAAA,sBAAA,EACA,EAAA,EACA,GAAA,GACA,EAAA,KACA,EAAA,EAAA,GACA,EAAA,sBAAA,EACA,EAAA,KAIA,EAAA,CACA,EAAA,EACA,IAAA,GAAA,EAAA,EACA,GAAA,SAAA,EAAA,yBAeA,MAZA,GAGA,EAAA,aAAA,EACA,EACA,EAAA,EACA,EACA,GACA,GACA,EAAA,EAAA,UAGA,GAOA,oBAAA,UAAA,CAEA,IAAA,GAAA,EAAA,oBAAA,YAEA,GACA,IAAA,WACA,MAAA,MAAA,UAEA,YAAA,EACA,cAAA,EAGA,KAGA,oBAAA,UAAA,OAAA,OAAA,EAAA,WAEA,OAAA,eAAA,oBAAA,UAAA,UACA,IA0BA,EAAA,oBAAA,WACA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,OAAA,EACA,MAAA,SAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAEA,IAAA,GAAA,KACA,EAAA,EAAA,EAAA,EAAA,KAAA,SAAA,GACA,EAAA,aAAA,MAAA,GACA,EAAA,eAKA,OAFA,MAAA,aAAA,MAAA,GACA,KAAA,cACA,EAAA,QAGA,KAAA,UAGA,KAAA,UAAA,IAAA,EAFA,KAAA,WAAA,IAAA,GAKA,IAGA,0BAAA,SAAA,GAIA,MAHA,MAAA,WACA,KAAA,UAAA,YAEA,EAAA,IAAA,EAAA,MAAA,EAAA,QASA,KAAA,YACA,KAAA,UAAA,GAAA,GAAA,OAGA,KAAA,UAAA,mBAAA,EAAA,KAAA,QAEA,GACA,EAAA,QAAA,MAAA,YAAA,EACA,iBAAA,SAGA,KAAA,gBAnBA,KAAA,YACA,KAAA,UAAA,QACA,KAAA,UAAA,UAoBA,eAAA,SAAA,EAAA,EAAA,GACA,IACA,EAAA,KAAA,aAAA,IAEA,KAAA,cACA,KAAA,YAAA,KAAA,KAAA,QACA,IAAA,GAAA,KAAA,WACA,IAAA,OAAA,EAAA,WACA,MAAA,EAEA,IAAA,GAAA,KAAA,WACA,IAAA,EAAA,UAAA,IAGA,EAAA,EAAA,EACA,GAAA,EAAA,oBACA,EAAA,QAAA,EACA,KAAA,YAAA,EAGA,IAAA,GAAA,EAAA,MACA,EAAA,EAAA,wBACA,GAAA,iBAAA,KACA,EAAA,cAAA,EACA,EAAA,aACA,EAAA,YAAA,IASA,KAAA,GARA,GAAA,EAAA,mBACA,UAAA,KACA,SAAA,KACA,MAAA,GAGA,EAAA,EACA,GAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YAAA,CAKA,OAAA,EAAA,cACA,GAAA,EAEA,IAAA,GAAA,EAAA,EAAA,EAAA,EACA,EAAA,SAAA,KACA,EACA,EACA,EAAA,UACA,GAAA,kBAAA,EACA,IACA,EAAA,YAAA,GAOA,MAJA,GAAA,UAAA,EAAA,WACA,EAAA,SAAA,EAAA,UACA,EAAA,iBAAA,OACA,EAAA,cAAA,OACA,GAGA,GAAA,SACA,MAAA,MAAA,QAGA,GAAA,OAAA,GACA,KAAA,OAAA,EACA,EAAA,OAGA,GAAA,mBACA,MAAA,MAAA,WAAA,KAAA,UAAA,KAGA,YAAA,WACA,KAAA,WAAA,KAAA,cAAA,KAAA,KAAA,UAGA,KAAA,YAAA,OACA,KAAA,UAAA,eACA,KAAA,UAAA,wBAGA,MAAA,WACA,KAAA,OAAA,OACA,KAAA,UAAA,OACA,KAAA,WAAA,KAAA,UAAA,KACA,KAAA,UAAA,IAAA,QACA,KAAA,YAAA,OACA,KAAA,YAEA,KAAA,UAAA,eACA,KAAA,UAAA,QACA,KAAA,UAAA,SAGA,aAAA,SAAA,GACA,KAAA,UAAA,EACA,KAAA,YAAA,OACA,KAAA,YACA,KAAA,UAAA,2BAAA,OACA,KAAA,UAAA,iBAAA,SAIA,aAAA,SAAA,GAIA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,EAAA,EACA,IAAA,kBAAA,GAGA,MAAA,YACA,MAAA,GAAA,MAAA,EAAA,YATA,MAAA,IAcA,IAAA,EACA,eAAA,EAAA,kBACA,qBAAA,EAAA,wBACA,+BACA,EAAA,uCAOA,GAAA,iBAAA,GACA,GAAA,KAAA,UACA,KAAA,OAAA,wEAIA,MAAA,aAAA,KAAA,aAAA,KAGA,GAAA,QACA,GAAA,GAAA,EAAA,KAAA,KAAA,aAAA,OAIA,IAHA,IACA,EAAA,KAAA,eAEA,EACA,MAAA,KAEA,IAAA,GAAA,EAAA,IACA,OAAA,GAAA,EAAA,KAoQA,OAAA,eAAA,KAAA,UAAA,oBACA,IAAA,WACA,GAAA,GAAA,KAAA,iBACA,OAAA,GAAA,EACA,KAAA,WAAA,KAAA,WAAA,iBAAA,SAIA,IAAA,GAAA,SAAA,wBACA,GAAA,aACA,EAAA,YAAA,KAYA,EAAA,WACA,UAAA,WACA,GAAA,GAAA,KAAA,IACA,KACA,EAAA,aAAA,GACA,EAAA,QAAA,QACA,EAAA,WAAA,GACA,EAAA,MAAA,UAIA,mBAAA,SAAA,EAAA,GACA,KAAA,WAEA,IAAA,GAAA,KAAA,QACA,EAAA,KAAA,gBAEA,IAAA,EAAA,GAAA,CAMA,GALA,EAAA,OAAA,EACA,EAAA,UAAA,EAAA,GAAA,YACA,EAAA,QAAA,EAAA,EAAA,EAAA,GAAA,EAAA,GAGA,EAAA,YAAA,EAAA,QAEA,WADA,MAAA,qBAIA,GAAA,WACA,EAAA,QAAA,KAAA,KAAA,oBAAA,MAGA,EAAA,QACA,EAAA,QAAA,EACA,EAAA,QAAA,EAAA,OAAA,YACA,EAAA,MAAA,EAAA,EAAA,EAAA,OAAA,EAAA,KAEA,EAAA,QAAA,EACA,EAAA,QAAA,EAAA,KAAA,YACA,EAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,IAGA,EAAA,SACA,EAAA,MAAA,KAAA,KAAA,oBAAA,MAEA,KAAA,uBAGA,oBAAA,WACA,GAAA,KAAA,KAAA,MAAA,CACA,GAAA,GAAA,KAAA,KAAA,OAGA,IAFA,KAAA,KAAA,YACA,EAAA,EAAA,mBACA,EAEA,WADA,MAAA,eAKA,GAAA,GAAA,KAAA,KAAA,KACA,MAAA,KAAA,UACA,EAAA,EAAA,kBACA,KAAA,KAAA,SACA,GAAA,GACA,IAAA,GAAA,KAAA,KAAA,SACA,KAAA,KAAA,SACA,MAAA,QAAA,EACA,MAAA,aAAA,EAAA,IAGA,aAAA,SAAA,EAAA,GACA,MAAA,QAAA,KACA,MAEA,IAAA,KAAA,gBAGA,KAAA,YACA,KAAA,aAAA,EACA,IACA,KAAA,cAAA,GAAA,eAAA,KAAA,cACA,KAAA,cAAA,KAAA,KAAA,cAAA,OAGA,KAAA,cAAA,cAAA,iBAAA,KAAA,aACA,KAAA,kBAGA,oBAAA,SAAA,GACA,GAAA,IAAA,EACA,MAAA,MAAA,gBACA,IAAA,GAAA,KAAA,UAAA,GACA,EAAA,EAAA,WACA,KAAA,EACA,MAAA,MAAA,oBAAA,EAAA,EAEA,IAAA,EAAA,WAAA,KAAA,cACA,KAAA,mBAAA,EACA,MAAA,EAGA,IAAA,GAAA,EAAA,SACA,OAAA,GAGA,EAAA,sBAFA,GAKA,oBAAA,WACA,MAAA,MAAA,oBAAA,KAAA,UAAA,OAAA,IAGA,iBAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,oBAAA,EAAA,GACA,EAAA,KAAA,iBAAA,UACA,MAAA,UAAA,OAAA,EAAA,EAAA,GAEA,EAAA,aAAA,EAAA,EAAA,cAGA,kBAAA,SAAA,GAMA,IALA,GAAA,GAAA,KAAA,oBAAA,EAAA,GACA,EAAA,KAAA,oBAAA,GACA,EAAA,KAAA,iBAAA,WACA,EAAA,KAAA,UAAA,OAAA,EAAA,GAAA,GAEA,IAAA,GAAA,CACA,GAAA,GAAA,EAAA,WACA,IAAA,IACA,EAAA,GAEA,EAAA,YAAA,EAAA,YAAA,IAGA,MAAA,IAGA,cAAA,SAAA,GAEA,MADA,GAAA,GAAA,EAAA,KAAA,kBACA,kBAAA,GAAA,EAAA,MAGA,cAAA,SAAA,GACA,IAAA,KAAA,QAAA,EAAA,OAAA,CAGA,GAAA,GAAA,KAAA,gBAEA,KAAA,EAAA,WAEA,WADA,MAAA,OAIA,eAAA,aAAA,KAAA,cAAA,KAAA,aACA,EAEA,IAAA,GAAA,EAAA,SACA,UAAA,KAAA,mBACA,KAAA,iBACA,KAAA,cAAA,GAAA,EAAA,uBAGA,SAAA,KAAA,6BACA,KAAA,2BACA,KAAA,cAAA,GACA,EAAA,gCAMA,KAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAGA,IAAA,GAFA,GAAA,EAAA,GACA,EAAA,EAAA,QACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,KAAA,kBAAA,EAAA,MAAA,EACA,KAAA,GACA,EAAA,IAAA,EAAA,GAIA,GAAA,EAAA,WAIA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAGA,IAFA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,MACA,EAAA,EAAA,MAAA,EAAA,WAAA,IAAA,CACA,GAAA,GAAA,KAAA,cAAA,GACA,EAAA,EAAA,IAAA,EACA,GACA,EAAA,OAAA,IAEA,KAAA,mBACA,EAAA,KAAA,iBAAA,IAIA,EADA,SAAA,EACA,EAEA,EAAA,eAAA,EAAA,OAAA,IAIA,KAAA,iBAAA,EAAA,GAIA,EAAA,QAAA,SAAA,GACA,KAAA,sBAAA,IACA,MAEA,KAAA,4BACA,KAAA,qBAAA,KAGA,oBAAA,SAAA,GACA,GAAA,GAAA,KAAA,UAAA,EACA,KAAA,GAGA,KAAA,2BAAA,EAAA,kBAAA,IAGA,qBAAA,SAAA,GAGA,IAAA,GAFA,GAAA,EACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,GAAA,EACA,KAAA,EAAA,EAAA,OACA,KAAA,oBAAA,GACA,QAGA,GAAA,EAAA,KAGA,MAAA,EAAA,EAAA,MAAA,EAAA,YACA,KAAA,oBAAA,GACA,GAGA,IAAA,EAAA,WAAA,EAAA,QAAA,OAGA,GAAA,GAAA,EAIA,IADA,GAAA,GAAA,KAAA,UAAA,OACA,EAAA,GACA,KAAA,oBAAA,GACA,KAIA,sBAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,UACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,SAIA,UAAA,WACA,KAAA,gBAGA,KAAA,cAAA,QACA,KAAA,cAAA,SAGA,MAAA,WACA,IAAA,KAAA,OAAA,CAEA,KAAA,WACA,KAAA,GAAA,GAAA,EAAA,EAAA,KAAA,UAAA,OAAA,IACA,KAAA,sBAAA,KAAA,UAAA,GAGA,MAAA,UAAA,OAAA,EACA,KAAA,YACA,KAAA,iBAAA,UAAA,OACA,KAAA,QAAA,KAKA,oBAAA,qBAAA,GACA,MCzqCA,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,oBAAA,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,CAIA,KAFA,EAAA,IAEA,EAAA,MAAA,EAAA,MACA,EAAA,MACA,EAAA,IACA,EAAA,EAAA,uBAAA,IAAA,EAAA,KAEA,EAAA,IACA,EAAA,EAAA,uBAAA,IAAA,EAAA,GAIA,OAAA,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,IAn+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,oCA2qBA,IAAA,IAAA,EAuJA,GAAA,CA6GA,GAAA,SACA,MAAA,IAEA,MCrgCA,SAAA,GACA,YAqBA,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,GAGA,KAAA,GACA,YAAA,IACA,KAAA,IAAA,EAAA,OAAA,QACA,EAAA,IACA,EAAA,GAAA,GAAA,EAAA,QAGA,KAAA,YAAA,kBAAA,IAAA,EAAA,QAEA,KAAA,QAAA,kBAAA,IACA,EAAA,SACA,KAAA,EAEA,KAAA,YACA,KAAA,UACA,KAAA,aACA,YAAA,KACA,YAAA,IAAA,YAAA,IAEA,KAAA,OAAA,KAAA,WAAA,EAAA,EAAA,GACA,KAAA,SAAA,KAAA,EAAA,EAAA,EAAA,GAoEA,QAAA,GAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,OACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,KAAA,KAAA,GAAA,EAAA,EAAA,IA2CA,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,EA6GA,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,gBAIA,QAAA,GAAA,GACA,MAAA,MAAA,EAAA,IACA,MAAA,EAAA,IACA,MAAA,EAAA,GAoBA,QAAA,GAAA,EAAA,GACA,KAAA,EAAA,KACA,OAAA,UAAA,eAAA,KAAA,EAAA,IACA,EAAA,EAAA,EAGA,OAAA,GAGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,OACA,MAAA,OAEA,IAAA,GAAA,EAAA,OACA,MAAA,GAAA,EAAA,EAAA,GAEA,KAAA,GAAA,GAAA,EAAA,MAAA,GAAA,EAAA,EAAA,OAAA,EAAA,IACA,EAAA,EAAA,EAAA,GAGA,OAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,UAAA,EAGA,OAFA,GAAA,EAAA,IAAA,EAEA,SAAA,EAAA,EAAA,GA2BA,QAAA,KACA,MAAA,MAAA,EAAA,MA3BA,GAAA,GAAA,EAAA,CAuBA,OArBA,GADA,kBAAA,GAAA,oBACA,SAAA,GACA,EAAA,GAAA,EAAA,oBAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,OAAA,EAAA,eAEA,UAAA,kBAAA,UAAA,OACA,SAAA,SAGA,SAAA,GACA,EAAA,GAAA,EAAA,aAAA,GACA,EAAA,GAAA,EAAA,EAAA,EAAA,GAEA,EAAA,MAAA,GAAA,EAAA,EAAA,OAAA,EAAA,gBAEA,UAAA,kBAAA,UAAA,OACA,SAAA,SAIA,EAAA,iBAAA,EAAA,GAEA,EAAA,QAQA,KAAA,EACA,eAAA,EACA,MAAA,WACA,EAAA,oBAAA,EAAA,MAMA,QAAA,GAAA,GACA,OAAA,GACA,IAAA,GACA,OAAA,CAEA,KAAA,QACA,IAAA,OACA,IAAA,OACA,OAAA,EAGA,MAAA,OAAA,OAAA,KAGA,GAFA,EAKA,QAAA,MA7kBA,GA0CA,GAAA,OAAA,OAAA,KAkBA,GAAA,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,KA8BA,EAAA,WACA,GAAA,YACA,IAAA,KAAA,UAAA,CACA,GAAA,GAAA,KAAA,iBAAA,GACA,KAAA,OAAA,KAAA,KAAA,OAAA,QACA,MAAA,UAAA,KAAA,IAAA,EAAA,IAAA,KAAA,SAAA,MAGA,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,mBAAA,GAAA,CACA,GAAA,GAAA,KAAA,IAAA,KAAA,SAAA,KAEA,MAAA,SAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,EAKA,OAHA,IACA,EAAA,QAAA,EAAA,GAEA,EAAA,aAAA,QAEA,CAEA,GAAA,GAAA,KAAA,QAEA,MAAA,SAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAIA,OAHA,IACA,EAAA,QAAA,EAAA,GAEA,EAAA,EAAA,GAAA,SAIA,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,uBAAA,KAAA,KAcA,IANA,EACA,EAAA,EAAA,QACA,kBAAA,GAAA,QACA,EAAA,EAAA,OAGA,kBAAA,GAGA,WAFA,SAAA,MAAA,OAAA,EAAA,UAAA,SACA,YAAA,KAAA,KAKA,KAAA,GADA,IAAA,GACA,EAAA,EAAA,EAAA,KAAA,KAAA,OAAA,IACA,EAAA,EAAA,GAAA,EAAA,KAAA,KAAA,IAAA,EAAA,EAGA,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,GACA,MAAA,GAAA,GAAA,EAAA,EAAA,MAIA,uBAAA,SAAA,EAAA,EAAA,GACA,IAAA,EAAA,GACA,KAAA,OAAA,wBAAA,EAKA,OAHA,GAAA,EAAA,GACA,EAAA,EAAA,GAEA,SAAA,EAAA,GACA,MAAA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,MAIA,4BAAA,SAAA,EAAA,EAAA,GAKA,MAJA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,GAEA,SAAA,EAAA,GACA,MAAA,GAAA,EAAA,GACA,EAAA,EAAA,GAAA,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,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,GAEA,IAAA,GADA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,KAAA,EAAA,GAAA,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,GAEA,IAAA,GADA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GAAA,KAAA,EAAA,GAAA,MAAA,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,GACA,EAAA,EAAA,EAAA,KAAA,QAAA,OAAA,IACA,EAAA,KAAA,QAAA,GAAA,UAAA,GAAA,EAAA,EAAA,EACA,EAGA,OAAA,IAGA,SAAA,SAAA,EAAA,EAAA,GAEA,IADA,GAAA,GAAA,KAAA,QAAA,KAAA,QAAA,OAAA,EACA,IAAA,GACA,EAAA,KAAA,QAAA,GAAA,UAAA,GAAA,EAAA,EACA,EAGA,OAAA,MAAA,WAAA,SACA,KAAA,WAAA,SAAA,EAAA,GADA,QAqBA,IAAA,OAEA,uBACA,qBACA,sBACA,cACA,aACA,kBACA,QAAA,SAAA,GACA,EAAA,EAAA,eAAA,GAGA,IAAA,GAAA,IAAA,KAAA,SAAA,SAAA,IAAA,MAAA,EA4FA,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,EACA,IAAA,EAAA,GACA,MAAA,GAAA,MAKA,EAAA,EAAA,EAAA,UAJA,SAAA,MAAA,gDAOA,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,GAAA,GAAA,OAAA,OAAA,EAIA,OAHA,GAAA,GAAA,EACA,EAAA,GAAA,OACA,EAAA,GAAA,EACA,MAKA,EAAA,mBAAA,EACA,EAAA,sBACA,EAAA,eAAA,GAEA,EAAA,mBAAA,oBAAA,GACA,MC5qBA,SAAA,GAUA,QAAA,KACA,IACA,GAAA,EACA,EAAA,eAAA,WACA,GAAA,EACA,SAAA,MAAA,QAAA,MAAA,oBACA,EAAA,6BACA,SAAA,MAAA,QAAA;IAdA,GAAA,GAAA,SAAA,cAAA,QACA,GAAA,YAAA,oEACA,IAAA,GAAA,SAAA,cAAA,OACA,GAAA,aAAA,EAAA,EAAA,WAGA,IAAA,EAeA,IAAA,SAAA,iBAQA,EAAA,iBARA,CACA,GAAA,GAAA,GACA,QAAA,iBAAA,qBAAA,WACA,IACA,EAAA,UAAA,YAAA,EAAA,KAOA,GAAA,OAAA,iBAAA,eAAA,UAAA,CACA,GAAA,GAAA,SAAA,UAAA,UACA,UAAA,UAAA,WAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,KAAA,KAAA,EAAA,EAEA,OADA,gBAAA,WAAA,GACA,GAKA,EAAA,MAAA,GAEA,OAAA","sourcesContent":["/*\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 * PointerGestureEvent is the constructor for all PointerGesture events.\n *\n * @module PointerGestures\n * @class PointerGestureEvent\n * @extends UIEvent\n * @constructor\n * @param {String} inType Event type\n * @param {Object} [inDict] Dictionary of properties to initialize on the event\n */\n\nfunction PointerGestureEvent(inType, inDict) {\n  var dict = inDict || {};\n  var e = document.createEvent('Event');\n  var props = {\n    bubbles: Boolean(dict.bubbles) === dict.bubbles || true,\n    cancelable: Boolean(dict.cancelable) === dict.cancelable || true\n  };\n\n  e.initEvent(inType, props.bubbles, props.cancelable);\n\n  var keys = Object.keys(dict), k;\n  for (var i = 0; i < keys.length; i++) {\n    k = keys[i];\n    e[k] = dict[k];\n  }\n\n  e.preventTap = this.preventTap;\n\n  return e;\n}\n\n/**\n * Allows for any gesture to prevent the tap gesture.\n *\n * @method preventTap\n */\nPointerGestureEvent.prototype.preventTap = function() {\n  this.tapPrevented = true;\n};\n\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 document has CSP securityPolicy object and we can see that\n    // eval is not supported. This avoids an error message in console even when the exception\n    // is caught\n    if (global.document &&\n        'securityPolicy' in global.document &&\n        !global.document.securityPolicy.allowsEval) {\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 isNaN(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 ident = identStart + '+' + identPart + '*';\n  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';\n  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';\n  var path = '(?:' + identOrElementIndex + ')(?:\\\\s*\\\\.\\\\s*' + identOrElementIndex + ')*';\n  var pathRegExp = new RegExp('^' + path + '$');\n\n  function isPathValid(s) {\n    if (typeof s != 'string')\n      return false;\n    s = s.trim();\n\n    if (s == '')\n      return true;\n\n    if (s[0] == '.')\n      return false;\n\n    return pathRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(s, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (s.trim() == '')\n      return this;\n\n    if (isIndex(s)) {\n      this.push(s);\n      return this;\n    }\n\n    s.split(/\\s*\\.\\s*/).filter(function(part) {\n      return part;\n    }).forEach(function(part) {\n      this.push(part);\n    }, this);\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)\n      pathString = '';\n\n    if (typeof pathString !== 'string')\n      pathString = String(pathString);\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n    if (!isPathValid(pathString))\n      return invalidPath;\n    var path = new Path(pathString, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      return this.join('.');\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);\n      }\n    },\n\n    compiledGetValueFromFn: function() {\n      var accessors = this.map(function(ident) {\n        return isIndex(ident) ? '[\"' + ident + '\"]' : '.' + ident;\n      });\n\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      for (; i < (this.length - 1); i++) {\n        var ident = this[i];\n        pathString += accessors[i];\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      pathString += accessors[i];\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  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 emptyArray = [];\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observers = [];\n    var observerCount = 0;\n    var objects = [];\n    var toRemove = emptyArray;\n    var resetNeeded = false;\n    var resetScheduled = false;\n\n    function observe(obj) {\n      if (!obj)\n        return;\n\n      var index = toRemove.indexOf(obj);\n      if (index >= 0) {\n        toRemove[index] = undefined;\n        objects.push(obj);\n      } else if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj));\n    }\n\n    function reset() {\n      var objs = toRemove === emptyArray ? [] : toRemove;\n      toRemove = objects;\n      objects = objs;\n\n      var observer;\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.iterateObjects_(observe);\n      }\n\n      for (var i = 0; i < toRemove.length; i++) {\n        var obj = toRemove[i];\n        if (obj)\n          Object.unobserve(obj, callback);\n      }\n\n      toRemove.length = 0;\n    }\n\n    function scheduledReset() {\n      resetScheduled = false;\n      if (!resetNeeded)\n        return;\n\n      reset();\n    }\n\n    function scheduleReset() {\n      if (resetScheduled)\n        return;\n\n      resetNeeded = true;\n      resetScheduled = true;\n      runEOM(scheduledReset);\n    }\n\n    function callback() {\n      reset();\n\n      var observer;\n\n      for (var id in observers) {\n        observer = observers[id];\n        if (!observer || observer.state_ != OPENED)\n          continue;\n\n        observer.check_();\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs) {\n        observers[obs.id_] = obs;\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        var anyLeft = false;\n\n        observers[obs.id_] = undefined;\n        observerCount--;\n\n        if (observerCount) {\n          scheduleReset();\n          return;\n        }\n        resetNeeded = false;\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        observedSetCache.push(this);\n      },\n      reset: scheduleReset\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);\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.state_ = OPENED;\n      this.connect_();\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.state_ = CLOSED;\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    runningMicrotaskCheckpoint = false;\n  };\n\n  if (collectObservers) {\n    global.Platform.clearObservers = function() {\n      allObservers = [];\n    };\n  }\n\n  function ObjectObserver(object) {\n    Observer.call(this);\n    this.value_ = object;\n    this.oldObject_ = undefined;\n  }\n\n  ObjectObserver.prototype = createObject({\n    __proto__: Observer.prototype,\n\n    arrayObserve: false,\n\n    connect_: function(callback, target) {\n      if (hasObserve) {\n        this.directObserver_ = getObservedObject(this, this.value_,\n                                                 this.arrayObserve);\n      } else {\n        this.oldObject_ = this.copyObject(this.value_);\n      }\n\n    },\n\n    copyObject: function(object) {\n      var copy = Array.isArray(object) ? [] : {};\n      for (var prop in object) {\n        copy[prop] = object[prop];\n      };\n      if (Array.isArray(object))\n        copy.length = object.length;\n      return copy;\n    },\n\n    check_: function(changeRecords, skipChanges) {\n      var diff;\n      var oldValues;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n\n        oldValues = {};\n        diff = diffObjectFromChangeRecords(this.value_, changeRecords,\n                                           oldValues);\n      } else {\n        oldValues = this.oldObject_;\n        diff = diffObjectFromOldObject(this.value_, this.oldObject_);\n      }\n\n      if (diffIsEmpty(diff))\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([\n        diff.added || {},\n        diff.removed || {},\n        diff.changed || {},\n        function(property) {\n          return oldValues[property];\n        }\n      ]);\n\n      return true;\n    },\n\n    disconnect_: function() {\n      if (hasObserve) {\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n      } else {\n        this.oldObject_ = undefined;\n      }\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      if (hasObserve)\n        this.directObserver_.deliver(false);\n      else\n        dirtyCheck(this);\n    },\n\n    discardChanges: function() {\n      if (this.directObserver_)\n        this.directObserver_.deliver(true);\n      else\n        this.oldObject_ = this.copyObject(this.value_);\n\n      return this.value_;\n    }\n  });\n\n  function ArrayObserver(array) {\n    if (!Array.isArray(array))\n      throw Error('Provided object is not an Array');\n    ObjectObserver.call(this, array);\n  }\n\n  ArrayObserver.prototype = createObject({\n\n    __proto__: ObjectObserver.prototype,\n\n    arrayObserve: true,\n\n    copyObject: function(arr) {\n      return arr.slice();\n    },\n\n    check_: function(changeRecords) {\n      var splices;\n      if (hasObserve) {\n        if (!changeRecords)\n          return false;\n        splices = projectArraySplices(this.value_, changeRecords);\n      } else {\n        splices = calcSplices(this.value_, 0, this.value_.length,\n                              this.oldObject_, 0, this.oldObject_.length);\n      }\n\n      if (!splices || !splices.length)\n        return false;\n\n      if (!hasObserve)\n        this.oldObject_ = this.copyObject(this.value_);\n\n      this.report_([splices]);\n      return true;\n    }\n  });\n\n  ArrayObserver.applySplices = function(previous, current, splices) {\n    splices.forEach(function(splice) {\n      var spliceArgs = [splice.index, splice.removed.length];\n      var addIndex = splice.index;\n      while (addIndex < splice.index + splice.addedCount) {\n        spliceArgs.push(current[addIndex]);\n        addIndex++;\n      }\n\n      Array.prototype.splice.apply(previous, spliceArgs);\n    });\n  };\n\n  function PathObserver(object, path) {\n    Observer.call(this);\n\n    this.object_ = object;\n    this.path_ = path instanceof Path ? path : getPath(path);\n    this.directObserver_ = undefined;\n  }\n\n  PathObserver.prototype = createObject({\n    __proto__: Observer.prototype,\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]);\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() {\n    Observer.call(this);\n\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      this.check_(undefined, true);\n\n      if (!hasObserve)\n        return;\n\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 (this.directObserver_) {\n        if (needsDirectObserver) {\n          this.directObserver_.reset();\n          return;\n        }\n        this.directObserver_.close();\n        this.directObserver_ = undefined;\n        return;\n      }\n\n      if (needsDirectObserver)\n        this.directObserver_ = getObservedSet(this, object);\n    },\n\n    closeObservers_: 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    },\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      this.closeObservers_();\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      this.observed_.push(object, path instanceof Path ? path : getPath(path));\n    },\n\n    addObserver: function(observer) {\n      if (this.state_ != UNOPENED && this.state_ != RESETTING)\n        throw Error('Cannot add observers once started.');\n\n      observer.open(this.deliver, this);\n      this.observed_.push(observerSentinel, observer);\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.closeObservers_();\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 pathOrObserver = this.observed_[i+1];\n        var object = this.observed_[i];\n        var value = object === observerSentinel ?\n            pathOrObserver.discardChanges() :\n            pathOrObserver.getValueFrom(object)\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 notifyFunction(object, name) {\n    if (typeof Object.observe !== 'function')\n      return;\n\n    var notifier = Object.getNotifier(object);\n    return function(type, oldValue) {\n      var changeRecord = {\n        object: object,\n        type: type,\n        name: name\n      };\n      if (arguments.length === 2)\n        changeRecord.oldValue = oldValue;\n      notifier.notify(changeRecord);\n    }\n  }\n\n  Observer.defineComputedProperty = function(target, name, observable) {\n    var notify = notifyFunction(target, name);\n    var value = observable.open(function(newValue, oldValue) {\n      value = newValue;\n      if (notify)\n        notify('update', oldValue);\n    });\n\n    Object.defineProperty(target, name, {\n      get: function() {\n        observable.deliver();\n        return value;\n      },\n      set: function(newValue) {\n        observable.setValue(newValue);\n        return newValue;\n      },\n      configurable: true\n    });\n\n    return {\n      close: function() {\n        observable.close();\n        Object.defineProperty(target, name, {\n          value: value,\n          writable: true,\n          configurable: true\n        });\n      }\n    };\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.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","// prepoulate window.Platform.flags for default controls\r\nwindow.Platform = window.Platform || {};\r\n// prepopulate window.logFlags if necessary\r\nwindow.logFlags = window.logFlags || {};\r\n// process flags\r\n(function(scope){\r\n  // import\r\n  var flags = scope.flags || {};\r\n  // populate flags from location\r\n  location.search.slice(1).split('&').forEach(function(o) {\r\n    o = o.split('=');\r\n    o[0] && (flags[o[0]] = o[1] || true);\r\n  });\r\n  var entryPoint = document.currentScript ||\r\n      document.querySelector('script[src*=\"platform.js\"]');\r\n  if (entryPoint) {\r\n    var a = entryPoint.attributes;\r\n    for (var i = 0, n; i < a.length; i++) {\r\n      n = a[i];\r\n      if (n.name !== 'src') {\r\n        flags[n.name] = n.value || true;\r\n      }\r\n    }\r\n  }\r\n  if (flags.log) {\r\n    flags.log.split(',').forEach(function(f) {\r\n      window.logFlags[f] = true;\r\n    });\r\n  }\r\n  // If any of these flags match 'native', then force native ShadowDOM; any\r\n  // other truthy value, or failure to detect native\r\n  // ShadowDOM, results in polyfill\r\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\r\n  if (flags.shadow === 'native') {\r\n    flags.shadow = false;\r\n  } else {\r\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\r\n  }\r\n\r\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\r\n    console.warn('platform.js is not the first script on the page. ' +\r\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\r\n        'for details.');\r\n  }\r\n\r\n  // CustomElements polyfill flag\r\n  if (flags.register) {\r\n    window.CustomElements = window.CustomElements || {flags: {}};\r\n    window.CustomElements.flags.register = flags.register;\r\n  }\r\n\r\n  if (flags.imports) {\r\n    window.HTMLImports = window.HTMLImports || {flags: {}};\r\n    window.HTMLImports.flags.imports = flags.imports;\r\n  }\r\n\r\n  // export\r\n  scope.flags = flags;\r\n})(Platform);\r\n\r\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  // Don't test for eval if document has CSP securityPolicy object and we can\n  // see that eval is not supported. This avoids an error message in console\n  // even when the exception is caught\n  var hasEval = !('securityPolicy' in document) ||\n      document.securityPolicy.allowsEval;\n  if (hasEval) {\n    try {\n      var f = new Function('', 'return true;');\n      hasEval = f();\n    } catch (ex) {\n      hasEval = false;\n    }\n  }\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    getOwnPropertyNames(from).forEach(function(name) {\n      defineProperty(to, name, getOwnPropertyDescriptor(from, name));\n    });\n    return to;\n  };\n\n  function mixinStatics(to, from) {\n    getOwnPropertyNames(from).forEach(function(name) {\n      switch (name) {\n        case 'arguments':\n        case 'caller':\n        case 'length':\n        case 'name':\n        case 'prototype':\n        case 'toString':\n          return;\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  // 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    defineProperty(wrapperPrototype, 'constructor', {\n      value: wrapperConstructor,\n      configurable: true,\n      enumerable: false,\n      writable: true\n    });\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  function defineGetter(constructor, name, getter) {\n    defineProperty(constructor.prototype, name, {\n      get: getter,\n      configurable: true,\n      enumerable: true\n    });\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   * @constructor\n   */\n  function TreeScope(root, parent) {\n    this.root = root;\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.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 isInsertionPoint(node) {\n    var localName = node.localName;\n    return localName === 'content' || localName === 'shadow';\n  }\n\n  function isShadowHost(node) {\n    return !!node.shadowRoot;\n  }\n\n  function getEventParent(node) {\n    var dv;\n    return node.parentNode || (dv = node.defaultView) && wrap(dv) || null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-parent\n  function calculateParents(node, context, ancestors) {\n    if (ancestors.length)\n      return ancestors.shift();\n\n    // 1.\n    if (isShadowRoot(node))\n      return getInsertionParent(node) || node.host;\n\n    // 2.\n    var eventParents = scope.eventParentsTable.get(node);\n    if (eventParents) {\n      // Copy over the remaining event parents for next iteration.\n      for (var i = 1; i < eventParents.length; i++) {\n        ancestors[i - 1] = eventParents[i];\n      }\n      return eventParents[0];\n    }\n\n    // 3.\n    if (context && isInsertionPoint(node)) {\n      var parentNode = node.parentNode;\n      if (parentNode && isShadowHost(parentNode)) {\n        var trees = scope.getShadowTrees(parentNode);\n        var p = getInsertionParent(context);\n        for (var i = 0; i < trees.length; i++) {\n          if (trees[i].contains(p))\n            return p;\n        }\n      }\n    }\n\n    return getEventParent(node);\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#event-retargeting\n  function retarget(node) {\n    var stack = [];  // 1.\n    var ancestor = node;  // 2.\n    var targets = [];\n    var ancestors = [];\n    while (ancestor) {  // 3.\n      var context = null;  // 3.2.\n      // TODO(arv): Change order of these. If the stack is empty we always end\n      // up pushing ancestor, no matter what.\n      if (isInsertionPoint(ancestor)) {  // 3.1.\n        context = topMostNotInsertionPoint(stack);  // 3.1.1.\n        var top = stack[stack.length - 1] || ancestor;  // 3.1.2.\n        stack.push(top);\n      } else if (!stack.length) {\n        stack.push(ancestor);  // 3.3.\n      }\n      var target = stack[stack.length - 1];  // 3.4.\n      targets.push({target: target, currentTarget: ancestor});  // 3.5.\n      if (isShadowRoot(ancestor))  // 3.6.\n        stack.pop();  // 3.6.1.\n\n      ancestor = calculateParents(ancestor, context, ancestors);  // 3.7.\n    }\n    return targets;\n  }\n\n  function topMostNotInsertionPoint(stack) {\n    for (var i = stack.length - 1; i >= 0; i--) {\n      if (!isInsertionPoint(stack[i]))\n        return stack[i];\n    }\n    return null;\n  }\n\n  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-related-target\n  function adjustRelatedTarget(target, related) {\n    var ancestors = [];\n    while (target) {  // 3.\n      var stack = [];  // 3.1.\n      var ancestor = related;  // 3.2.\n      var last = undefined;  // 3.3. Needs to be reset every iteration.\n      while (ancestor) {\n        var context = null;\n        if (!stack.length) {\n          stack.push(ancestor);\n        } else {\n          if (isInsertionPoint(ancestor)) {  // 3.4.3.\n            context = topMostNotInsertionPoint(stack);\n            // isDistributed is more general than checking whether last is\n            // assigned into ancestor.\n            if (isDistributed(last)) {  // 3.4.3.2.\n              var head = stack[stack.length - 1];\n              stack.push(head);\n            }\n          }\n        }\n\n        if (inSameTree(ancestor, target))  // 3.4.4.\n          return stack[stack.length - 1];\n\n        if (isShadowRoot(ancestor))  // 3.4.5.\n          stack.pop();\n\n        last = ancestor;  // 3.4.6.\n        ancestor = calculateParents(ancestor, context, ancestors);  // 3.4.7.\n      }\n      if (isShadowRoot(target))  // 3.5.\n        target = target.host;\n      else\n        target = target.parentNode;  // 3.6.\n    }\n  }\n\n  function getInsertionParent(node) {\n    return scope.insertionParentTable.get(node);\n  }\n\n  function isDistributed(node) {\n    return getInsertionParent(node);\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\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  }\n\n  function isLoadLikeEvent(event) {\n    switch (event.type) {\n      case 'beforeunload':\n      case 'load':\n      case 'unload':\n        return true;\n    }\n    return false;\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError')\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath = retarget(originalWrapperTarget);\n\n    // For window \"load\" events the \"load\" event is dispatched at the window but\n    // the target is set to the document.\n    //\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    //\n    // TODO(arv): Find a less hacky way to do this.\n    if (eventPath.length === 2 &&\n        eventPath[0].target instanceof wrappers.Document &&\n        isLoadLikeEvent(event)) {\n      eventPath.shift();\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath)) {\n      if (dispatchAtTarget(event, eventPath)) {\n        dispatchBubbling(event, eventPath);\n      }\n    }\n\n    eventPhaseTable.set(event, Event.NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath) {\n    var phase;\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        continue;\n\n      phase = Event.CAPTURING_PHASE;\n      if (!invoke(eventPath[i], event, phase))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath) {\n    var phase = Event.AT_TARGET;\n    return invoke(eventPath[0], event, phase);\n  }\n\n  function dispatchBubbling(event, eventPath) {\n    var bubbles = event.bubbles;\n    var phase;\n\n    for (var i = 1; i < eventPath.length; i++) {\n      var target = eventPath[i].target;\n      var currentTarget = eventPath[i].currentTarget;\n      if (target === currentTarget)\n        phase = Event.AT_TARGET;\n      else if (bubbles && !stopImmediatePropagationTable.get(event))\n        phase = Event.BUBBLING_PHASE;\n      else\n        continue;\n\n      if (!invoke(eventPath[i], event, phase))\n        return;\n    }\n  }\n\n  function invoke(tuple, event, phase) {\n    var target = tuple.target;\n    var currentTarget = tuple.currentTarget;\n\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\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 = adjustRelatedTarget(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    currentTargetTable.set(event, currentTarget);\n\n    for (var i = 0; i < listeners.length; 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 === Event.CAPTURING_PHASE ||\n          listener.capture && phase === Event.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 (window.onerror)\n          window.onerror(ex.message);\n        else\n          console.error(ex, ex.stack);\n      }\n    }\n\n    if (anyRemoved) {\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 nodeList = new wrappers.NodeList();\n      var eventPath = eventPathTable.get(this);\n      if (eventPath) {\n        var index = 0;\n        var lastIndex = eventPath.length - 1;\n        var baseRoot = getTreeScope(currentTargetTable.get(this));\n\n        for (var i = 0; i <= lastIndex; i++) {\n          var currentTarget = eventPath[i].currentTarget;\n          var currentRoot = getTreeScope(currentTarget);\n          if (currentRoot.contains(baseRoot) &&\n              // Make sure we do not add Window to the path.\n              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {\n            nodeList[index++] = currentTarget;\n          }\n        }\n        nodeList.length = index;\n      }\n      return nodeList;\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        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    var targets = retarget(element, this)\n    for (var i = 0; i < targets.length; i++) {\n      var target = targets[i];\n      if (target.currentTarget === self)\n        return target.target;\n    }\n    return null;\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.adjustRelatedTarget = adjustRelatedTarget;\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","// 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  function nonEnum(obj, prop) {\n    Object.defineProperty(obj, prop, {enumerable: false});\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\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  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 findAll(node, selector, results) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (el.matches(selector))\n        results[results.length++] = el;\n      findAll(el, selector, results);\n      el = el.nextElementSibling;\n    }\n    return results;\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 findAll(this, selector, new NodeList())\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(tagName) {\n      // TODO(arv): Check tagName?\n      return this.querySelectorAll(tagName);\n    },\n    getElementsByClassName: function(className) {\n      // TODO(arv): Check className?\n      return this.querySelectorAll('.' + className);\n    },\n    getElementsByTagNameNS: function(ns, tagName) {\n      if (ns === '*')\n        return this.getElementsByTagName(tagName);\n\n      // TODO(arv): Check tagName?\n      var result = new NodeList;\n      var els = this.getElementsByTagName(tagName);\n      for (var i = 0, j = 0; i < els.length; i++) {\n        if (els[i].namespaceURI === ns)\n          result[j++] = els[i];\n      }\n      result.length = j;\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 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 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 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 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  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    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\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  /**\n   * Useful for generating the accessor pair for a property that reflects an\n   * attribute.\n   */\n  function setterDirtiesAttribute(prototype, propertyName, opt_attrName) {\n    var attrName = opt_attrName || propertyName;\n    Object.defineProperty(prototype, propertyName, {\n      get: function() {\n        return this.impl[propertyName];\n      },\n      set: function(v) {\n        this.impl[propertyName] = v;\n        invalidateRendererBasedOnAttribute(this, attrName);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  setterDirtiesAttribute(Element.prototype, 'id');\n  setterDirtiesAttribute(Element.prototype, 'className', 'class');\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  // TODO(arv): Export setterDirtiesAttribute and apply it to more bindings\n  // that reflect attributes.\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    // TODO: attribute boolean resetStyleInheritance;\n  });\n\n  if (OriginalHTMLContentElement)\n    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);\n\n  scope.wrappers.HTMLContentElement = HTMLContentElement;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var rewrap = scope.rewrap;\n\n  var OriginalHTMLImageElement = window.HTMLImageElement;\n\n  function HTMLImageElement(node) {\n    HTMLElement.call(this, node);\n  }\n  HTMLImageElement.prototype = Object.create(HTMLElement.prototype);\n\n  registerWrapper(OriginalHTMLImageElement, HTMLImageElement,\n                  document.createElement('img'));\n\n  function Image(width, height) {\n    if (!(this instanceof Image)) {\n      throw new TypeError(\n          'DOM object constructor cannot be called as a function.');\n    }\n\n    var node = unwrap(document.createElement('img'));\n    HTMLElement.call(this, node);\n    rewrap(node, this);\n\n    if (width !== undefined)\n      node.width = width;\n    if (height !== undefined)\n      node.height = height;\n  }\n\n  Image.prototype = HTMLImageElement.prototype;\n\n  scope.wrappers.HTMLImageElement = HTMLImageElement;\n  scope.wrappers.Image = Image;\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLElement = scope.wrappers.HTMLElement;\n  var mixin = scope.mixin;\n  var 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  mixin(HTMLShadowElement.prototype, {\n    // TODO: attribute boolean resetStyleInheritance;\n  });\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 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  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    this.treeScope_ = new TreeScope(this, getTreeScope(hostWrapper));\n\n    var oldShadowRoot = hostWrapper.shadowRoot;\n    nextOlderShadowTreeTable.set(this, oldShadowRoot);\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 distributedChildNodesTable = new WeakMap();\n  var eventParentsTable = new WeakMap();\n  var insertionParentTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function distributeChildToInsertionPoint(child, insertionPoint) {\n    getDistributedChildNodes(insertionPoint).push(child);\n    assignToInsertionPoint(child, insertionPoint);\n\n    var eventParents = eventParentsTable.get(child);\n    if (!eventParents)\n      eventParentsTable.set(child, eventParents = []);\n    eventParents.push(insertionPoint);\n  }\n\n  function resetDistributedChildNodes(insertionPoint) {\n    distributedChildNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedChildNodes(insertionPoint) {\n    var rv = distributedChildNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedChildNodesTable.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  /**\n   * Visits all nodes in the tree that fulfils the |predicate|. If the |visitor|\n   * function returns |false| the traversal is aborted.\n   * @param {!Node} tree\n   * @param {function(!Node) : boolean} predicate\n   * @param {function(!Node) : *} visitor\n   */\n  function visit(tree, predicate, visitor) {\n    // This operates on logical DOM.\n    for (var node = tree.firstChild; node; node = node.nextSibling) {\n      if (predicate(node)) {\n        if (visitor(node) === false)\n          return;\n      } else {\n        visit(node, predicate, visitor);\n      }\n    }\n  }\n\n  // Matching Insertion Points\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#matching-insertion-points\n\n  // TODO(arv): Verify this... I don't remember why I picked this regexp.\n  var selectorMatchRegExp = /^[*.:#[a-zA-Z_|]/;\n\n  var allowedPseudoRegExp = new RegExp('^:(' + [\n    'link',\n    'visited',\n    'target',\n    'enabled',\n    'disabled',\n    'checked',\n    'indeterminate',\n    'nth-child',\n    'nth-last-child',\n    'nth-of-type',\n    'nth-last-of-type',\n    'first-child',\n    'last-child',\n    'first-of-type',\n    'last-of-type',\n    'only-of-type',\n  ].join('|') + ')');\n\n\n  /**\n   * @param {Element} node\n   * @oaram {Element} point The insertion point element.\n   * @return {boolean} Whether the node matches the insertion point.\n   */\n  function matchesCriteria(node, point) {\n    var select = point.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    // The native matches function in IE9 does not correctly work with elements\n    // that are not in the document.\n    // TODO(arv): Implement matching in JS.\n    // https://github.com/Polymer/ShadowDOM/issues/361\n    if (select === '*' || select === node.localName)\n      return true;\n\n    // TODO(arv): This does not seem right. Need to check for a simple selector.\n    if (!selectorMatchRegExp.test(select))\n      return false;\n\n    // TODO(arv): This no longer matches the spec.\n    if (select[0] === ':' && !allowedPseudoRegExp.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  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      this.treeComposition();\n\n      var host = this.host;\n      var shadowRoot = host.shadowRoot;\n\n      this.associateNode(host);\n      var topMostRenderer = !renderNode;\n      var renderNode = opt_renderNode || new RenderNode(host);\n\n      for (var node = shadowRoot.firstChild; node; node = node.nextSibling) {\n        this.renderNode(shadowRoot, renderNode, node, false);\n      }\n\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    renderNode: function(shadowRoot, renderNode, node, isNested) {\n      if (isShadowHost(node)) {\n        renderNode = renderNode.append(node);\n        var renderer = getRendererForHost(node);\n        renderer.dirty = true;  // Need to rerender due to reprojection.\n        renderer.render(renderNode);\n      } else if (isInsertionPoint(node)) {\n        this.renderInsertionPoint(shadowRoot, renderNode, node, isNested);\n      } else if (isShadowInsertionPoint(node)) {\n        this.renderShadowInsertionPoint(shadowRoot, renderNode, node);\n      } else {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, isNested);\n      }\n    },\n\n    renderAsAnyDomTree: function(shadowRoot, renderNode, node, isNested) {\n      renderNode = renderNode.append(node);\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderNode.skip = !renderer.dirty;\n        renderer.render(renderNode);\n      } else {\n        for (var child = node.firstChild; child; child = child.nextSibling) {\n          this.renderNode(shadowRoot, renderNode, child, isNested);\n        }\n      }\n    },\n\n    renderInsertionPoint: function(shadowRoot, renderNode, insertionPoint,\n                                   isNested) {\n      var distributedChildNodes = getDistributedChildNodes(insertionPoint);\n      if (distributedChildNodes.length) {\n        this.associateNode(insertionPoint);\n\n        for (var i = 0; i < distributedChildNodes.length; i++) {\n          var child = distributedChildNodes[i];\n          if (isInsertionPoint(child) && isNested)\n            this.renderInsertionPoint(shadowRoot, renderNode, child, isNested);\n          else\n            this.renderAsAnyDomTree(shadowRoot, renderNode, child, isNested);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode, insertionPoint);\n      }\n      this.associateNode(insertionPoint.parentNode);\n    },\n\n    renderShadowInsertionPoint: function(shadowRoot, renderNode,\n                                         shadowInsertionPoint) {\n      var nextOlderTree = shadowRoot.olderShadowRoot;\n      if (nextOlderTree) {\n        assignToInsertionPoint(nextOlderTree, shadowInsertionPoint);\n        this.associateNode(shadowInsertionPoint.parentNode);\n        for (var node = nextOlderTree.firstChild;\n             node;\n             node = node.nextSibling) {\n          this.renderNode(nextOlderTree, renderNode, node, true);\n        }\n      } else {\n        this.renderFallbackContent(shadowRoot, renderNode,\n                                   shadowInsertionPoint);\n      }\n    },\n\n    renderFallbackContent: function(shadowRoot, renderNode, fallbackHost) {\n      this.associateNode(fallbackHost);\n      this.associateNode(fallbackHost.parentNode);\n      for (var node = fallbackHost.firstChild; node; node = node.nextSibling) {\n        this.renderAsAnyDomTree(shadowRoot, renderNode, node, false);\n      }\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    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-distribution-algorithm\n    distribute: function(tree, pool) {\n      var self = this;\n\n      visit(tree, isActiveInsertionPoint,\n          function(insertionPoint) {\n            resetDistributedChildNodes(insertionPoint);\n            self.updateDependentAttributes(\n                insertionPoint.getAttribute('select'));\n\n            for (var i = 0; i < pool.length; i++) {  // 1.2\n              var node = pool[i];  // 1.2.1\n              if (node === undefined)  // removed\n                continue;\n              if (matchesCriteria(node, insertionPoint)) {  // 1.2.2\n                distributeChildToInsertionPoint(node, insertionPoint);  // 1.2.2.1\n                pool[i] = undefined;  // 1.2.2.2\n              }\n            }\n          });\n    },\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-tree-composition\n    treeComposition: function () {\n      var shadowHost = this.host;\n      var tree = shadowHost.shadowRoot;  // 1.\n      var pool = [];  // 2.\n\n      for (var child = shadowHost.firstChild;\n           child;\n           child = child.nextSibling) {  // 3.\n        if (isInsertionPoint(child)) {  // 3.2.\n          var reprojected = getDistributedChildNodes(child);  // 3.2.1.\n          // if reprojected is undef... reset it?\n          if (!reprojected || !reprojected.length)  // 3.2.2.\n            reprojected = getChildNodesSnapshot(child);\n          pool.push.apply(pool, reprojected);  // 3.2.3.\n        } else {\n          pool.push(child); // 3.3.\n        }\n      }\n\n      var shadowInsertionPoint, point;\n      while (tree) {  // 4.\n        // 4.1.\n        shadowInsertionPoint = undefined;  // Reset every iteration.\n        visit(tree, isActiveShadowInsertionPoint, function(point) {\n          shadowInsertionPoint = point;\n          return false;\n        });\n        point = shadowInsertionPoint;\n\n        this.distribute(tree, pool);  // 4.2.\n        if (point) {  // 4.3.\n          var nextOlderTree = tree.olderShadowRoot;  // 4.3.1.\n          if (!nextOlderTree) {\n            break;  // 4.3.1.1.\n          } else {\n            tree = nextOlderTree;  // 4.3.2.2.\n            assignToInsertionPoint(tree, point);  // 4.3.2.2.\n            continue;  // 4.3.2.3.\n          }\n        } else {\n          break;  // 4.4.\n        }\n      }\n    },\n\n    associateNode: function(node) {\n      node.impl.polymerShadowRenderer_ = this;\n    }\n  };\n\n  function isInsertionPoint(node) {\n    // Should this include <shadow>?\n    return node instanceof HTMLContentElement;\n  }\n\n  function isActiveInsertionPoint(node) {\n    // <content> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLContentElement;\n  }\n\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isActiveShadowInsertionPoint(node) {\n    // <shadow> inside another <content> or <shadow> is considered inactive.\n    return node instanceof HTMLShadowElement;\n  }\n\n  function isShadowHost(shadowHost) {\n    return shadowHost.shadowRoot;\n  }\n\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 assignToInsertionPoint(tree, point) {\n    insertionParentTable.set(tree, point);\n  }\n\n  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\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 = function() {\n    // TODO(arv): We should only rerender the dirty ancestor renderers (from\n    // the root and down).\n    renderAllPending();\n    return getDistributedChildNodes(this);\n  };\n\n  HTMLShadowElement.prototype.nodeIsInserted_ =\n  HTMLContentElement.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.eventParentsTable = eventParentsTable;\n  scope.getRendererForHost = getRendererForHost;\n  scope.getShadowTrees = getShadowTrees;\n  scope.insertionParentTable = insertionParentTable;\n  scope.renderAllPending = renderAllPending;\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  });\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    '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\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\n  registerWrapper(OriginalWindow, Window);\n\n  scope.wrappers.Window = Window;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var unwrap = scope.unwrap;\n\n  // DataTransfer (Clipboard in old Blink/WebKit) has a single method that\n  // requires wrapping. Since it is only a method we do not need a real wrapper,\n  // we can just override the method.\n\n  var OriginalDataTransfer = window.DataTransfer || window.Clipboard;\n  var OriginalDataTransferSetDragImage =\n      OriginalDataTransfer.prototype.setDragImage;\n\n  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\n  };\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var isWrapperFor = scope.isWrapperFor;\n\n  // This is a list of the elements we currently override the global constructor\n  // for.\n  var elements = {\n    'a': 'HTMLAnchorElement',\n    // Do not create an applet element by default since it shows a warning in\n    // IE.\n    // https://github.com/Polymer/polymer/issues/217\n    // 'applet': 'HTMLAppletElement',\n    'area': 'HTMLAreaElement',\n    'audio': 'HTMLAudioElement',\n    'base': 'HTMLBaseElement',\n    'body': 'HTMLBodyElement',\n    'br': 'HTMLBRElement',\n    'button': 'HTMLButtonElement',\n    'canvas': 'HTMLCanvasElement',\n    'caption': 'HTMLTableCaptionElement',\n    'col': 'HTMLTableColElement',\n    // 'command': 'HTMLCommandElement',  // Not fully implemented in Gecko.\n    'content': 'HTMLContentElement',\n    'data': 'HTMLDataElement',\n    'datalist': 'HTMLDataListElement',\n    'del': 'HTMLModElement',\n    'dir': 'HTMLDirectoryElement',\n    'div': 'HTMLDivElement',\n    'dl': 'HTMLDListElement',\n    'embed': 'HTMLEmbedElement',\n    'fieldset': 'HTMLFieldSetElement',\n    'font': 'HTMLFontElement',\n    'form': 'HTMLFormElement',\n    'frame': 'HTMLFrameElement',\n    'frameset': 'HTMLFrameSetElement',\n    'h1': 'HTMLHeadingElement',\n    'head': 'HTMLHeadElement',\n    'hr': 'HTMLHRElement',\n    'html': 'HTMLHtmlElement',\n    'iframe': 'HTMLIFrameElement',\n    'img': 'HTMLImageElement',\n    'input': 'HTMLInputElement',\n    'keygen': 'HTMLKeygenElement',\n    'label': 'HTMLLabelElement',\n    'legend': 'HTMLLegendElement',\n    'li': 'HTMLLIElement',\n    'link': 'HTMLLinkElement',\n    'map': 'HTMLMapElement',\n    'marquee': 'HTMLMarqueeElement',\n    'menu': 'HTMLMenuElement',\n    'menuitem': 'HTMLMenuItemElement',\n    'meta': 'HTMLMetaElement',\n    'meter': 'HTMLMeterElement',\n    'object': 'HTMLObjectElement',\n    'ol': 'HTMLOListElement',\n    'optgroup': 'HTMLOptGroupElement',\n    'option': 'HTMLOptionElement',\n    'output': 'HTMLOutputElement',\n    'p': 'HTMLParagraphElement',\n    'param': 'HTMLParamElement',\n    'pre': 'HTMLPreElement',\n    'progress': 'HTMLProgressElement',\n    'q': 'HTMLQuoteElement',\n    'script': 'HTMLScriptElement',\n    'select': 'HTMLSelectElement',\n    'shadow': 'HTMLShadowElement',\n    'source': 'HTMLSourceElement',\n    'span': 'HTMLSpanElement',\n    'style': 'HTMLStyleElement',\n    'table': 'HTMLTableElement',\n    'tbody': 'HTMLTableSectionElement',\n    // WebKit and Moz are wrong:\n    // https://bugs.webkit.org/show_bug.cgi?id=111469\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=848096\n    // 'td': 'HTMLTableCellElement',\n    'template': 'HTMLTemplateElement',\n    'textarea': 'HTMLTextAreaElement',\n    'thead': 'HTMLTableSectionElement',\n    'time': 'HTMLTimeElement',\n    'title': 'HTMLTitleElement',\n    'tr': 'HTMLTableRowElement',\n    'track': 'HTMLTrackElement',\n    'ul': 'HTMLUListElement',\n    'video': 'HTMLVideoElement',\n  };\n\n  function overrideConstructor(tagName) {\n    var nativeConstructorName = elements[tagName];\n    var nativeConstructor = window[nativeConstructorName];\n    if (!nativeConstructor)\n      return;\n    var element = document.createElement(tagName);\n    var wrapperConstructor = element.constructor;\n    window[nativeConstructorName] = wrapperConstructor;\n  }\n\n  Object.keys(elements).forEach(overrideConstructor);\n\n  Object.getOwnPropertyNames(scope.wrappers).forEach(function(name) {\n    window[name] = scope.wrappers[name]\n  });\n\n})(window.ShadowDOMPolyfill);\n","/*\n * Copyright 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  // 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","/*\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\n/*\n  This is a limited shim for ShadowDOM css styling.\n  https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles\n  \n  The intention here is to support only the styling features which can be \n  relatively simply implemented. The goal is to allow users to avoid the \n  most obvious pitfalls and do so without compromising performance significantly. \n  For ShadowDOM styling that's not covered here, a set of best practices\n  can be provided that should allow users to accomplish more complex styling.\n\n  The following is a list of specific ShadowDOM styling features and a brief\n  discussion of the approach used to shim.\n\n  Shimmed features:\n\n  * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host\n  element using the :host rule. To shim this feature, the :host styles are \n  reformatted and prefixed with a given scope name and promoted to a \n  document level stylesheet.\n  For example, given a scope name of .foo, a rule like this:\n  \n    :host {\n        background: red;\n      }\n    }\n  \n  becomes:\n  \n    .foo {\n      background: red;\n    }\n  \n  * encapsultion: Styles defined within ShadowDOM, apply only to \n  dom inside the ShadowDOM. Polymer uses one of two techniques to imlement\n  this feature.\n  \n  By default, rules are prefixed with the host element tag name \n  as a descendant selector. This ensures styling does not leak out of the 'top'\n  of the element's ShadowDOM. For example,\n\n  div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n  x-foo div {\n      font-weight: bold;\n    }\n  \n  becomes:\n\n\n  Alternatively, if Platform.ShadowCSS.strictStyling is set to true then \n  selectors are scoped by adding an attribute selector suffix to each\n  simple selector that contains the host element tag name. Each element \n  in the element's ShadowDOM template is also given the scope attribute. \n  Thus, these rules match only elements that have the scope attribute.\n  For example, given a scope name of x-foo, a rule like this:\n  \n    div {\n      font-weight: bold;\n    }\n  \n  becomes:\n  \n    div[x-foo] {\n      font-weight: bold;\n    }\n\n  Note that elements that are dynamically added to a scope must have the scope\n  selector added to them manually.\n\n  * upper/lower bound encapsulation: Styles which are defined outside a\n  shadowRoot should not cross the ShadowDOM boundary and should not apply\n  inside a shadowRoot.\n\n  This styling behavior is not emulated. Some possible ways to do this that \n  were rejected due to complexity and/or performance concerns include: (1) reset\n  every possible property for every possible selector for a given scope name;\n  (2) re-implement css in javascript.\n  \n  As an alternative, users should make sure to use selectors\n  specific to the scope in which they are working.\n  \n  * ::distributed: This behavior is not emulated. It's often not necessary\n  to style the contents of a specific insertion point and instead, descendants\n  of the host element can be styled selectively. Users can also create an \n  extra node around an insertion point and style that node's contents\n  via descendent selectors. For example, with a shadowRoot like this:\n  \n    <style>\n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <content></content>\n  \n  could become:\n  \n    <style>\n      / *@polyfill .content-container div * / \n      ::content(div) {\n        background: red;\n      }\n    </style>\n    <div class=\"content-container\">\n      <content></content>\n    </div>\n  \n  Note the use of @polyfill in the comment above a ShadowDOM specific style\n  declaration. This is a directive to the styling shim to use the selector \n  in comments in lieu of the next selector when running under polyfill.\n*/\n(function(scope) {\n\nvar ShadowCSS = {\n  strictStyling: false,\n  registry: {},\n  // Shim styles for a given root associated with a name and extendsName\n  // 1. cache root styles by name\n  // 2. optionally tag root nodes with scope name\n  // 3. shim polyfill directives /* @polyfill */ and /* @polyfill-rule */\n  // 4. shim :host and scoping\n  shimStyling: function(root, name, extendsName) {\n    var scopeStyles = this.prepareRoot(root, name, extendsName);\n    var typeExtension = this.isTypeExtension(extendsName);\n    var scopeSelector = this.makeScopeSelector(name, typeExtension);\n    // use caching to make working with styles nodes easier and to facilitate\n    // lookup of extendee\n    var cssText = stylesToCssText(scopeStyles, true);\n    cssText = this.scopeCssText(cssText, scopeSelector);\n    // cache shimmed css on root for user extensibility\n    if (root) {\n      root.shimmedStyle = cssText;\n    }\n    // add style to document\n    this.addCssToDocument(cssText, name);\n  },\n  /*\n  * Shim a style element with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimStyle: function(style, selector) {\n    return this.shimCssText(style.textContent, selector);\n  },\n  /*\n  * Shim some cssText with the given selector. Returns cssText that can\n  * be included in the document via Platform.ShadowCSS.addCssToDocument(css).\n  */\n  shimCssText: function(cssText, selector) {\n    cssText = this.insertDirectives(cssText);\n    return this.scopeCssText(cssText, selector);\n  },\n  makeScopeSelector: function(name, typeExtension) {\n    if (name) {\n      return typeExtension ? '[is=' + name + ']' : name;\n    }\n    return '';\n  },\n  isTypeExtension: function(extendsName) {\n    return extendsName && extendsName.indexOf('-') < 0;\n  },\n  prepareRoot: function(root, name, extendsName) {\n    var def = this.registerRoot(root, name, extendsName);\n    this.replaceTextInStyles(def.rootStyles, this.insertDirectives);\n    // remove existing style elements\n    this.removeStyles(root, def.rootStyles);\n    // apply strict attr\n    if (this.strictStyling) {\n      this.applyScopeToContent(root, name);\n    }\n    return def.scopeStyles;\n  },\n  removeStyles: function(root, styles) {\n    for (var i=0, l=styles.length, s; (i<l) && (s=styles[i]); i++) {\n      s.parentNode.removeChild(s);\n    }\n  },\n  registerRoot: function(root, name, extendsName) {\n    var def = this.registry[name] = {\n      root: root,\n      name: name,\n      extendsName: extendsName\n    }\n    var styles = this.findStyles(root);\n    def.rootStyles = styles;\n    def.scopeStyles = def.rootStyles;\n    var extendee = this.registry[def.extendsName];\n    if (extendee) {\n      def.scopeStyles = extendee.scopeStyles.concat(def.scopeStyles);\n    }\n    return def;\n  },\n  findStyles: function(root) {\n    if (!root) {\n      return [];\n    }\n    var styles = root.querySelectorAll('style');\n    return Array.prototype.filter.call(styles, function(s) {\n      return !s.hasAttribute(NO_SHIM_ATTRIBUTE);\n    });\n  },\n  applyScopeToContent: function(root, name) {\n    if (root) {\n      // add the name attribute to each node in root.\n      Array.prototype.forEach.call(root.querySelectorAll('*'),\n          function(node) {\n            node.setAttribute(name, '');\n          });\n      // and template contents too\n      Array.prototype.forEach.call(root.querySelectorAll('template'),\n          function(template) {\n            this.applyScopeToContent(template.content, name);\n          },\n          this);\n    }\n  },\n  insertDirectives: function(cssText) {\n    cssText = this.insertPolyfillDirectivesInCssText(cssText);\n    return this.insertPolyfillRulesInCssText(cssText);\n  },\n  /*\n   * Process styles to convert native ShadowDOM rules that will trip\n   * up the css parser; we rely on decorating the stylesheet with inert rules.\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-next-selector { content: ':host menu-item'; }\n   * ::content menu-item {\n   * \n   * to this:\n   * \n   * scopeName menu-item {\n   *\n  **/\n  insertPolyfillDirectivesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentNextSelectorRe, function(match, p1) {\n      // remove end comment delimiter and add block start\n      return p1.slice(0, -2) + '{';\n    });\n    return cssText.replace(cssContentNextSelectorRe, function(match, p1) {\n      return p1 + ' {';\n    });\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * \n   * For example, we convert this rule:\n   * \n   * polyfill-rule {\n   *   content: ':host menu-item';\n   * ...\n   * }\n   * \n   * to this:\n   * \n   * scopeName menu-item {...}\n   *\n  **/\n  insertPolyfillRulesInCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    cssText = cssText.replace(cssCommentRuleRe, function(match, p1) {\n      // remove end comment delimiter\n      return p1.slice(0, -1);\n    });\n    return cssText.replace(cssContentRuleRe, function(match, p1, p2, p3) {\n      var rule = match.replace(p1, '').replace(p2, '');\n      return p3 + rule;\n    });\n  },\n  /* Ensure styles are scoped. Pseudo-scoping takes a rule like:\n   * \n   *  .foo {... } \n   *  \n   *  and converts this to\n   *  \n   *  scopeName .foo { ... }\n  */\n  scopeCssText: function(cssText, scopeSelector) {\n    var unscoped = this.extractUnscopedRulesFromCssText(cssText);\n    cssText = this.insertPolyfillHostInCssText(cssText);\n    cssText = this.convertColonHost(cssText);\n    cssText = this.convertColonHostContext(cssText);\n    cssText = this.convertCombinators(cssText);\n    if (scopeSelector) {\n      var self = this, cssText;\n      withCssRules(cssText, function(rules) {\n        cssText = self.scopeRules(rules, scopeSelector);\n      });\n\n    }\n    cssText = cssText + '\\n' + unscoped;\n    return cssText.trim();\n  },\n  /*\n   * Process styles to add rules which will only apply under the polyfill\n   * and do not process via CSSOM. (CSSOM is destructive to rules on rare \n   * occasions, e.g. -webkit-calc on Safari.)\n   * For example, we convert this rule:\n   * \n   * (comment start) @polyfill-unscoped-rule menu-item { \n   * ... } (comment end)\n   * \n   * to this:\n   * \n   * menu-item {...}\n   *\n  **/\n  extractUnscopedRulesFromCssText: function(cssText) {\n    // TODO(sorvell): remove either content or comment\n    var r = '', m;\n    while (m = cssCommentUnscopedRuleRe.exec(cssText)) {\n      r += m[1].slice(0, -1) + '\\n\\n';\n    }\n    while (m = cssContentUnscopedRuleRe.exec(cssText)) {\n      r += m[0].replace(m[2], '').replace(m[1], m[3]) + '\\n\\n';\n    }\n    return r;\n  },\n  /*\n   * convert a rule like :host(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar\n  */\n  convertColonHost: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostRe,\n        this.colonHostPartReplacer);\n  },\n  /*\n   * convert a rule like :host-context(.foo) > .bar { }\n   *\n   * to\n   *\n   * scopeName.foo > .bar, .foo scopeName > .bar { }\n   * \n   * and\n   *\n   * :host-context(.foo:host) .bar { ... }\n   * \n   * to\n   * \n   * scopeName.foo .bar { ... }\n  */\n  convertColonHostContext: function(cssText) {\n    return this.convertColonRule(cssText, cssColonHostContextRe,\n        this.colonHostContextPartReplacer);\n  },\n  convertColonRule: function(cssText, regExp, partReplacer) {\n    // p1 = :host, p2 = contents of (), p3 rest of rule\n    return cssText.replace(regExp, function(m, p1, p2, p3) {\n      p1 = polyfillHostNoCombinator;\n      if (p2) {\n        var parts = p2.split(','), r = [];\n        for (var i=0, l=parts.length, p; (i<l) && (p=parts[i]); i++) {\n          p = p.trim();\n          r.push(partReplacer(p1, p, p3));\n        }\n        return r.join(',');\n      } else {\n        return p1 + p3;\n      }\n    });\n  },\n  colonHostContextPartReplacer: function(host, part, suffix) {\n    if (part.match(polyfillHost)) {\n      return this.colonHostPartReplacer(host, part, suffix);\n    } else {\n      return host + part + suffix + ', ' + part + ' ' + host + suffix;\n    }\n  },\n  colonHostPartReplacer: function(host, part, suffix) {\n    return host + part.replace(polyfillHost, '') + suffix;\n  },\n  /*\n   * Convert ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    for (var i=0; i < combinatorsRe.length; i++) {\n      cssText = cssText.replace(combinatorsRe[i], ' ');\n    }\n    return cssText;\n  },\n  // change a selector like 'div' to 'name div'\n  scopeRules: function(cssRules, scopeSelector) {\n    var cssText = '';\n    if (cssRules) {\n      Array.prototype.forEach.call(cssRules, function(rule) {\n        if (rule.selectorText && (rule.style && rule.style.cssText)) {\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 if (rule.cssText) {\n          cssText += rule.cssText + '\\n\\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.applySimpleSelectorScope(p, scopeSelector);\n      }\n      r.push(p);\n    }, this);\n    return r.join(', ');\n  },\n  selectorNeedsScoping: function(selector, scopeSelector) {\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  // scope via name and [is=name]\n  applySimpleSelectorScope: function(selector, scopeSelector) {\n    if (selector.match(polyfillHostRe)) {\n      selector = selector.replace(polyfillHostNoCombinator, scopeSelector);\n      return selector.replace(polyfillHostRe, scopeSelector + ' ');\n    } else {\n      return scopeSelector + ' ' + selector;\n    }\n  },\n  // return a selector with [name] suffix on each simple selector\n  // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name]\n  applyStrictSelectorScope: function(selector, scopeSelector) {\n    scopeSelector = scopeSelector.replace(/\\[is=([^\\]]*)\\]/g, '$1');\n    var splits = [' ', '>', '+', '~'],\n      scoped = selector,\n      attrName = '[' + scopeSelector + ']';\n    splits.forEach(function(sep) {\n      var parts = scoped.split(sep);\n      scoped = parts.map(function(p) {\n        // remove :host since it should be unnecessary\n        var t = p.trim().replace(polyfillHostRe, '');\n        if (t && (splits.indexOf(t) < 0) && (t.indexOf(attrName) < 0)) {\n          p = t.replace(/([^:]*)(:*)(.*)/, '$1' + attrName + '$2$3')\n        }\n        return p;\n      }).join(sep);\n    });\n    return scoped;\n  },\n  insertPolyfillHostInCssText: function(selector) {\n    return selector.replace(colonHostContextRe, polyfillHostContext).replace(\n        colonHostRe, polyfillHost);\n  },\n  propertiesFromRule: function(rule) {\n    var cssText = rule.style.cssText;\n    // TODO(sorvell): Safari cssom incorrectly removes quotes from the content\n    // property. (https://bugs.webkit.org/show_bug.cgi?id=118045)\n    // don't replace attr rules\n    if (rule.style.content && !rule.style.content.match(/['\"]+|attr/)) {\n      cssText = cssText.replace(/content:[^;]*;/g, 'content: \\'' + \n          rule.style.content + '\\';');\n    }\n    // TODO(sorvell): we can workaround this issue here, but we need a list\n    // of troublesome properties to fix https://github.com/Polymer/platform/issues/53\n    //\n    // inherit rules can be omitted from cssText\n    // TODO(sorvell): remove when Blink bug is fixed:\n    // https://code.google.com/p/chromium/issues/detail?id=358273\n    var style = rule.style;\n    for (var i in style) {\n      if (style[i] === 'initial') {\n        cssText += i + ': initial; ';\n      }\n    }\n    return cssText;\n  },\n  replaceTextInStyles: function(styles, action) {\n    if (styles && action) {\n      if (!(styles instanceof Array)) {\n        styles = [styles];\n      }\n      Array.prototype.forEach.call(styles, function(s) {\n        s.textContent = action.call(this, s.textContent);\n      }, this);\n    }\n  },\n  addCssToDocument: function(cssText, name) {\n    if (cssText.match('@import')) {\n      addOwnSheet(cssText, name);\n    } else {\n      addCssToDocument(cssText);\n    }\n  }\n};\n\nvar selectorRe = /([^{]*)({[\\s\\S]*?})/gim,\n    cssCommentRe = /\\/\\*[^*]*\\*+([^/*][^*]*\\*+)*\\//gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentNextSelectorRe = /\\/\\*\\s*@polyfill ([^*]*\\*+([^/*][^*]*\\*+)*\\/)([^{]*?){/gim,\n    cssContentNextSelectorRe = /polyfill-next-selector[^}]*content\\:[\\s]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    cssPseudoRe = /::(x-[^\\s{,(]*)/gim,\n    cssPartRe = /::part\\(([^)]*)\\)/gim,\n    // note: :host pre-processed to -shadowcsshost.\n    polyfillHost = '-shadowcsshost',\n    // note: :host-context pre-processed to -shadowcsshostcontext.\n    polyfillHostContext = '-shadowcsscontext',\n    parenSuffix = ')(?:\\\\((' +\n        '(?:\\\\([^)(]*\\\\)|[^)(]*)+?' +\n        ')\\\\))?([^,{]*)';\n    cssColonHostRe = new RegExp('(' + polyfillHost + parenSuffix, 'gim'),\n    cssColonHostContextRe = new RegExp('(' + polyfillHostContext + parenSuffix, 'gim'),\n    selectorReSuffix = '([>\\\\s~+\\[.,{:][\\\\s\\\\S]*)?$',\n    colonHostRe = /\\:host/gim,\n    colonHostContextRe = /\\:host-context/gim,\n    /* host name without combinator */\n    polyfillHostNoCombinator = polyfillHost + '-no-combinator',\n    polyfillHostRe = new RegExp(polyfillHost, 'gim'),\n    polyfillHostContextRe = new RegExp(polyfillHostContext, 'gim'),\n    combinatorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//g\n    ];\n\nfunction stylesToCssText(styles, preserveComments) {\n  var cssText = '';\n  Array.prototype.forEach.call(styles, function(s) {\n    cssText += s.textContent + '\\n\\n';\n  });\n  // strip comments for easier processing\n  if (!preserveComments) {\n    cssText = cssText.replace(cssCommentRe, '');\n  }\n  return cssText;\n}\n\nfunction cssTextToStyle(cssText) {\n  var style = document.createElement('style');\n  style.textContent = cssText;\n  return style;\n}\n\nfunction cssToRules(cssText) {\n  var style = cssTextToStyle(cssText);\n  document.head.appendChild(style);\n  var rules = [];\n  if (style.sheet) {\n    // TODO(sorvell): Firefox throws when accessing the rules of a stylesheet\n    // with an @import\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=625013\n    try {\n      rules = style.sheet.cssRules;\n    } catch(e) {\n      //\n    }\n  } else {\n    console.warn('sheet not found', style);\n  }\n  style.parentNode.removeChild(style);\n  return rules;\n}\n\nvar frame = document.createElement('iframe');\nframe.style.display = 'none';\n\nfunction initFrame() {\n  frame.initialized = true;\n  document.body.appendChild(frame);\n  var doc = frame.contentDocument;\n  var base = doc.createElement('base');\n  base.href = document.baseURI;\n  doc.head.appendChild(base);\n}\n\nfunction inFrame(fn) {\n  if (!frame.initialized) {\n    initFrame();\n  }\n  document.body.appendChild(frame);\n  fn(frame.contentDocument);\n  document.body.removeChild(frame);\n}\n\n// TODO(sorvell): use an iframe if the cssText contains an @import to workaround\n// https://code.google.com/p/chromium/issues/detail?id=345114\nvar isChrome = navigator.userAgent.match('Chrome');\nfunction withCssRules(cssText, callback) {\n  if (!callback) {\n    return;\n  }\n  var rules;\n  if (cssText.match('@import') && isChrome) {\n    var style = cssTextToStyle(cssText);\n    inFrame(function(doc) {\n      doc.head.appendChild(style.impl);\n      rules = style.sheet.cssRules;\n      callback(rules);\n    });\n  } else {\n    rules = cssToRules(cssText);\n    callback(rules);\n  }\n}\n\nfunction rulesToCss(cssRules) {\n  for (var i=0, css=[]; i < cssRules.length; i++) {\n    css.push(cssRules[i].cssText);\n  }\n  return css.join('\\n\\n');\n}\n\nfunction addCssToDocument(cssText) {\n  if (cssText) {\n    getSheet().appendChild(document.createTextNode(cssText));\n  }\n}\n\nfunction addOwnSheet(cssText, name) {\n  var style = cssTextToStyle(cssText);\n  style.setAttribute(name, '');\n  style.setAttribute(SHIMMED_ATTRIBUTE, '');\n  document.head.appendChild(style);\n}\n\nvar SHIM_ATTRIBUTE = 'shim-shadowdom';\nvar SHIMMED_ATTRIBUTE = 'shim-shadowdom-css';\nvar NO_SHIM_ATTRIBUTE = 'no-shim';\n\nvar sheet;\nfunction getSheet() {\n  if (!sheet) {\n    sheet = document.createElement(\"style\");\n    sheet.setAttribute(SHIMMED_ATTRIBUTE, '');\n    sheet[SHIMMED_ATTRIBUTE] = true;\n  }\n  return sheet;\n}\n\n// add polyfill stylesheet to document\nif (window.ShadowDOMPolyfill) {\n  addCssToDocument('style { display: none !important; }\\n');\n  var doc = wrap(document);\n  var head = doc.querySelector('head');\n  head.insertBefore(getSheet(), head.childNodes[0]);\n\n  // TODO(sorvell): monkey-patching HTMLImports is abusive;\n  // consider a better solution.\n  document.addEventListener('DOMContentLoaded', function() {\n    var urlResolver = scope.urlResolver;\n    \n    if (window.HTMLImports && !HTMLImports.useNative) {\n      var SHIM_SHEET_SELECTOR = 'link[rel=stylesheet]' +\n          '[' + SHIM_ATTRIBUTE + ']';\n      var SHIM_STYLE_SELECTOR = 'style[' + SHIM_ATTRIBUTE + ']';\n      HTMLImports.importer.documentPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n      HTMLImports.importer.importsPreloadSelectors += ',' + SHIM_SHEET_SELECTOR;\n\n      HTMLImports.parser.documentSelectors = [\n        HTMLImports.parser.documentSelectors,\n        SHIM_SHEET_SELECTOR,\n        SHIM_STYLE_SELECTOR\n      ].join(',');\n  \n      var originalParseGeneric = HTMLImports.parser.parseGeneric;\n\n      HTMLImports.parser.parseGeneric = function(elt) {\n        if (elt[SHIMMED_ATTRIBUTE]) {\n          return;\n        }\n        var style = elt.__importElement || elt;\n        if (!style.hasAttribute(SHIM_ATTRIBUTE)) {\n          originalParseGeneric.call(this, elt);\n          return;\n        }\n        if (elt.__resource) {\n          style = elt.ownerDocument.createElement('style');\n          style.textContent = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\n        style.textContent = ShadowCSS.shimStyle(style);\n        style.removeAttribute(SHIM_ATTRIBUTE, '');\n        style.setAttribute(SHIMMED_ATTRIBUTE, '');\n        style[SHIMMED_ATTRIBUTE] = true;\n        // place in document\n        if (style.parentNode !== head) {\n          // replace links in head\n          if (elt.parentNode === head) {\n            head.replaceChild(style, elt);\n          } else {\n            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\n      }\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 * 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  // poor man's adapter for template.content on various platform scenarios\n  window.templateContent = window.templateContent || function(inTemplate) {\n    return inTemplate.content;\n  };\n\n  // so we can call wrap/unwrap without testing for ShadowDOMPolyfill\n\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  window.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})();","/* 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 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// 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);","// Copyright 2011 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(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 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// poor man's adapter for template.content on various platform scenarios\nwindow.templateContent = window.templateContent || function(inTemplate) {\n  return inTemplate.content;\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\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(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","(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        module = dependsOrFactory.apply(this);\n        break;\n      default:\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  scope.module = module;\n  scope.using = using;\n\n})(window);","/*\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\nvar iterations = 0;\nvar callbacks = [];\nvar twiddle = document.createTextNode('');\n\nfunction endOfMicrotask(callback) {\n  twiddle.textContent = iterations++;\n  callbacks.push(callback);\n}\n\nfunction atEndOfMicrotask() {\n  while (callbacks.length) {\n    callbacks.shift()();\n  }\n}\n\nnew (window.MutationObserver || JsMutationObserver)(atEndOfMicrotask)\n  .observe(twiddle, {characterData: true})\n  ;\n\n// exports\n\nscope.endOfMicrotask = endOfMicrotask;\n\n})(Platform);\n\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\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) {\n    cssText = replaceUrlsInCssText(cssText, baseUrl, CSS_URL_REGEXP);\n    return replaceUrlsInCssText(cssText, baseUrl, 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      if (attr && attr.value &&\n         (attr.value.search(URL_TEMPLATE_SEARCH) < 0)) {\n        var urlPath = resolveRelativeUrl(url, attr.value);\n        attr.value = urlPath;\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'];\nvar URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';\nvar URL_TEMPLATE_SEARCH = '{{.*}}';\n\nfunction replaceUrlsInCssText(cssText, baseUrl, regexp) {\n  return cssText.replace(regexp, function(m, pre, url, post) {\n    var urlPath = url.replace(/[\"']/g, '');\n    urlPath = resolveRelativeUrl(baseUrl, urlPath);\n    return pre + '\\'' + urlPath + '\\'' + post;\n  });\n}\n\nfunction resolveRelativeUrl(baseUrl, url) {\n  var u = new URL(url, baseUrl);\n  return makeDocumentRelPath(u.href);\n}\n\nfunction makeDocumentRelPath(url) {\n  var root = 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.pathname, u.pathname);\n  } else {\n    return url;\n  }\n}\n\n// make a relative path from source to target\nfunction makeRelPath(source, target) {\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('/');\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) {\n          this.receive(url, elt, err, resource);\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) {\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 (!err) {\n          this.onload(url, p, resource);\n        //}\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          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, url);\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  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    this.parseNext();\n  },\n  parseImport: function(elt) {\n    elt.import.__importParsed = true;\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    // 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.markParsingComplete(elt);\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    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    var nodes = doc.querySelectorAll(this.parseSelectorsForNode(doc));\n    for (var i=0, l=nodes.length, p=0, n; (i<l) && (n=nodes[i]); i++) {\n      if (!this.isParsed(n)) {\n        if (this.hasResource(n)) {\n          return nodeIsImport(n) ? this.nextToParseInDoc(n.import, n) : n;\n        } else {\n          return;\n        }\n      }\n    }\n    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n","/*\n * Copyright 2013 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\n      flags.load && console.log('loaded', url, elt);\n      // store generic resource\n      // TODO(sorvell): fails for nodes inside <template>.content\n      // see https://code.google.com/p/chromium/issues/detail?id=249381.\n      elt.__resource = resource;\n      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      // go async to ensure parser isn't stuck on a script tag\n      requestAnimationFrame(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')) :\n      link.__importParsed;\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.whenImportsReady = whenImportsReady;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\n\n})(window.HTMLImports);\n"," /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\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  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\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// TODO(sorvell): See https://github.com/Polymer/polymer/issues/399\n// we'll address this by defaulting to CE polyfill in the presence of the SD\n// polyfill. This will avoid spamming excess attached/detached callbacks.\n// If there is a compelling need to run CE native with SD polyfill,\n// we'll need to fix this issue.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill;\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        nativePrototype = Object.getPrototypeOf(inst);\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        var ancestor = Object.getPrototypeOf(proto);\n        proto.__proto__ = ancestor;\n        proto = ancestor;\n      }\n    }\n    // cache this in case of mixin\n    definition.native = nativePrototype;\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    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 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\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 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(function(scope) {\n  var endOfMicrotask = scope.endOfMicrotask;\n\n  // Generic url loader\n  function Loader(regex) {\n    this.regex = regex;\n  }\n  Loader.prototype = {\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      this.fetch(matches, {}, callback);\n    },\n    // build a mapping of url -> text from matches\n    fetch: function(matches, map, callback) {\n      var inflight = matches.length;\n\n      // return early if there is no fetching to be done\n      if (!inflight) {\n        return callback(map);\n      }\n\n      var done = function() {\n        if (--inflight === 0) {\n          callback(map);\n        }\n      };\n\n      // map url -> responseText\n      var handleXhr = function(err, request) {\n        var match = request.match;\n        var key = match.url;\n        // handle errors with an empty string\n        if (err) {\n          map[key] = '';\n          return done();\n        }\n        var response = request.response || request.responseText;\n        map[key] = response;\n        this.fetch(this.extractUrls(response, key), map, done);\n      };\n\n      var m, req, url;\n      for (var i = 0; i < inflight; i++) {\n        m = matches[i];\n        url = m.url;\n        // if this url has already been requested, skip requesting it again\n        if (map[url]) {\n          // Async call to done to simplify the inflight logic\n          endOfMicrotask(done);\n          continue;\n        }\n        req = this.xhr(url, handleXhr, this);\n        req.match = m;\n        // tag the map with an XHR request to deduplicate at the same level\n        map[url] = req;\n      }\n    },\n    xhr: function(url, callback, scope) {\n      var request = new XMLHttpRequest();\n      request.open('GET', url, true);\n      request.send();\n      request.onload = function() {\n        callback.call(scope, null, request);\n      };\n      request.onerror = function() {\n        callback.call(scope, null, request);\n      };\n      return request;\n    }\n  };\n\n  scope.Loader = Loader;\n})(window.Platform);\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(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, callback) {\n    var text = style.textContent;\n    var url = style.ownerDocument.baseURI;\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\n      intermediate = urlResolver.resolveCssText(map[url], url);\n      // flatten intermediate @imports\n      intermediate = this.flatten(intermediate, url, map);\n      text = text.replace(match.matched, intermediate);\n    }\n    return text;\n  },\n  loadStyles: function(styles, 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, loadedStyle);\n    }\n  }\n};\n\nvar styleResolver = new StyleResolver();\n\n// exports\nscope.styleResolver = styleResolver;\n\n})(window.Platform);\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  scope = scope || {};\n  scope.external = scope.external || {};\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      if (inRoot) {\n        var t = inRoot.elementFromPoint(x, y);\n        var st, sr, os;\n        // is element a shadow host?\n        sr = this.targetingShadow(t);\n        while (sr) {\n          // find the the element inside the shadow root\n          st = sr.elementFromPoint(x, y);\n          if (!st) {\n            // check for older shadows\n            sr = this.olderShadow(sr);\n          } else {\n            // shadowed element may contain a shadow root\n            var ssr = this.targetingShadow(st);\n            return this.searchRoot(ssr, x, y) || st;\n          }\n        }\n        // light dom element is the target\n        return t;\n      }\n    },\n    owner: function(element) {\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      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  };\n  scope.targetFinding = target;\n  scope.findTarget = target.findTarget.bind(target);\n\n  window.PointerEventsPolyfill = scope;\n})(window.PointerEventsPolyfill);\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  function shadowSelector(v) {\n    return 'body /shadow-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 + '; touch-action-delay: none; }';\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  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var head = document.head;\n  var hasNativePE = window.PointerEvent || window.MSPointerEvent;\n  // only add shadow selectors if shadowdom is supported\n  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;\n\n  if (hasNativePE) {\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 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 * 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  function PointerEvent(inType, inDict) {\n    inDict = inDict || Object.create(null);\n\n    var e = document.createEvent('Event');\n    e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);\n\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    return e;\n  }\n\n  // attach to window\n  if (!scope.PointerEvent) {\n    scope.PointerEvent = PointerEvent;\n  }\n})(window);\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 * 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.PointerEventsPolyfill);\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  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  ];\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  ];\n\n  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');\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    captureInfo: Object.create(null),\n    // Scope objects for native events.\n    // This exists for ease of testing.\n    eventSources: Object.create(null),\n    eventSourceList: [],\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    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    contains: scope.external.contains || function(container, contained) {\n      return container.contains(contained);\n    },\n    // EVENTS\n    down: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerdown', inEvent);\n    },\n    move: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointermove', inEvent);\n    },\n    up: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerup', inEvent);\n    },\n    enter: function(inEvent) {\n      inEvent.bubbles = false;\n      this.fireEvent('pointerenter', inEvent);\n    },\n    leave: function(inEvent) {\n      inEvent.bubbles = false;\n      this.fireEvent('pointerleave', inEvent);\n    },\n    over: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerover', inEvent);\n    },\n    out: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointerout', inEvent);\n    },\n    cancel: function(inEvent) {\n      inEvent.bubbles = true;\n      this.fireEvent('pointercancel', inEvent);\n    },\n    leaveOut: function(event) {\n      this.out(event);\n      if (!this.contains(event.target, event.relatedTarget)) {\n        this.leave(event);\n      }\n    },\n    enterOver: function(event) {\n      this.over(event);\n      if (!this.contains(event.target, event.relatedTarget)) {\n        this.enter(event);\n      }\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      // This is used to prevent multiple dispatch of pointerevents 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._handledByPE) {\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._handledByPE = true;\n    },\n    // set up event listeners\n    listen: function(target, events) {\n      events.forEach(function(e) {\n        this.addEvent(target, e);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      events.forEach(function(e) {\n        this.removeEvent(target, e);\n      }, this);\n    },\n    addEvent: scope.external.addEvent || function(target, eventName) {\n      target.addEventListener(eventName, this.boundHandler);\n    },\n    removeEvent: scope.external.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      // relatedTarget must be null if pointer is captured\n      if (this.captureInfo[inEvent.pointerId]) {\n        inEvent.relatedTarget = null;\n      }\n      var e = new PointerEvent(inType, inEvent);\n      if (inEvent.preventDefault) {\n        e.preventDefault = inEvent.preventDefault;\n      }\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 (HAS_SVG_INSTANCE && (p === 'target' || p === 'relatedTarget')) {\n          if (eventCopy[p] instanceof SVGElementInstance) {\n            eventCopy[p] = eventCopy[p].correspondingUseElement;\n          }\n        }\n      }\n      // keep the semantics of preventDefault\n      if (inEvent.preventDefault) {\n        eventCopy.preventDefault = function() {\n          inEvent.preventDefault();\n        };\n      }\n      return eventCopy;\n    },\n    getTarget: function(inEvent) {\n      // if pointer capture is set, route all events for the specified pointerId\n      // to the capture target\n      return this.captureInfo[inEvent.pointerId] || inEvent._target;\n    },\n    setCapture: function(inPointerId, inTarget) {\n      if (this.captureInfo[inPointerId]) {\n        this.releaseCapture(inPointerId);\n      }\n      this.captureInfo[inPointerId] = inTarget;\n      var e = document.createEvent('Event');\n      e.initEvent('gotpointercapture', true, false);\n      e.pointerId = inPointerId;\n      this.implicitRelease = this.releaseCapture.bind(this, inPointerId);\n      document.addEventListener('pointerup', this.implicitRelease);\n      document.addEventListener('pointercancel', this.implicitRelease);\n      e._target = inTarget;\n      this.asyncDispatchEvent(e);\n    },\n    releaseCapture: function(inPointerId) {\n      var t = this.captureInfo[inPointerId];\n      if (t) {\n        var e = document.createEvent('Event');\n        e.initEvent('lostpointercapture', true, false);\n        e.pointerId = inPointerId;\n        this.captureInfo[inPointerId] = undefined;\n        document.removeEventListener('pointerup', this.implicitRelease);\n        document.removeEventListener('pointercancel', this.implicitRelease);\n        e._target = t;\n        this.asyncDispatchEvent(e);\n      }\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: scope.external.dispatchEvent || function(inEvent) {\n      var t = this.getTarget(inEvent);\n      if (t) {\n        return t.dispatchEvent(inEvent);\n      }\n    },\n    asyncDispatchEvent: function(inEvent) {\n      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent));\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  scope.dispatcher = dispatcher;\n  scope.register = dispatcher.register.bind(dispatcher);\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n})(window.PointerEventsPolyfill);\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 * 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('PointerEventsPolyfill: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\n})(window.PointerEventsPolyfill);\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  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      'mouseover',\n      'mouseout'\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      // forward mouse preventDefault\n      var pd = e.preventDefault;\n      e.preventDefault = function() {\n        inEvent.preventDefault();\n        pd();\n      };\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\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.cancel(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        pointermap.set(this.POINTER_ID, inEvent);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.get(this.POINTER_ID);\n        if (p && p.button === inEvent.button) {\n          var e = this.prepareEvent(inEvent);\n          dispatcher.up(e);\n          this.cleanupMouse();\n        }\n      }\n    },\n    mouseover: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.enterOver(e);\n      }\n    },\n    mouseout: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        dispatcher.leaveOut(e);\n      }\n    },\n    cancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.cancel(e);\n      this.cleanupMouse();\n    },\n    cleanupMouse: function() {\n      pointermap['delete'](this.POINTER_ID);\n    }\n  };\n\n  scope.mouseEvents = mouseEvents;\n})(window.PointerEventsPolyfill);\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  var dispatcher = scope.dispatcher;\n  var captureInfo = dispatcher.captureInfo;\n  var findTarget = scope.findTarget;\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 ATTRIB = 'touch-action';\n  var INSTALLER;\n  // The presence of touch event handlers blocks scrolling, and so we must be careful to\n  // avoid adding handlers unnecessarily.  Chrome plans to add a touch-action-delay property\n  // (crbug.com/329559) to address this, and once we have that we can opt-in to a simpler\n  // handler registration mechanism.  Rather than try to predict how exactly to opt-in to\n  // that we'll just leave this disabled until there is a build of Chrome to test.\n  var HAS_TOUCH_ACTION_DELAY = 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 (HAS_TOUCH_ACTION_DELAY) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (HAS_TOUCH_ACTION_DELAY) {\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$/\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 = false;\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    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 = captureInfo[id] || findTarget(e);\n      e.bubbles = true;\n      e.cancelable = true;\n      e.detail = this.clickCount;\n      e.button = 0;\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      // 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; i < tl.length; i++) {\n        t = tl[i];\n        inFunction.call(this, this.touchToPointer(t));\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 = inEvent.currentTarget._scrollType;\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        this.firstXY = null;\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.out;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(this.cancelOut, this);\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.overDown);\n      }\n    },\n    overDown: function(inPointer) {\n      var p = pointermap.set(inPointer.pointerId, {\n        target: inPointer.target,\n        out: inPointer,\n        outTarget: inPointer.target\n      });\n      dispatcher.over(inPointer);\n      dispatcher.enter(inPointer);\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (!this.scrolling) {\n        if (this.shouldScroll(inEvent)) {\n          this.scrolling = true;\n          this.touchcancel(inEvent);\n        } else {\n          inEvent.preventDefault();\n          this.processTouches(inEvent, this.moveOverOut);\n        }\n      }\n    },\n    moveOverOut: function(inPointer) {\n      var event = inPointer;\n      var pointer = pointermap.get(event.pointerId);\n      // a finger drifted off the screen, ignore it\n      if (!pointer) {\n        return;\n      }\n      var outEvent = pointer.out;\n      var outTarget = pointer.outTarget;\n      dispatcher.move(event);\n      if (outEvent && outTarget !== event.target) {\n        outEvent.relatedTarget = event.target;\n        event.relatedTarget = outTarget;\n        // recover from retargeting by shadow\n        outEvent.target = outTarget;\n        if (event.target) {\n          dispatcher.leaveOut(outEvent);\n          dispatcher.enterOver(event);\n        } else {\n          // clean up case when finger leaves the screen\n          event.target = outTarget;\n          event.relatedTarget = null;\n          this.cancelOut(event);\n        }\n      }\n      pointer.out = event;\n      pointer.outTarget = event.target;\n    },\n    touchend: function(inEvent) {\n      this.dedupSynthMouse(inEvent);\n      this.processTouches(inEvent, this.upOut);\n    },\n    upOut: function(inPointer) {\n      if (!this.scrolling) {\n        dispatcher.up(inPointer);\n        dispatcher.out(inPointer);\n        dispatcher.leave(inPointer);\n      }\n      this.cleanUpPointer(inPointer);\n    },\n    touchcancel: function(inEvent) {\n      this.processTouches(inEvent, this.cancelOut);\n    },\n    cancelOut: function(inPointer) {\n      dispatcher.cancel(inPointer);\n      dispatcher.out(inPointer);\n      dispatcher.leave(inPointer);\n      this.cleanUpPointer(inPointer);\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 (!HAS_TOUCH_ACTION_DELAY) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PointerEventsPolyfill);\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  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      'MSPointerOut',\n      'MSPointerOver',\n      'MSPointerCancel',\n      'MSGotPointerCapture',\n      'MSLostPointerCapture'\n    ],\n    register: function(target) {\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      if (HAS_BITMAP_TYPE) {\n        e = dispatcher.cloneEvent(inEvent);\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      pointermap.set(inEvent.pointerId, inEvent);\n      var e = this.prepareEvent(inEvent);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.up(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSPointerOut: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.leaveOut(e);\n    },\n    MSPointerOver: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.enterOver(e);\n    },\n    MSPointerCancel: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    },\n    MSLostPointerCapture: function(inEvent) {\n      var e = dispatcher.makeEvent('lostpointercapture', inEvent);\n      dispatcher.dispatchEvent(e);\n    },\n    MSGotPointerCapture: function(inEvent) {\n      var e = dispatcher.makeEvent('gotpointercapture', inEvent);\n      dispatcher.dispatchEvent(e);\n    }\n  };\n\n  scope.msEvents = msEvents;\n})(window.PointerEventsPolyfill);\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 * 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  // only activate if this platform does not have pointer events\n  if (window.PointerEvent !== scope.PointerEvent) {\n\n    if (window.navigator.msPointerEnabled) {\n      var tp = window.navigator.msMaxTouchPoints;\n      Object.defineProperty(window.navigator, 'maxTouchPoints', {\n        value: tp,\n        enumerable: true\n      });\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  }\n})(window.PointerEventsPolyfill);\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  var dispatcher = scope.dispatcher;\n  var n = window.navigator;\n  var s, r;\n  function assertDown(id) {\n    if (!dispatcher.pointermap.has(id)) {\n      throw new Error('InvalidPointerId');\n    }\n  }\n  if (n.msPointerEnabled) {\n    s = function(pointerId) {\n      assertDown(pointerId);\n      this.msSetPointerCapture(pointerId);\n    };\n    r = function(pointerId) {\n      assertDown(pointerId);\n      this.msReleasePointerCapture(pointerId);\n    };\n  } else {\n    s = function setPointerCapture(pointerId) {\n      assertDown(pointerId);\n      dispatcher.setCapture(pointerId, this);\n    };\n    r = function releasePointerCapture(pointerId) {\n      assertDown(pointerId);\n      dispatcher.releaseCapture(pointerId, this);\n    };\n  }\n  if (window.Element && !Element.prototype.setPointerCapture) {\n    Object.defineProperties(Element.prototype, {\n      'setPointerCapture': {\n        value: s\n      },\n      'releasePointerCapture': {\n        value: r\n      }\n    });\n  }\n})(window.PointerEventsPolyfill);\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   * This class contains the gesture recognizers that create the PointerGesture\n   * events.\n   *\n   * @class PointerGestures\n   * @static\n   */\n  scope = scope || {};\n  scope.utils = {\n    LCA: {\n      // Determines the lowest node in the ancestor chain of a and b\n      find: function(a, b) {\n        if (a === b) {\n          return a;\n        }\n        // fast case, a is a direct descendant of b or vice versa\n        if (a.contains) {\n          if (a.contains(b)) {\n            return a;\n          }\n          if (b.contains(a)) {\n            return b;\n          }\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 = this.walk(a, 1);\n          b = this.walk(b, 1);\n        }\n        return a;\n      },\n      walk: function(n, u) {\n        for (var i = 0; i < u; i++) {\n          n = n.parentNode;\n        }\n        return n;\n      },\n      depth: function(n) {\n        var d = 0;\n        while(n) {\n          d++;\n          n = n.parentNode;\n        }\n        return d;\n      }\n    }\n  };\n  scope.findLCA = function(a, b) {\n    return scope.utils.LCA.find(a, b);\n  }\n  window.PointerGestures = scope;\n})(window.PointerGestures);\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 * 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.PointerGestures);\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  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    'screenX',\n    'screenY',\n    'pageX',\n    'pageY',\n    'tapPrevented'\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  ];\n\n  var dispatcher = {\n    handledEvents: new WeakMap(),\n    targets: new WeakMap(),\n    handlers: {},\n    recognizers: {},\n    events: {},\n    // Add a new gesture recognizer to the event listeners.\n    // Recognizer needs an `events` property.\n    registerRecognizer: function(inName, inRecognizer) {\n      var r = inRecognizer;\n      this.recognizers[inName] = r;\n      r.events.forEach(function(e) {\n        if (r[e]) {\n          this.events[e] = true;\n          var f = r[e].bind(r);\n          this.addHandler(e, f);\n        }\n      }, this);\n    },\n    addHandler: function(inEvent, inFn) {\n      var e = inEvent;\n      if (!this.handlers[e]) {\n        this.handlers[e] = [];\n      }\n      this.handlers[e].push(inFn);\n    },\n    // add event listeners for inTarget\n    registerTarget: function(inTarget) {\n      this.listen(Object.keys(this.events), inTarget);\n    },\n    // remove event listeners for inTarget\n    unregisterTarget: function(inTarget) {\n      this.unlisten(Object.keys(this.events), inTarget);\n    },\n    // LISTENER LOGIC\n    eventHandler: function(inEvent) {\n      if (this.handledEvents.get(inEvent)) {\n        return;\n      }\n      var type = inEvent.type, fns = this.handlers[type];\n      if (fns) {\n        this.makeQueue(fns, inEvent);\n      }\n      this.handledEvents.set(inEvent, true);\n    },\n    // queue event for async dispatch\n    makeQueue: function(inHandlerFns, inEvent) {\n      // must clone events to keep the (possibly shadowed) target correct for\n      // async dispatching\n      var e = this.cloneEvent(inEvent);\n      requestAnimationFrame(this.runQueue.bind(this, inHandlerFns, e));\n    },\n    // Dispatch the queued events\n    runQueue: function(inHandlers, inEvent) {\n      this.currentPointerId = inEvent.pointerId;\n      for (var i = 0, f, l = inHandlers.length; (i < l) && (f = inHandlers[i]); i++) {\n        f(inEvent);\n      }\n      this.currentPointerId = 0;\n    },\n    // set up event listeners\n    listen: function(inEvents, inTarget) {\n      inEvents.forEach(function(e) {\n        this.addEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(inEvents) {\n      inEvents.forEach(function(e) {\n        this.removeEvent(e, this.boundHandler, false, inTarget);\n      }, this);\n    },\n    addEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.addEventListener(inEventName, inEventHandler, inCapture);\n    },\n    removeEvent: function(inEventName, inEventHandler, inCapture, inTarget) {\n      inTarget.removeEventListener(inEventName, inEventHandler, inCapture);\n    },\n    // EVENT CREATION AND TRACKING\n    // Creates a new Event of type `inType`, based on the information in\n    // `inEvent`.\n    makeEvent: function(inType, inDict) {\n      return new PointerGestureEvent(inType, inDict);\n    },\n    /*\n     * Returns a snapshot of inEvent, with writable properties.\n     *\n     * @method cloneEvent\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 = {}, 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      }\n      return eventCopy;\n    },\n    // Dispatches the event to its target.\n    dispatchEvent: function(inEvent, inTarget) {\n      var t = inTarget || this.targets.get(inEvent);\n      if (t) {\n        t.dispatchEvent(inEvent);\n        if (inEvent.tapPrevented) {\n          this.preventTap(this.currentPointerId);\n        }\n      }\n    },\n    asyncDispatchEvent: function(inEvent, inTarget) {\n      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent, inTarget));\n    },\n    preventTap: function(inPointerId) {\n      var t = this.recognizers.tap;\n      if (t){\n        t.preventTap(inPointerId);\n      }\n    }\n  };\n  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);\n  // recognizers call into the dispatcher and load later\n  // solve the chicken and egg problem by having registerScopes module run last\n  dispatcher.registerQueue = [];\n  dispatcher.immediateRegister = false;\n  scope.dispatcher = dispatcher;\n  /**\n   * Enable gesture events for a given scope, typically\n   * [ShadowRoots](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-root-object).\n   *\n   * @for PointerGestures\n   * @method register\n   * @param {ShadowRoot} scope A top level scope to enable gesture\n   * support on.\n   */\n  scope.register = function(inScope) {\n    if (dispatcher.immediateRegister) {\n      var pe = window.PointerEventsPolyfill;\n      if (pe) {\n        pe.register(inScope);\n      }\n      scope.dispatcher.registerTarget(inScope);\n    } else {\n      dispatcher.registerQueue.push(inScope);\n    }\n  };\n  scope.register(document);\n})(window.PointerGestures);\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 * 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 released\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\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      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\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    pointerdown: 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    pointerup: function(inEvent) {\n      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {\n        this.cancel();\n      }\n    },\n    pointercancel: function(inEvent) {\n      this.cancel();\n    },\n    pointermove: 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        pointerType: this.heldPointer.pointerType,\n        clientX: this.heldPointer.clientX,\n        clientY: this.heldPointer.clientY\n      };\n      if (inHoldTime) {\n        p.holdTime = inHoldTime;\n      }\n      var e = dispatcher.makeEvent(inType, p);\n      dispatcher.dispatchEvent(e, this.target);\n      if (e.tapPrevented) {\n        dispatcher.preventTap(this.heldPointer.pointerId);\n      }\n    }\n  };\n  dispatcher.registerRecognizer('hold', hold);\n})(window.PointerGestures);\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 * 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 pointermap = new scope.PointerMap();\n   var track = {\n     events: [\n       'pointerdown',\n       'pointermove',\n       'pointerup',\n       'pointercancel'\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 trackData = {\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.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.target,\n         pointerType: inEvent.pointerType\n       };\n       var e = dispatcher.makeEvent(inType, trackData);\n       t.lastMoveEvent = inEvent;\n       dispatcher.dispatchEvent(e, t.downTarget);\n     },\n     pointerdown: 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     pointermove: 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       }\n     },\n     pointerup: 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     pointercancel: function(inEvent) {\n       this.pointerup(inEvent);\n     }\n   };\n   dispatcher.registerRecognizer('track', track);\n })(window.PointerGestures);\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 * This event denotes a rapid down/move/up sequence from a pointer.\n *\n * The event is sent to the first element the pointer went down on.\n *\n * @module PointerGestures\n * @submodule Events\n * @class flick\n */\n/**\n * Signed velocity of the flick in the x direction.\n * @property xVelocity\n * @type Number\n */\n/**\n * Signed velocity of the flick in the y direction.\n * @type Number\n * @property yVelocity\n */\n/**\n * Unsigned total velocity of the flick.\n * @type Number\n * @property velocity\n */\n/**\n * Angle of the flick in degrees, with 0 along the\n * positive x axis.\n * @type Number\n * @property angle\n */\n/**\n * Axis with the greatest absolute velocity. Denoted\n * with 'x' or 'y'.\n * @type String\n * @property majorAxis\n */\n/**\n * Type of the pointer that made the flick.\n * @type String\n * @property pointerType\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var flick = {\n    // TODO(dfreedman): value should be low enough for low speed flicks, but\n    // high enough to remove accidental flicks\n    MIN_VELOCITY: 0.5 /* px/ms */,\n    MAX_QUEUE: 4,\n    moveQueue: [],\n    target: null,\n    pointerId: null,\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    pointerdown: function(inEvent) {\n      if (inEvent.isPrimary && !this.pointerId) {\n        this.pointerId = inEvent.pointerId;\n        this.target = inEvent.target;\n        this.addMove(inEvent);\n      }\n    },\n    pointermove: function(inEvent) {\n      if (inEvent.pointerId === this.pointerId) {\n        this.addMove(inEvent);\n      }\n    },\n    pointerup: function(inEvent) {\n      if (inEvent.pointerId === this.pointerId) {\n        this.fireFlick(inEvent);\n      }\n      this.cleanup();\n    },\n    pointercancel: function(inEvent) {\n      this.cleanup();\n    },\n    cleanup: function() {\n      this.moveQueue = [];\n      this.target = null;\n      this.pointerId = null;\n    },\n    addMove: function(inEvent) {\n      if (this.moveQueue.length >= this.MAX_QUEUE) {\n        this.moveQueue.shift();\n      }\n      this.moveQueue.push(inEvent);\n    },\n    fireFlick: function(inEvent) {\n      var e = inEvent;\n      var l = this.moveQueue.length;\n      var dt, dx, dy, tx, ty, tv, x = 0, y = 0, v = 0;\n      // flick based off the fastest segment of movement\n      for (var i = 0, m; i < l && (m = this.moveQueue[i]); i++) {\n        dt = e.timeStamp - m.timeStamp;\n        dx = e.clientX - m.clientX, dy = e.clientY - m.clientY;\n        tx = dx / dt, ty = dy / dt, tv = Math.sqrt(tx * tx + ty * ty);\n        if (tv > v) {\n          x = tx, y = ty, v = tv;\n        }\n      }\n      var ma = Math.abs(x) > Math.abs(y) ? 'x' : 'y';\n      var a = this.calcAngle(x, y);\n      if (Math.abs(v) >= this.MIN_VELOCITY) {\n        var ev = dispatcher.makeEvent('flick', {\n          xVelocity: x,\n          yVelocity: y,\n          velocity: v,\n          angle: a,\n          majorAxis: ma,\n          pointerType: inEvent.pointerType\n        });\n        dispatcher.dispatchEvent(ev, this.target);\n      }\n    },\n    calcAngle: function(inX, inY) {\n      return (Math.atan2(inY, inX) * 180 / Math.PI);\n    }\n  };\n  dispatcher.registerRecognizer('flick', flick);\n})(window.PointerGestures);\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 * Basic strategy: find the farthest apart points, use as diameter of circle\n * react to size change and rotation of the chord\n */\n\n/**\n * @module PointerGestures\n * @submodule Events\n * @class pinch\n */\n/**\n * Scale of the pinch zoom gesture\n * @property scale\n * @type Number\n */\n/**\n * Center X position of pointers causing pinch\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing pinch\n * @property centerY\n * @type Number\n */\n\n/**\n * @module PointerGestures\n * @submodule Events\n * @class rotate\n */\n/**\n * Angle (in degrees) of rotation. Measured from starting positions of pointers.\n * @property angle\n * @type Number\n */\n/**\n * Center X position of pointers causing rotation\n * @property centerX\n * @type Number\n */\n/**\n * Center Y position of pointers causing rotation\n * @property centerY\n * @type Number\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = new scope.PointerMap();\n  var RAD_TO_DEG = 180 / Math.PI;\n  var pinch = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel'\n    ],\n    reference: {},\n    pointerdown: function(ev) {\n      pointermap.set(ev.pointerId, ev);\n      if (pointermap.pointers() == 2) {\n        var points = this.calcChord();\n        var angle = this.calcAngle(points);\n        this.reference = {\n          angle: angle,\n          diameter: points.diameter,\n          target: scope.findLCA(points.a.target, points.b.target)\n        };\n      }\n    },\n    pointerup: function(ev) {\n      pointermap.delete(ev.pointerId);\n    },\n    pointermove: function(ev) {\n      if (pointermap.has(ev.pointerId)) {\n        pointermap.set(ev.pointerId, ev);\n        if (pointermap.pointers() > 1) {\n          this.calcPinchRotate();\n        }\n      }\n    },\n    pointercancel: function(ev) {\n      this.pointerup(ev);\n    },\n    dispatchPinch: function(diameter, points) {\n      var zoom = diameter / this.reference.diameter;\n      var ev = dispatcher.makeEvent('pinch', {\n        scale: zoom,\n        centerX: points.center.x,\n        centerY: points.center.y\n      });\n      dispatcher.dispatchEvent(ev, this.reference.target);\n    },\n    dispatchRotate: function(angle, points) {\n      var diff = Math.round((angle - this.reference.angle) % 360);\n      var ev = dispatcher.makeEvent('rotate', {\n        angle: diff,\n        centerX: points.center.x,\n        centerY: points.center.y\n      });\n      dispatcher.dispatchEvent(ev, this.reference.target);\n    },\n    calcPinchRotate: function() {\n      var points = this.calcChord();\n      var diameter = points.diameter;\n      var angle = this.calcAngle(points);\n      if (diameter != this.reference.diameter) {\n        this.dispatchPinch(diameter, points);\n      }\n      if (angle != this.reference.angle) {\n        this.dispatchRotate(angle, points);\n      }\n    },\n    calcChord: function() {\n      var pointers = [];\n      pointermap.forEach(function(p) {\n        pointers.push(p);\n      });\n      var dist = 0;\n      // start with at least two pointers\n      var points = {a: pointers[0], b: pointers[1]};\n      var x, y, d;\n      for (var i = 0; i < pointers.length; i++) {\n        var a = pointers[i];\n        for (var j = i + 1; j < pointers.length; j++) {\n          var b = pointers[j];\n          x = Math.abs(a.clientX - b.clientX);\n          y = Math.abs(a.clientY - b.clientY);\n          d = x + y;\n          if (d > dist) {\n            dist = d;\n            points = {a: a, b: b};\n          }\n        }\n      }\n      x = Math.abs(points.a.clientX + points.b.clientX) / 2;\n      y = Math.abs(points.a.clientY + points.b.clientY) / 2;\n      points.center = { x: x, y: y };\n      points.diameter = dist;\n      return points;\n    },\n    calcAngle: function(points) {\n      var x = points.a.clientX - points.b.clientX;\n      var y = points.a.clientY - points.b.clientY;\n      return (360 + Math.atan2(y, x) * RAD_TO_DEG) % 360;\n    },\n  };\n  dispatcher.registerRecognizer('pinch', pinch);\n})(window.PointerGestures);\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 * 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 pointermap = new scope.PointerMap();\n  var tap = {\n    events: [\n      'pointerdown',\n      'pointermove',\n      'pointerup',\n      'pointercancel',\n      'keyup'\n    ],\n    pointerdown: 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    pointermove: function(inEvent) {\n      if (inEvent.isPrimary) {\n        var start = pointermap.get(inEvent.pointerId);\n        if (start) {\n          if (inEvent.tapPrevented) {\n            pointermap.delete(inEvent.pointerId);\n          }\n        }\n      }\n    },\n    shouldTap: function(e, downState) {\n      if (!e.tapPrevented) {\n        if (e.pointerType === 'mouse') {\n          // only allow left click to tap for mouse\n          return downState.buttons === 1;\n        } else {\n          return true;\n        }\n      }\n    },\n    pointerup: function(inEvent) {\n      var start = pointermap.get(inEvent.pointerId);\n      if (start && this.shouldTap(inEvent, start)) {\n        var t = scope.findLCA(start.target, inEvent.target);\n        if (t) {\n          var e = dispatcher.makeEvent('tap', {\n            x: inEvent.clientX,\n            y: inEvent.clientY,\n            detail: inEvent.detail,\n            pointerType: inEvent.pointerType\n          });\n          dispatcher.dispatchEvent(e, t);\n        }\n      }\n      pointermap.delete(inEvent.pointerId);\n    },\n    pointercancel: function(inEvent) {\n      pointermap.delete(inEvent.pointerId);\n    },\n    keyup: function(inEvent) {\n      var code = inEvent.keyCode;\n      // 32 == spacebar\n      if (code === 32) {\n        var t = inEvent.target;\n        if (!(t instanceof HTMLInputElement || t instanceof HTMLTextAreaElement)) {\n          dispatcher.dispatchEvent(dispatcher.makeEvent('tap', {\n            x: 0,\n            y: 0,\n            detail: 0,\n            pointerType: 'unavailable'\n          }), t);\n        }\n      }\n    },\n    preventTap: function(inPointerId) {\n      pointermap.delete(inPointerId);\n    }\n  };\n  dispatcher.registerRecognizer('tap', tap);\n})(window.PointerGestures);\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/**\n * Because recognizers are loaded after dispatcher, we have to wait to register\n * scopes until after all the recognizers.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  function registerScopes() {\n    dispatcher.immediateRegister = true;\n    var rq = dispatcher.registerQueue;\n    rq.forEach(scope.register);\n    rq.length = 0;\n  }\n  if (document.readyState === 'complete') {\n    registerScopes();\n  } else {\n    // register scopes after a steadystate is reached\n    // less MutationObserver churn\n    document.addEventListener('readystatechange', function() {\n      if (document.readyState === 'complete') {\n        registerScopes();\n      }\n    });\n  }\n})(window.PointerGestures);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part 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  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\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\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 = this.bindingMap_;\n      if (!map || map.content !== content) {\n        // TODO(rafaelw): Setup a MutationObserver on content to detect\n        // when the instanceMap is invalid.\n        map = createInstanceBindingMap(content,\n            delegate_ && delegate_.prepareBinding) || [];\n        map.content = content;\n        this.bindingMap_ = map;\n      }\n\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        raw: bindingDelegate,\n        prepareBinding: delegateFn('prepareBinding'),\n        prepareInstanceModel: delegateFn('prepareInstanceModel'),\n        prepareInstancePositionChanged:\n            delegateFn('prepareInstancePositionChanged')\n      };\n    },\n\n    // TODO(rafaelw): Assigning .bindingDelegate always succeeds. It may\n    // make sense to issue a warning or even throw if the template is already\n    // \"activated\", since this would be a strange thing to do.\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    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  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) 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, property;\n\n        expr = parsePrimaryExpression();\n\n        while (match('.') || match('[')) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\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  // 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  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    // convert literal computed property access where literal value is a value\n    // path to ident dot-access.\n    if (accessor == '[' &&\n        property instanceof Literal &&\n        Path.get(property.value).valid) {\n      accessor = '.';\n      property = new IdentPath(property.value);\n    }\n\n    this.dynamicDeps = typeof object == 'function' || object.dynamic;\n\n    this.dynamic = typeof property == 'function' ||\n                   property.dynamic ||\n                   accessor == '[';\n\n    this.simplePath =\n        !this.dynamic &&\n        !this.dynamicDeps &&\n        property instanceof IdentPath &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = accessor == '.' ? property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n        var last = this.object instanceof IdentPath ?\n            this.object.name : this.object.fullPath;\n        this.fullPath_ = Path.get(last + '.' + this.property.name);\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.property instanceof IdentPath) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\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) {\n            var context = object(model, observer);\n            var propName = property(model, observer);\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(value, toModelDirection, filterRegistry, model,\n                        observer) {\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 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('No ' + (toModelDirection ? 'toModel' : 'toDOM') +\n                      ' found on' + this.name);\n        return;\n      }\n\n      var args = [value];\n      for (var i = 0; i < this.args.length; i++) {\n        args[i + 1] = getFn(this.args[i])(model, observer);\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) {\n        return unaryOperators[op](argument(model, observer));\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) {\n        return binaryOperators[op](left(model, observer),\n                                   right(model, observer));\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) {\n        return test(model, observer) ?\n            consequent(model, observer) : alternate(model, observer);\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    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) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer));\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) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] = properties[i].value(model, observer);\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);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(value, false, filterRegistry, model,\n                                          observer);\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(newValue, true, filterRegistry,\n                                                 model);\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  function isEventHandler(name) {\n    return name[0] === 'o' &&\n           name[1] === 'n' &&\n           name[2] === '-';\n  }\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 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 resolveEventReceiver(model, path, node) {\n    if (path.length == 0)\n      return undefined;\n\n    if (path.length == 1)\n      return findScope(model, path[0]);\n\n    for (var i = 0; model != null && i < path.length - 1; i++) {\n      model = model[path[i]];\n    }\n\n    return model;\n  }\n\n  function prepareEventBinding(path, name, polymerExpressions) {\n    var eventType = name.substring(3);\n    eventType = mixedCaseEventTypes[eventType] || eventType;\n\n    return function(model, node, oneTime) {\n      var fn, receiver, handler;\n      if (typeof polymerExpressions.resolveEventHandler == 'function') {\n        handler = function(e) {\n          fn = fn || polymerExpressions.resolveEventHandler(model, path, node);\n          fn(e, e.detail, e.currentTarget);\n\n          if (Platform && typeof Platform.flush == 'function')\n            Platform.flush();\n        };\n      } else {\n        handler = function(e) {\n          fn = fn || path.getValueFrom(model);\n          receiver = receiver || resolveEventReceiver(model, path, node);\n\n          fn.apply(receiver, [e, e.detail, e.currentTarget]);\n\n          if (Platform && typeof Platform.flush == 'function')\n            Platform.flush();\n        };\n      }\n\n      node.addEventListener(eventType, handler);\n\n      if (oneTime)\n        return;\n\n      function bindingValue() {\n        return '{{ ' + path + ' }}';\n      }\n\n      return {\n        open: bindingValue,\n        discardChanges: bindingValue,\n        close: function() {\n          node.removeEventListener(eventType, handler);\n        }\n      };\n    }\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      if (isEventHandler(name)) {\n        if (!path.valid) {\n          console.error('on-* bindings must be simple path expressions');\n          return;\n        }\n\n        return prepareEventBinding(path, name, this);\n      }\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        var scope = Object.create(parentScope);\n        scope[scopeName] = model;\n        scope[indexName] = undefined;\n        scope[parentScopeName] = parentScope;\n        return scope;\n      };\n    }\n  };\n\n  global.PolymerExpressions = PolymerExpressions;\n  if (global.exposeGetExpression)\n    global.getExpression_ = getExpression;\n\n  global.PolymerExpressions.prepareEventBinding = prepareEventBinding;\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 */\n(function(scope) {\n\n// inject style sheet\nvar style = document.createElement('style');\nstyle.textContent = 'template {display: none !important;} /* injected by platform.js */';\nvar head = document.querySelector('head');\nhead.insertBefore(style, head.firstChild);\n\n// flush (with logging)\nvar flushing;\nfunction flush() {\n  if (!flushing) {\n    flushing = true;\n    scope.endOfMicrotask(function() {\n      flushing = false;\n      logFlags.data && console.group('Platform.flush()');\n      scope.performMicrotaskCheckpoint();\n      logFlags.data && console.groupEnd();\n    });\n  }\n};\n\n// polling dirty checker\n// flush periodically if platform does not have object observe.\nif (!Observer.hasObjectObserve) {\n  var FLUSH_POLL_INTERVAL = 125;\n  window.addEventListener('WebComponentsReady', function() {\n    flush();\n    scope.flushPoll = setInterval(flush, FLUSH_POLL_INTERVAL);\n  });\n} else {\n  // make flush a no-op when we have Object.observe\n  flush = function() {};\n}\n\nif (window.CustomElements && !CustomElements.useNative) {\n  var originalImportNode = Document.prototype.importNode;\n  Document.prototype.importNode = function(node, deep) {\n    var imported = originalImportNode.call(this, node, deep);\n    CustomElements.upgradeAll(imported);\n    return imported;\n  }\n}\n\n// exports\nscope.flush = flush;\n\n})(window.Platform);\n\n"]}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/dotdot.sh b/runtime/bin/vmservice/client/dotdot.sh
deleted file mode 100755
index d01587b..0000000
--- a/runtime/bin/vmservice/client/dotdot.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-perl -pi -w -e 's#packages/observatory/src/elements/#../../../../packages/observatory/src/elements/#g;' $*
diff --git a/runtime/bin/vmservice/client/lib/elements.dart b/runtime/bin/vmservice/client/lib/elements.dart
index aeee600..95d065c 100644
--- a/runtime/bin/vmservice/client/lib/elements.dart
+++ b/runtime/bin/vmservice/client/lib/elements.dart
@@ -20,6 +20,7 @@
 export 'package:observatory/src/elements/heap_profile.dart';
 export 'package:observatory/src/elements/instance_ref.dart';
 export 'package:observatory/src/elements/instance_view.dart';
+export 'package:observatory/src/elements/io_view.dart';
 export 'package:observatory/src/elements/isolate_profile.dart';
 export 'package:observatory/src/elements/isolate_ref.dart';
 export 'package:observatory/src/elements/isolate_summary.dart';
diff --git a/runtime/bin/vmservice/client/lib/elements.html b/runtime/bin/vmservice/client/lib/elements.html
index 03550ef..ee101d2 100644
--- a/runtime/bin/vmservice/client/lib/elements.html
+++ b/runtime/bin/vmservice/client/lib/elements.html
@@ -17,6 +17,7 @@
   <link rel="import" href="src/elements/function_ref.html">
   <link rel="import" href="src/elements/function_view.html">
   <link rel="import" href="src/elements/heap_map.html">
+  <link rel="import" href="src/elements/io_view.html">
   <link rel="import" href="src/elements/isolate_ref.html">
   <link rel="import" href="src/elements/isolate_summary.html">
   <link rel="import" href="src/elements/isolate_view.html">
diff --git a/runtime/bin/vmservice/client/lib/src/app/chart.dart b/runtime/bin/vmservice/client/lib/src/app/chart.dart
index 6c43306..3e6205c 100644
--- a/runtime/bin/vmservice/client/lib/src/app/chart.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/chart.dart
@@ -13,17 +13,22 @@
     return _api;
   }
 
+  static Completer _completer = new Completer();
+
+  static Future get onReady => _completer.future;
+
+  static bool get ready => _completer.isCompleted;
+
   /// Load the Google Chart API. Returns a [Future] which completes
   /// when the API is loaded.
   static Future initOnce() {
-    Completer c = new Completer();
     Logger.root.info('Loading Google Charts API');
     context['google'].callMethod('load',
         ['visualization', '1', new JsObject.jsify({
           'packages': ['corechart', 'table'],
-          'callback': new JsFunction.withThis(c.complete)
+          'callback': new JsFunction.withThis(_completer.complete)
     })]);
-    return c.future.then(_initOnceOnComplete);
+    return _completer.future.then(_initOnceOnComplete);
   }
 
   static _initOnceOnComplete(_) {
diff --git a/runtime/bin/vmservice/client/lib/src/elements/action_link.html b/runtime/bin/vmservice/client/lib/src/elements/action_link.html
index 7c1974f..fa691cb 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/action_link.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/action_link.html
@@ -22,5 +22,5 @@
     </template>
 
   </template>
-  <script type="application/dart" src="action_link.dart"></script>
+  <script type="application/dart;component=1" src="action_link.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
index 2e5c4bb..3fbb4c0 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="breakpoint-list" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
@@ -26,5 +26,5 @@
       </ul>
     </template>
   </template>
-  <script type="application/dart" src="breakpoint_list.dart"></script>
+  <script type="application/dart;component=1" src="breakpoint_list.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_ref.html b/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
index 8689f5f..043ecce 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
@@ -3,7 +3,7 @@
 </head>
 <polymer-element name="class-ref" extends="service-ref">
 
-<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+<template><link rel="stylesheet" href="css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
 
-<script type="application/dart" src="class_ref.dart"></script>
+<script type="application/dart;component=1" src="class_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.html b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
index 46ae269..79ccf65 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
@@ -12,7 +12,7 @@
 </head>
 <polymer-element name="class-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
@@ -147,5 +147,5 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart" src="class_view.dart"></script>
+  <script type="application/dart;component=1" src="class_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_ref.html b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
index 6e83e03..f18b3ca 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
@@ -3,7 +3,7 @@
 </head>
 <polymer-element name="code-ref" extends="service-ref">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <template if="{{ code.isDartCode }}">
         <template if="{{ code.isOptimized }}">
           <a href="{{ url }}">*{{ name }}</a>
@@ -16,5 +16,5 @@
       <span>{{ name }}</span>
     </template>
   </template>
-<script type="application/dart" src="code_ref.dart"></script>
+<script type="application/dart;component=1" src="code_ref.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_view.html b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
index 91bbb5c..a40131f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
@@ -5,7 +5,7 @@
 <link rel="import" href="script_ref.html">
 <polymer-element name="code-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <style>
       div.flex-row:hover {
         background-color: #FFF3E3;
@@ -162,5 +162,5 @@
       </template>
     </div>
   </template>
-  <script type="application/dart" src="code_view.dart"></script>
+  <script type="application/dart;component=1" src="code_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html b/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html
index 035e312..2e2f371 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html
@@ -13,5 +13,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart" src="collapsible_content.dart"></script>
+  <script type="application/dart;component=1" src="collapsible_content.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/curly_block.html b/runtime/bin/vmservice/client/lib/src/elements/curly_block.html
index d105267..16f3270 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/curly_block.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/curly_block.html
@@ -36,5 +36,5 @@
       </template>
     </template>
   </template>
-  <script type="application/dart" src="curly_block.dart"></script>
+  <script type="application/dart;component=1" src="curly_block.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/error_view.html b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
index 22aaa59..9f5de00 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="error-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
@@ -14,5 +14,5 @@
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
-  <script type="application/dart" src="error_view.dart"></script>
+  <script type="application/dart;component=1" src="error_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/eval_box.html b/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
index 7d4d50b..add16d3 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
@@ -83,4 +83,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart" src="eval_box.dart"></script>
+<script type="application/dart;component=1" src="eval_box.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/eval_link.dart b/runtime/bin/vmservice/client/lib/src/elements/eval_link.dart
index be08b76..e13aed1 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/eval_link.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_link.dart
@@ -12,8 +12,9 @@
   EvalLinkElement.created() : super.created();
 
   @observable bool busy = false;
+  @published String label = "[evaluate]";
   @published var callback = null;
-  @published String expr = '';
+  @published var expr = '';
   @published ServiceObject result = null;
 
   void evalNow(var a, var b, var c) {
diff --git a/runtime/bin/vmservice/client/lib/src/elements/eval_link.html b/runtime/bin/vmservice/client/lib/src/elements/eval_link.html
index 8de2c84..dcc7746 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/eval_link.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_link.html
@@ -15,15 +15,15 @@
     </style>
 
     <template if="{{ busy }}">
-      <span class="busy">[evaluate]</span>
+      <span class="busy">{{ label }}</span>
     </template>
     <template if="{{ !busy }}">
-      <span class="idle"><a on-click="{{ evalNow }}">[evaluate]</a></span>
+      <span class="idle"><a on-click="{{ evalNow }}">{{ label }}</a></span>
     </template>
     <template if="{{ result != null }}">
       = <instance-ref ref="{{ result }}"></instance-ref>
     </template>
 
   </template>
-  <script type="application/dart" src="eval_link.dart"></script>
+  <script type="application/dart;component=1" src="eval_link.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/field_ref.html b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
index 4aeccc2..ebf0a1e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="field-ref" extends="service-ref">
   <template>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+  <link rel="stylesheet" href="css/shared.css">
     <div>
       <template if="{{ ref['static'] }}">static</template>
       <template if="{{ ref['final'] }}">final</template>
@@ -20,5 +20,5 @@
       <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
     </div>
   </template>
-  <script type="application/dart" src="field_ref.dart"></script>
+  <script type="application/dart;component=1" src="field_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/field_view.html b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
index 1fbb75d..ead150d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
@@ -8,7 +8,7 @@
 </head>
 <polymer-element name="field-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ field.isolate }}"></isolate-nav-menu>
@@ -90,5 +90,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart" src="field_view.dart"></script>
+  <script type="application/dart;component=1" src="field_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_ref.html b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
index cc2c1f4..e29c2b0 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
@@ -3,7 +3,7 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="function-ref" extends="service-ref">
-  <template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css" /><!-- These comments are here to allow newlines.
+  <template><link rel="stylesheet" href="css/shared.css" /><!-- These comments are here to allow newlines.
      --><template if="{{ isDart }}"><!--
        --><template if="{{ qualified && !hasParent && hasClass }}"><!--
        --><class-ref ref="{{ ref['owner'] }}"></class-ref>.</template><!--
@@ -12,5 +12,5 @@
           </function-ref>.<!--
      --></template><a href="{{ url }}">{{ name }}</a><!--
   --></template><template if="{{ !isDart }}"><span> {{ name }}</span></template></template>
-<script type="application/dart" src="function_ref.dart"></script>
+<script type="application/dart;component=1" src="function_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_view.html b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
index 1528938..137b065 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
@@ -10,7 +10,7 @@
 </head>
 <polymer-element name="function-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ function.isolate }}"></isolate-nav-menu>
@@ -115,5 +115,5 @@
 
     <br>
   </template>
-  <script type="application/dart" src="function_view.dart"></script>
+  <script type="application/dart;component=1" src="function_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
index 65e56d8..dfe2797 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="heap-map" extends="observatory-element">
 <template>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+  <link rel="stylesheet" href="css/shared.css">
   <style>
     .hover {
       position: fixed;
@@ -35,5 +35,5 @@
     <canvas id="fragmentation" width="1px" height="1px"></canvas>
   </div>
 </template>
-<script type="application/dart" src="heap_map.dart"></script>
+<script type="application/dart;component=1" src="heap_map.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
index b5c006d..4454a82 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="heap-profile" extends="observatory-element">
 <template>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+  <link rel="stylesheet" href="css/shared.css">
   <style>
     .table {
       border-collapse: collapse!important;
@@ -116,5 +116,5 @@
     </table>
   </div>
 </template>
-<script type="application/dart" src="heap_profile.dart"></script>
+<script type="application/dart;component=1" src="heap_profile.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
index 7ef469a..6627285 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <style>
       .errorBox {
         background-color: #f5f5f5;
@@ -85,5 +85,5 @@
       </template>
     </span>
   </template>
-  <script type="application/dart" src="instance_ref.dart"></script>
+  <script type="application/dart;component=1" src="instance_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
index 6189f19..ac67b18 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
@@ -12,6 +12,7 @@
 @CustomTag('instance-view')
 class InstanceViewElement extends ObservatoryElement {
   @published ServiceMap instance;
+  @published ServiceMap path;
 
   InstanceViewElement.created() : super.created();
 
@@ -21,10 +22,17 @@
   }
 
   // TODO(koda): Add no-arg "calculate-link" instead of reusing "eval-link".
-  Future<ServiceObject> retainedSize(String dummy) {
+  Future<ServiceObject> retainedSize(var dummy) {
     return instance.isolate.get(instance.id + "/retained");
   }
 
+  Future<ServiceObject> retainingPath(var arg) {
+    return instance.isolate.get(instance.id + "/retaining_path?limit=$arg")
+        .then((ServiceObject obj) {
+          path = obj;
+        });
+  }
+
   void refresh(var done) {
     instance.reload().whenComplete(done);
   }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
index ad41d44..bdf61c8 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
@@ -11,7 +11,7 @@
 </head>
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ instance.isolate }}"></isolate-nav-menu>
@@ -55,7 +55,38 @@
           <div class="memberItem">
             <div class="memberName">retained size</div>
             <div class="memberValue">
-              <eval-link callback="{{ retainedSize }}"></eval-link>
+              <eval-link callback="{{ retainedSize }}"
+                         label="[calculate]">
+              </eval-link>
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">retaining path</div>
+            <div class="memberValue">
+              <template if="{{ path == null }}">
+                <eval-link callback="{{ retainingPath }}"
+                           label="[find]"
+                           expr="10">
+                </eval-link>
+              </template>
+              <template if="{{ path != null }}">
+                <template repeat="{{ element in path['elements'] }}">
+                <div class="memberItem">
+                  <div class="memberName">[{{ element['index']}}]</div>
+                  <div class="memberValue">
+                    <instance-ref ref="{{ element['value'] }}"></instance-ref>
+                  </div>
+                  </div>
+                </template>
+                <template if="{{ path['length'] > path['elements'].length }}">
+                  showing {{ path['elements'].length }} of {{ path['length'] }}
+                  <eval-link
+                    callback="{{ retainingPath }}"
+                    label="[find more]"
+                    expr="{{ path['elements'].length * 2 }}">
+                  </eval-link>
+                </template>
+              </template>
             </div>
           </div>
           <template if="{{ instance['type_class'] != null }}">
@@ -148,7 +179,8 @@
       </div>
       <br><br><br><br>
       <br><br><br><br>
+
     </template>
   </template>
-  <script type="application/dart" src="instance_view.dart"></script>
+  <script type="application/dart;component=1" src="instance_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/io_view.dart b/runtime/bin/vmservice/client/lib/src/elements/io_view.dart
new file mode 100644
index 0000000..0796775
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/io_view.dart
@@ -0,0 +1,73 @@
+// 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 io_view_element;
+
+import 'dart:async';
+import 'observatory_element.dart';
+import 'service_ref.dart';
+import 'package:observatory/service.dart';
+import 'package:polymer/polymer.dart';
+
+@CustomTag('io-view')
+class IOViewElement extends ObservatoryElement {
+  @published ServiceMap io;
+
+  IOViewElement.created() : super.created();
+
+  void refresh(var done) {
+    io.reload().whenComplete(done);
+  }
+}
+
+@CustomTag('io-http-server-list-view')
+class IOHttpServerListViewElement extends ObservatoryElement {
+  @published ServiceMap list;
+
+  IOHttpServerListViewElement.created() : super.created();
+
+  void refresh(var done) {
+    list.reload().whenComplete(done);
+  }
+}
+
+@CustomTag('io-http-server-ref')
+class IOHttpServerRefElement extends ServiceRefElement {
+  IOHttpServerRefElement.created() : super.created();
+}
+
+@CustomTag('io-http-server-view')
+class IOHttpServerViewElement extends ObservatoryElement {
+  // TODO(ajohnsen): Create a HttpServer object.
+  @published ServiceMap httpServer;
+  Timer _updateTimer;
+
+  IOHttpServerViewElement.created() : super.created();
+
+  void refresh(var done) {
+    httpServer.reload().whenComplete(done);
+  }
+
+  void _updateHttpServer() {
+    refresh(() {
+      if (_updateTimer != null) {
+        _updateTimer = new Timer(new Duration(seconds: 1), _updateHttpServer);
+      }
+    });
+  }
+
+  void enteredView() {
+    super.enteredView();
+    // Start a timer to update the isolate summary once a second.
+    _updateTimer = new Timer(new Duration(seconds: 1), _updateHttpServer);
+  }
+
+  void leftView() {
+    super.leftView();
+    if (_updateTimer != null) {
+      _updateTimer.cancel();
+      _updateTimer = null;
+    }
+  }
+}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/io_view.html b/runtime/bin/vmservice/client/lib/src/elements/io_view.html
new file mode 100644
index 0000000..62a1346
--- /dev/null
+++ b/runtime/bin/vmservice/client/lib/src/elements/io_view.html
@@ -0,0 +1,103 @@
+<head>
+  <link rel="import" href="nav_bar.html">
+  <link rel="import" href="observatory_element.html">
+  <link rel="import" href="service_ref.html">
+</head>
+<polymer-element name="io-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>dart:io</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <li class="list-group-item">
+          <a href="{{io.isolate.relativeHashLink('io/http/servers')}}">HTTP Servers</a>
+        </li>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-http-server-list-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>HttpServers</h1>
+
+      <br>
+
+      <ul class="list-group">
+        <template repeat="{{ httpServer in list['members'] }}">
+          <li class="list-group-item">
+            <io-http-server-ref ref="{{ httpServer }}"></io-http-server-ref>
+          </li>
+        </template>
+      </ul>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-http-server-ref" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-http-server-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>HttpServer</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Address</div>
+          <div class="memberValue">{{ httpServer['address'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Port</div>
+          <div class="memberValue">{{ httpServer['port'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Active connections</div>
+          <div class="memberValue">{{ httpServer['active'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Idle connections</div>
+          <div class="memberValue">{{ httpServer['idle'] }}</div>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<script type="application/dart;component=1" src="io_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
index 94d4d3e..7975491 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
@@ -7,7 +7,7 @@
 </head>
 <polymer-element name="isolate-profile" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
@@ -186,5 +186,5 @@
       </table>
     </div>
   </template>
-  <script type="application/dart" src="isolate_profile.dart"></script>
+  <script type="application/dart;component=1" src="isolate_profile.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
index 1823ec0..b2858d2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
@@ -2,8 +2,8 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="isolate-ref" extends="service-ref">
-<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+<template><link rel="stylesheet" href="css/shared.css">
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
-<script type="application/dart" src="isolate_ref.dart"></script>
+<script type="application/dart;component=1" src="isolate_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
index 7054ba1..5335782 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.dart
@@ -89,12 +89,19 @@
   IsolateCounterChartElement.created() : super.created();
 
   @published ObservableMap counters;
-  CounterChart chart = new CounterChart();
+  CounterChart chart;
 
   void countersChanged(oldValue) {
     if (counters == null) {
       return;
     }
+    // Lazily create the chart.
+    if (GoogleChart.ready && chart == null) {
+      chart = new CounterChart();
+    }
+    if (chart == null) {
+      return;
+    }
     chart.update(counters);
     var element = shadowRoot.querySelector('#counterPieChart');
     if (element != null) {
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
index b1cebac..8968df2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
@@ -8,10 +8,10 @@
 </head>
 <polymer-element name="isolate-summary" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <div class="flex-row">
       <div class="flex-item-10-percent">
-        <img src="packages/observatory/src/elements/img/isolate_icon.png">
+        <img src="img/isolate_icon.png">
       </div>
       <div class="flex-item-10-percent">
         <isolate-ref ref="{{ isolate }}"></isolate-ref>
@@ -110,7 +110,7 @@
         white-space: pre;
       }
     </style>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <template if="{{ isolate.error != null }}">
       <div class="content-centered">
         <pre class="errorBox">{{ isolate.error.message }}</pre>
@@ -124,47 +124,52 @@
         <isolate-counter-chart counters="{{ isolate.counters }}"></isolate-counter-chart>
       </div>
       <div class="flex-item-40-percent">
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberName">new heap</div>
-              <div class="memberValue">
-                {{ isolate.newHeapUsed | formatSize }}
-                of
-                {{ isolate.newHeapCapacity | formatSize }}
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberName">old heap</div>
-              <div class="memberValue">
-                {{ isolate.oldHeapUsed | formatSize }}
-                of
-                {{ isolate.oldHeapCapacity | formatSize }}
-              </div>
-            </div>
-          </div>
-          <br>
+        <div class="memberList">
           <div class="memberItem">
+            <div class="memberName">new heap</div>
             <div class="memberValue">
-              See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+              {{ isolate.newHeapUsed | formatSize }}
+              of
+              {{ isolate.newHeapCapacity | formatSize }}
             </div>
           </div>
           <div class="memberItem">
+            <div class="memberName">old heap</div>
             <div class="memberValue">
-              See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+              {{ isolate.oldHeapUsed | formatSize }}
+              of
+              {{ isolate.oldHeapCapacity | formatSize }}
             </div>
           </div>
-          <div class="memberList">
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
-              </div>
-            </div>
-            <div class="memberItem">
-              <div class="memberValue">
-                See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
-              </div>
+        </div>
+        <br>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+          </div>
+        </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+          </div>
+        </div>
+        <template if="{{ isolate.ioEnabled }}">
+          <div class="memberItem">
+            <div class="memberValue">
+              See <a href="{{ isolate.relativeHashLink('io') }}">dart:io</a>
             </div>
           </div>
+        </template>
       </div>
       <div class="flex-item-10-percent">
       </div>
@@ -178,4 +183,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart" src="isolate_summary.dart"></script>
+<script type="application/dart;component=1" src="isolate_summary.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
index eda9c16..f7ab7a8 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
@@ -12,7 +12,7 @@
 </head>
 <polymer-element name="isolate-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <style>
       .sourceInset {
         padding-left: 15%;
@@ -137,5 +137,5 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart" src="isolate_view.dart"></script>
+  <script type="application/dart;component=1" src="isolate_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/json_view.dart b/runtime/bin/vmservice/client/lib/src/elements/json_view.dart
index 26b6954..141098d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/json_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/json_view.dart
@@ -74,7 +74,7 @@
 
   void _writeIndent(int depth) {
     const tab = '  ';  // 2 spaces.
-    _buffer.write(depth * tab);
+    _buffer.write(tab * depth);
   }
 
   final _buffer = new StringBuffer();
diff --git a/runtime/bin/vmservice/client/lib/src/elements/json_view.html b/runtime/bin/vmservice/client/lib/src/elements/json_view.html
index f7e42ff..100bcc3 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/json_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/json_view.html
@@ -7,5 +7,5 @@
     </nav-bar>
       <pre>{{ mapAsString }}</pre>
   </template>
-  <script type="application/dart" src="json_view.dart"></script>
+  <script type="application/dart;component=1" src="json_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_ref.html b/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
index 4d04a0b..20242ba 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
@@ -2,7 +2,7 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="library-ref" extends="service-ref">
-<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+<template><link rel="stylesheet" href="css/shared.css">
   <template if="{{ nameIsEmpty }}">
     <a href="{{ url }}">unnamed</a>
   </template>
@@ -10,5 +10,5 @@
     <a href="{{ url }}">{{ name }}</a>
   </template>
 </template>
-<script type="application/dart" src="library_ref.dart"></script>
+<script type="application/dart;component=1" src="library_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_view.html b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
index 58cd763..f525cc2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
@@ -12,7 +12,7 @@
 </head>
 <polymer-element name="library-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
 
     <nav-bar>
       <top-nav-menu></top-nav-menu>
@@ -137,5 +137,5 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart" src="library_view.dart"></script>
+  <script type="application/dart;component=1" src="library_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
index 94af49f..bac4f72 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
@@ -4,7 +4,7 @@
 
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <style>
       nav {
         position: fixed;
@@ -209,4 +209,4 @@
   </template>
 </polymer-element>
 
-<script type="application/dart" src="nav_bar.dart"></script>
+<script type="application/dart;component=1" src="nav_bar.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_application.dart b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.dart
index 852cc69..d1a4f8d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_application.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.dart
@@ -14,9 +14,12 @@
 @CustomTag('observatory-application')
 class ObservatoryApplicationElement extends ObservatoryElement {
   @published bool devtools = false;
-  @observable ObservatoryApplication app;
+  @published ObservatoryApplication app;
 
-  ObservatoryApplicationElement.created() : super.created() {
+  ObservatoryApplicationElement.created() : super.created();
+
+  enteredView() {
+    super.enteredView();
     if (devtools) {
       app = new ObservatoryApplication.devtools();
     } else {
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html
index 58f3d54..9b77f24 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html
@@ -1,11 +1,10 @@
 <head>
-  <link rel="import" href="isolate_profile.html">
-  <link rel="import" href="response_viewer.html">
   <link rel="import" href="observatory_element.html">
+  <link rel="import" href="response_viewer.html">
 </head>
 <polymer-element name="observatory-application" extends="observatory-element">
   <template>
-    <response-viewer app="{{ app }}"></response-viewer>
+    <response-viewer app="{{ this.app }}"></response-viewer>
   </template>
-  <script type="application/dart" src="observatory_application.dart"></script>
+  <script type="application/dart;component=1" src="observatory_application.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
index 2d0d60d..b889559 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
@@ -20,6 +20,10 @@
     super.leftView();
   }
 
+  void ready() {
+    super.ready();
+  }
+
   void attributeChanged(String name, var oldValue, var newValue) {
     super.attributeChanged(name, oldValue, newValue);
   }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.html b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.html
index 8a24a8c..c825782 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.html
@@ -1,3 +1,3 @@
 <polymer-element name="observatory-element">
-  <script type="application/dart" src="observatory_element.dart"></script>
+  <script type="application/dart;component=1" src="observatory_element.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html
index 230120a..0ab71dc 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/response_viewer.html
@@ -6,5 +6,5 @@
   <template>
     <service-view object="{{ app.response }}"></service-view>
   </template>
-  <script type="application/dart" src="response_viewer.dart"></script>
+  <script type="application/dart;component=1" src="response_viewer.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_inset.html b/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
index e4023b4..af4e478 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
@@ -44,5 +44,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart" src="script_inset.dart"></script>
+  <script type="application/dart;component=1" src="script_inset.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_ref.html b/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
index 3f1a0ea..9f4445c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
@@ -4,8 +4,8 @@
 </head>
 <polymer-element name="script-ref" extends="service-ref">
 <template>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+  <link rel="stylesheet" href="css/shared.css">
   <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
-<script type="application/dart" src="script_ref.dart"></script>
+<script type="application/dart;component=1" src="script_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_view.html b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
index 9d5685a1..9876a42 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="script-view" extends="observatory-element">
 <template>
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+  <link rel="stylesheet" href="css/shared.css">
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
@@ -25,5 +25,5 @@
   <h1>script {{ script.name }}</h1>
   </script-inset>
 </template>
-<script type="application/dart" src="script_view.dart"></script>
+<script type="application/dart;component=1" src="script_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
index b215980..da7f132 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="service-error-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
@@ -14,5 +14,5 @@
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
-  <script type="application/dart" src="service_error_view.dart"></script>
+  <script type="application/dart;component=1" src="service_error_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
index b939e38..709e41f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
@@ -4,7 +4,7 @@
 </head>
 <polymer-element name="service-exception-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
     </nav-bar>
@@ -17,5 +17,5 @@
       </template>
     </div>
   </template>
-  <script type="application/dart" src="service_exception_view.dart"></script>
+  <script type="application/dart;component=1" src="service_exception_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_ref.html b/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
index 1818675..d5efab1 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
@@ -2,5 +2,5 @@
   <link rel="import" href="observatory_element.html">
 </head>
 <polymer-element name="service-ref" extends="observatory-element">
-  <script type="application/dart" src="service_ref.dart"></script>
+  <script type="application/dart;component=1" src="service_ref.dart"></script>
 </polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
index 5b08d8a..5817153 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
@@ -87,6 +87,20 @@
         InstanceViewElement element = new Element.tag('instance-view');
         element.instance = object;
         return element;
+      case 'IO':
+        IOViewElement element = new Element.tag('io-view');
+        element.io = object;
+        return element;
+      case 'HttpServerList':
+        IOHttpServerListViewElement element =
+            new Element.tag('io-http-server-list-view');
+        element.list = object;
+        return element;
+      case 'HttpServer':
+        IOHttpServerViewElement element =
+            new Element.tag('io-http-server-view');
+        element.httpServer = object;
+        return element;
       case 'Isolate':
         IsolateViewElement element = new Element.tag('isolate-view');
         element.isolate = object;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_view.html
index 22b3b98..1a12e6d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.html
@@ -18,5 +18,5 @@
 <polymer-element name="service-view" extends="observatory-element">
   <!-- This element explicitly manages the child elements to avoid setting
        an observable property on the old element to an invalid type. -->
-  <script type="application/dart" src="service_view.dart"></script>
+  <script type="application/dart;component=1" src="service_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
index 80f39aa..760fb65 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
@@ -83,5 +83,5 @@
       </label>
     </div>
   </template>
-  <script type="application/dart" src="sliding_checkbox.dart"></script>
+  <script type="application/dart;component=1" src="sliding_checkbox.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
index 1dd6669..2691125 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
@@ -7,7 +7,7 @@
 </head>
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <div class="flex-row">
       <div class="flex-item-fixed-1-12">
       </div>
@@ -37,5 +37,5 @@
       </div>
     </div>
   </template>
-  <script type="application/dart" src="stack_frame.dart"></script>
+  <script type="application/dart;component=1" src="stack_frame.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
index f134d7f..132a486 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
@@ -5,7 +5,7 @@
 </head>
 <polymer-element name="stack-trace" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
@@ -27,5 +27,5 @@
       </ul>
     </template>
   </template>
-  <script type="application/dart" src="stack_trace.dart"></script>
+  <script type="application/dart;component=1" src="stack_trace.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html b/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
index f8e9a10..75d1507 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
@@ -2,8 +2,8 @@
 <link rel="import" href="service_ref.html">
 </head>
 <polymer-element name="vm-ref" extends="service-ref">
-<template><link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+<template><link rel="stylesheet" href="css/shared.css">
   <a href="{{ url }}">{{ ref.name }}</a>
 </template>
-<script type="application/dart" src="vm_ref.dart"></script>
+<script type="application/dart;component=1" src="vm_ref.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/vm_view.html b/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
index ce0fb6e..448d8f4 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
@@ -10,7 +10,7 @@
 </head>
 <polymer-element name="vm-view" extends="observatory-element">
   <template>
-    <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
+    <link rel="stylesheet" href="css/shared.css">
 
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
@@ -51,5 +51,5 @@
       </template>
     </ul>
   </template>
-  <script type="application/dart" src="vm_view.dart"></script>
+  <script type="application/dart;component=1" src="vm_view.dart"></script>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index fc34a83..9665991 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -500,6 +500,7 @@
   @observable bool running = false;
   @observable bool idle = false;
   @observable bool loading = true;
+  @observable bool ioEnabled = false;
 
   Map<String,ServiceObject> _cache = new Map<String,ServiceObject>();
   final TagProfile tagProfile = new TagProfile(20);
@@ -699,6 +700,14 @@
     newHeapCapacity = map['heap']['capacityNew'];
     oldHeapCapacity = map['heap']['capacityOld'];
 
+    List features = map['features'];
+    if (features != null) {
+      for (var feature in features) {
+        if (feature == 'io') {
+          ioEnabled = true;
+        }
+      }
+    }
     // Isolate status
     pauseEvent = map['pauseEvent'];
     running = (!_isPaused && map['topFrame'] != null);
diff --git a/runtime/bin/vmservice/client/notdotdot.sh b/runtime/bin/vmservice/client/notdotdot.sh
deleted file mode 100755
index e044a4f..0000000
--- a/runtime/bin/vmservice/client/notdotdot.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-perl -pi -w -e 's#../../../../packages/observatory/src/elements/#packages/observatory/src/elements/#g;' $*
diff --git a/runtime/bin/vmservice/client/pubspec.yaml b/runtime/bin/vmservice/client/pubspec.yaml
index 29bccf4..dfd30e1 100644
--- a/runtime/bin/vmservice/client/pubspec.yaml
+++ b/runtime/bin/vmservice/client/pubspec.yaml
@@ -1,8 +1,7 @@
 name: observatory
-version: 0.1.9
+version: 0.2.1
 dependencies:
-  polymer: any
-  logging: any
+  polymer: '>= 0.10.0-pre.12'
 transformers:
 - polymer:
     entry_points: 
diff --git a/runtime/bin/vmservice/client/web/index.html b/runtime/bin/vmservice/client/web/index.html
index 9055fd4..cccb646 100644
--- a/runtime/bin/vmservice/client/web/index.html
+++ b/runtime/bin/vmservice/client/web/index.html
@@ -2,11 +2,11 @@
 <head>
   <meta charset="utf-8">
   <title>Dart VM Observatory</title>
+  <link rel="import" href="packages/polymer/polymer.html">
   <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <script type="text/javascript" src="https://www.google.com/jsapi"></script>
-  <script src="packages/browser/interop.js"></script>
   <link rel="import" href="packages/observatory/elements.html">
-  <script type="application/dart" src="main.dart"></script>
+  <script type="application/dart;component=1" src="main.dart"></script>
   <script src="packages/browser/dart.js"></script>
 </head>
 <body>
diff --git a/runtime/bin/vmservice/client/web/index_devtools.html b/runtime/bin/vmservice/client/web/index_devtools.html
index a298514..b8b66c7 100644
--- a/runtime/bin/vmservice/client/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/web/index_devtools.html
@@ -2,9 +2,9 @@
 <head>
   <title>Dart VM Observatory</title>
   <meta charset="utf-8">
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <script type="text/javascript" src="https://www.google.com/jsapi"></script>
-  <script src="packages/browser/interop.js"></script>
+  <link rel="import" href="packages/polymer/polymer.html">
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <link rel="import" href="packages/observatory/elements.html">
   <script type="application/dart" src="main.dart"></script>
   <script src="packages/browser/dart.js"></script>
diff --git a/runtime/bin/vmservice/client/web/main.dart b/runtime/bin/vmservice/client/web/main.dart
index db5153c..26de4a3 100644
--- a/runtime/bin/vmservice/client/web/main.dart
+++ b/runtime/bin/vmservice/client/web/main.dart
@@ -6,7 +6,8 @@
 import 'package:observatory/app.dart';
 import 'package:polymer/polymer.dart';
 
-main() {
+@initMethod
+init() {
   Logger.root.level = Level.INFO;
   Logger.root.onRecord.listen((LogRecord rec) {
       if (rec.level == Level.WARNING &&
@@ -19,9 +20,7 @@
       print('${rec.level.name}: ${rec.time}: ${rec.message}');
   });
   Logger.root.info('Starting Observatory');
-  GoogleChart.initOnce().then((_) {
-    // Charts loaded, initialize polymer.
-    Logger.root.info('Initializing Polymer');
-    initPolymer();
-  });
+  Polymer.onReady.then((_) => GoogleChart.initOnce().then((_) {
+    Logger.root.info('Polymer Ready.');
+  }));
 }
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart
index c86ff8f..dd3e03f 100644
--- a/runtime/lib/array.dart
+++ b/runtime/lib/array.dart
@@ -14,7 +14,7 @@
   void operator []=(int index, E value) native "List_setIndexed";
 
   String toString() {
-    return IterableMixinWorkaround.toStringIterable(this,'[' , ']');
+    return ListBase.listToString(this);
   }
 
   int get length native "List_getLength";
@@ -443,7 +443,7 @@
   }
 
   String toString() {
-    return IterableMixinWorkaround.toStringIterable(this, '[', ']');
+    return ListBase.listToString(this);
   }
 
   int indexOf(Object element, [int start = 0]) {
diff --git a/runtime/lib/collection_patch.dart b/runtime/lib/collection_patch.dart
index 81aa289..e0fd182 100644
--- a/runtime/lib/collection_patch.dart
+++ b/runtime/lib/collection_patch.dart
@@ -634,10 +634,6 @@
     }
   }
 
-  void retainAll(Iterable<Object> objectsToRetain) {
-    super._retainAll(objectsToRetain, (o) => o is E);
-  }
-
   void _filterWhere(bool test(E element), bool removeMatching) {
     int length = _buckets.length;
     for (int index =  0; index < length; index++) {
@@ -757,10 +753,6 @@
     }
   }
 
-  void retainAll(Iterable<Object> elements) {
-    super._retainAll(elements, _validKey);
-  }
-
   bool _equals(e1, e2) => _equality(e1, e2);
   int _hashCode(e) => _hasher(e);
 
@@ -1225,10 +1217,6 @@
     }
   }
 
-  void retainAll(Iterable<Object> elements) {
-    super._retainAll(elements, _validKey);
-  }
-
   HashSet<E> _newSet() =>
       new _LinkedCustomHashSet<E>(_equality, _hasher, _validKey);
 }
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index 18da67a..86791ef 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -327,9 +327,7 @@
     IterableMixinWorkaround.shuffleList(this, random);
   }
 
-  String toString() {
-    return IterableMixinWorkaround.toStringIterable(this, '[', ']');
-  }
+  String toString() => ListBase.listToString(this);
 
   Iterator<T> get iterator {
     return new ListIterator<T>(this);
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index 393d398..b184573 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -589,9 +589,7 @@
 
   // Method(s) implementing Object interface.
 
-  String toString() {
-    return IterableMixinWorkaround.toStringIterable(this, '[', ']');
-  }
+  String toString() => ListBase.listToString(this);
 
 
   // Internal utility methods.
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 576731d..7118245 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -279,6 +279,7 @@
 const int kWordSize = sizeof(word);
 const int kDoubleSize = sizeof(double);  // NOLINT
 const int kFloatSize = sizeof(float);  // NOLINT
+const int kQuadSize = 4 * kFloatSize;
 const int kSimd128Size = sizeof(simd128_value_t);  // NOLINT
 #ifdef ARCH_IS_32_BIT
 const int kWordSizeLog2 = 2;
diff --git a/runtime/platform/thread.h b/runtime/platform/thread.h
index fb56a50..0554d5c 100644
--- a/runtime/platform/thread.h
+++ b/runtime/platform/thread.h
@@ -42,6 +42,7 @@
   static void SetThreadLocal(ThreadLocalKey key, uword value);
   static intptr_t GetMaxStackSize();
   static ThreadId GetCurrentThreadId();
+  static bool Join(ThreadId id);
   static intptr_t ThreadIdToIntPtr(ThreadId id);
   static bool Compare(ThreadId a, ThreadId b);
   static void GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage);
diff --git a/runtime/platform/thread_android.cc b/runtime/platform/thread_android.cc
index 4f3e446..246cd34 100644
--- a/runtime/platform/thread_android.cc
+++ b/runtime/platform/thread_android.cc
@@ -149,6 +149,11 @@
 }
 
 
+bool Thread::Join(ThreadId id) {
+  return false;
+}
+
+
 intptr_t Thread::ThreadIdToIntPtr(ThreadId id) {
   ASSERT(sizeof(id) == sizeof(intptr_t));
   return static_cast<intptr_t>(id);
diff --git a/runtime/platform/thread_linux.cc b/runtime/platform/thread_linux.cc
index 12ea1f9..aedd8d9 100644
--- a/runtime/platform/thread_linux.cc
+++ b/runtime/platform/thread_linux.cc
@@ -150,6 +150,11 @@
 }
 
 
+bool Thread::Join(ThreadId id) {
+  return false;
+}
+
+
 intptr_t Thread::ThreadIdToIntPtr(ThreadId id) {
   ASSERT(sizeof(id) == sizeof(intptr_t));
   return static_cast<intptr_t>(id);
diff --git a/runtime/platform/thread_macos.cc b/runtime/platform/thread_macos.cc
index 01c5c8c..a113abc 100644
--- a/runtime/platform/thread_macos.cc
+++ b/runtime/platform/thread_macos.cc
@@ -142,6 +142,11 @@
 }
 
 
+bool Thread::Join(ThreadId id) {
+  return false;
+}
+
+
 intptr_t Thread::ThreadIdToIntPtr(ThreadId id) {
   ASSERT(sizeof(id) == sizeof(intptr_t));
   return reinterpret_cast<intptr_t>(id);
diff --git a/runtime/platform/thread_win.cc b/runtime/platform/thread_win.cc
index afbae8b..beca34a 100644
--- a/runtime/platform/thread_win.cc
+++ b/runtime/platform/thread_win.cc
@@ -33,18 +33,12 @@
 // is used to ensure that the thread is properly destroyed if the thread just
 // exits.
 static unsigned int __stdcall ThreadEntry(void* data_ptr) {
-  ThreadStartData* data =  reinterpret_cast<ThreadStartData*>(data_ptr);
+  ThreadStartData* data = reinterpret_cast<ThreadStartData*>(data_ptr);
 
   Thread::ThreadStartFunction function = data->function();
   uword parameter = data->parameter();
   delete data;
 
-  ASSERT(ThreadInlineImpl::thread_id_key != Thread::kUnsetThreadLocalKey);
-
-  ThreadId thread_id = ThreadInlineImpl::CreateThreadId();
-  // Set thread ID in TLS.
-  Thread::SetThreadLocal(ThreadInlineImpl::thread_id_key,
-                         reinterpret_cast<DWORD>(thread_id));
   MonitorData::GetMonitorWaitDataForThread();
 
   // Call the supplied thread start function handing it its parameters.
@@ -53,10 +47,6 @@
   // Clean up the monitor wait data for this thread.
   MonitorWaitData::ThreadExit();
 
-  // Clear thread ID in TLS.
-  Thread::SetThreadLocal(ThreadInlineImpl::thread_id_key, NULL);
-  ThreadInlineImpl::DestroyThreadId(thread_id);
-
   return 0;
 }
 
@@ -73,34 +63,14 @@
     return errno;
   }
 
+  // Close the handle, so we don't leak the thread object.
+  CloseHandle(reinterpret_cast<HANDLE>(thread));
+
   return 0;
 }
 
-
-ThreadId ThreadInlineImpl::CreateThreadId() {
-  // Create an ID for this thread that can be shared with other threads.
-  HANDLE thread_id = OpenThread(THREAD_GET_CONTEXT |
-                                THREAD_SUSPEND_RESUME |
-                                THREAD_QUERY_INFORMATION,
-                                false,
-                                GetCurrentThreadId());
-  ASSERT(thread_id != NULL);
-  return thread_id;
-}
-
-
-void ThreadInlineImpl::DestroyThreadId(ThreadId thread_id) {
-  ASSERT(thread_id != NULL);
-  // Destroy thread ID.
-  CloseHandle(thread_id);
-}
-
-
-ThreadLocalKey ThreadInlineImpl::thread_id_key = Thread::kUnsetThreadLocalKey;
-
 ThreadLocalKey Thread::kUnsetThreadLocalKey = TLS_OUT_OF_INDEXES;
-ThreadId Thread::kInvalidThreadId =
-    reinterpret_cast<ThreadId>(INVALID_HANDLE_VALUE);
+ThreadId Thread::kInvalidThreadId = 0;
 
 ThreadLocalKey Thread::CreateThreadLocal() {
   ThreadLocalKey key = TlsAlloc();
@@ -127,16 +97,24 @@
 
 
 ThreadId Thread::GetCurrentThreadId() {
-  ThreadId id = reinterpret_cast<ThreadId>(
-      Thread::GetThreadLocal(ThreadInlineImpl::thread_id_key));
-  ASSERT(id != NULL);
-  return id;
+  return ::GetCurrentThreadId();
+}
+
+
+bool Thread::Join(ThreadId id) {
+  HANDLE handle = OpenThread(SYNCHRONIZE, false, id);
+  if (handle == INVALID_HANDLE_VALUE) {
+    return false;
+  }
+  DWORD res = WaitForSingleObject(handle, INFINITE);
+  CloseHandle(handle);
+  return res == WAIT_OBJECT_0;
 }
 
 
 intptr_t Thread::ThreadIdToIntPtr(ThreadId id) {
-  ASSERT(sizeof(id) == sizeof(intptr_t));
-  return reinterpret_cast<intptr_t>(id);
+  ASSERT(sizeof(id) <= sizeof(intptr_t));
+  return static_cast<intptr_t>(id);
 }
 
 
@@ -163,11 +141,13 @@
   TimeStamp exited;
   TimeStamp kernel;
   TimeStamp user;
-  BOOL result = GetThreadTimes(thread_id,
+  HANDLE handle = OpenThread(THREAD_QUERY_INFORMATION, false, thread_id);
+  BOOL result = GetThreadTimes(handle,
                                &created.ft_,
                                &exited.ft_,
                                &kernel.ft_,
                                &user.ft_);
+  CloseHandle(handle);
   if (!result) {
     FATAL1("GetThreadCpuUsage failed %d\n", GetLastError());
   }
diff --git a/runtime/platform/thread_win.h b/runtime/platform/thread_win.h
index 40e5a11..1fffde0 100644
--- a/runtime/platform/thread_win.h
+++ b/runtime/platform/thread_win.h
@@ -15,7 +15,7 @@
 namespace dart {
 
 typedef DWORD ThreadLocalKey;
-typedef HANDLE ThreadId;
+typedef DWORD ThreadId;
 
 
 class ThreadInlineImpl {
@@ -23,9 +23,6 @@
   ThreadInlineImpl() {}
   ~ThreadInlineImpl() {}
 
-  static ThreadLocalKey thread_id_key;
-  static ThreadId CreateThreadId();
-  static void DestroyThreadId(ThreadId);
   static uword GetThreadLocal(ThreadLocalKey key) {
     static ThreadLocalKey kUnsetThreadLocalKey = TLS_OUT_OF_INDEXES;
     ASSERT(key != kUnsetThreadLocalKey);
@@ -33,7 +30,6 @@
   }
 
   friend class Thread;
-  friend class OS;
   friend unsigned int __stdcall ThreadEntry(void* data_ptr);
 
   DISALLOW_ALLOCATION();
diff --git a/runtime/tools/create_resources.py b/runtime/tools/create_resources.py
index d55f4ee..32ffdb1 100644
--- a/runtime/tools/create_resources.py
+++ b/runtime/tools/create_resources.py
@@ -102,6 +102,9 @@
     parser.add_option("--table_name",
                       action="store", type="string",
                       help="name of table")
+    parser.add_option("--client_root",
+                      action="store", type="string",
+                      help="root directory client resources")
     (options, args) = parser.parse_args()
     if not options.output:
       sys.stderr.write('--output not specified\n')
@@ -114,6 +117,18 @@
       return -1
 
     files = [ ]
+
+    if options.client_root != None:
+      for dirname, dirnames, filenames in os.walk(options.client_root):
+        # strip out all dot files.
+        filenames = [f for f in filenames if not f[0] == '.']
+        dirnames[:] = [d for d in dirnames if not d[0] == '.']
+        for f in filenames:
+          src_path = os.path.join(dirname, f)
+          if (os.path.isdir(src_path)):
+              continue
+          files.append(src_path)
+
     for arg in args:
       files.append(arg)
 
diff --git a/runtime/vm/allocation.cc b/runtime/vm/allocation.cc
index 1c88436..624ad43 100644
--- a/runtime/vm/allocation.cc
+++ b/runtime/vm/allocation.cc
@@ -14,8 +14,8 @@
   UNREACHABLE();
 }
 
-void* ZoneAllocated::operator new(uword size) {
-  Isolate* isolate = Isolate::Current();
+
+static void* Allocate(uword size, BaseIsolate* isolate) {
   ASSERT(isolate != NULL);
   ASSERT(isolate->current_zone() != NULL);
   if (size > static_cast<uword>(kIntptrMax)) {
@@ -24,4 +24,14 @@
   return reinterpret_cast<void*>(isolate->current_zone()->AllocUnsafe(size));
 }
 
+
+void* ZoneAllocated::operator new(uword size) {
+  return Allocate(size, Isolate::Current());
+}
+
+
+void* ZoneAllocated::operator new(uword size, BaseIsolate* isolate) {
+  return Allocate(size, isolate);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/allocation.h b/runtime/vm/allocation.h
index 9b07893..d7b26d63 100644
--- a/runtime/vm/allocation.h
+++ b/runtime/vm/allocation.h
@@ -96,6 +96,10 @@
   // Implicitly allocate the object in the current zone.
   void* operator new(uword size);
 
+  // Implicitly allocate the object in the current zone given the current
+  // isolate.
+  void* operator new(uword size, BaseIsolate* isolate);
+
   // Ideally, the delete operator should be protected instead of
   // public, but unfortunately the compiler sometimes synthesizes
   // (unused) destructors for classes derived from ZoneObject, which
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index a7c442d..1182608 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -2033,10 +2033,56 @@
 }
 
 
-bool Address::CanHoldLoadOffset(OperandSize type,
+OperandSize Address::OperandSizeFor(intptr_t cid) {
+  switch (cid) {
+    case kArrayCid:
+    case kImmutableArrayCid:
+      return kWord;
+    case kOneByteStringCid:
+      return kByte;
+    case kTwoByteStringCid:
+      return kHalfword;
+    case kTypedDataInt8ArrayCid:
+      return kByte;
+    case kTypedDataUint8ArrayCid:
+    case kTypedDataUint8ClampedArrayCid:
+    case kExternalTypedDataUint8ArrayCid:
+    case kExternalTypedDataUint8ClampedArrayCid:
+      return kUnsignedByte;
+    case kTypedDataInt16ArrayCid:
+      return kHalfword;
+    case kTypedDataUint16ArrayCid:
+      return kUnsignedHalfword;
+    case kTypedDataInt32ArrayCid:
+      return kWord;
+    case kTypedDataUint32ArrayCid:
+      return kUnsignedWord;
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
+      UNREACHABLE();
+      return kByte;
+    case kTypedDataFloat32ArrayCid:
+      return kSWord;
+    case kTypedDataFloat64ArrayCid:
+      return kDWord;
+    case kTypedDataFloat32x4ArrayCid:
+    case kTypedDataInt32x4ArrayCid:
+    case kTypedDataFloat64x2ArrayCid:
+      return kRegList;
+    case kTypedDataInt8ArrayViewCid:
+      UNREACHABLE();
+      return kByte;
+    default:
+      UNREACHABLE();
+      return kByte;
+  }
+}
+
+
+bool Address::CanHoldLoadOffset(OperandSize size,
                                 int32_t offset,
                                 int32_t* offset_mask) {
-  switch (type) {
+  switch (size) {
     case kByte:
     case kHalfword:
     case kUnsignedHalfword:
@@ -2045,7 +2091,8 @@
       return Utils::IsAbsoluteUint(8, offset);  // Addressing mode 3.
     }
     case kUnsignedByte:
-    case kWord: {
+    case kWord:
+    case kUnsignedWord: {
       *offset_mask = 0xfff;
       return Utils::IsAbsoluteUint(12, offset);  // Addressing mode 2.
     }
@@ -2055,6 +2102,10 @@
       // VFP addressing mode.
       return (Utils::IsAbsoluteUint(10, offset) && Utils::IsAligned(offset, 4));
     }
+    case kRegList: {
+      *offset_mask = 0x0;
+      return offset == 0;
+    }
     default: {
       UNREACHABLE();
       return false;
@@ -2063,17 +2114,20 @@
 }
 
 
-bool Address::CanHoldStoreOffset(OperandSize type,
+bool Address::CanHoldStoreOffset(OperandSize size,
                                  int32_t offset,
                                  int32_t* offset_mask) {
-  switch (type) {
+  switch (size) {
     case kHalfword:
+    case kUnsignedHalfword:
     case kWordPair: {
       *offset_mask = 0xff;
       return Utils::IsAbsoluteUint(8, offset);  // Addressing mode 3.
     }
     case kByte:
-    case kWord: {
+    case kUnsignedByte:
+    case kWord:
+    case kUnsignedWord: {
       *offset_mask = 0xfff;
       return Utils::IsAbsoluteUint(12, offset);  // Addressing mode 2.
     }
@@ -2083,6 +2137,10 @@
       // VFP addressing mode.
       return (Utils::IsAbsoluteUint(10, offset) && Utils::IsAligned(offset, 4));
     }
+    case kRegList: {
+      *offset_mask = 0x0;
+      return offset == 0;
+    }
     default: {
       UNREACHABLE();
       return false;
@@ -2173,8 +2231,8 @@
 }
 
 
-void Assembler::SignFill(Register rd, Register rm) {
-  Asr(rd, rm, 31);
+void Assembler::SignFill(Register rd, Register rm, Condition cond) {
+  Asr(rd, rm, 31, cond);
 }
 
 
@@ -2354,19 +2412,19 @@
 }
 
 
-void Assembler::LoadFromOffset(OperandSize type,
+void Assembler::LoadFromOffset(OperandSize size,
                                Register reg,
                                Register base,
                                int32_t offset,
                                Condition cond) {
   int32_t offset_mask = 0;
-  if (!Address::CanHoldLoadOffset(type, offset, &offset_mask)) {
+  if (!Address::CanHoldLoadOffset(size, offset, &offset_mask)) {
     ASSERT(base != IP);
     AddImmediate(IP, base, offset & ~offset_mask, cond);
     base = IP;
     offset = offset & offset_mask;
   }
-  switch (type) {
+  switch (size) {
     case kByte:
       ldrsb(reg, Address(base, offset), cond);
       break;
@@ -2391,20 +2449,20 @@
 }
 
 
-void Assembler::StoreToOffset(OperandSize type,
+void Assembler::StoreToOffset(OperandSize size,
                               Register reg,
                               Register base,
                               int32_t offset,
                               Condition cond) {
   int32_t offset_mask = 0;
-  if (!Address::CanHoldStoreOffset(type, offset, &offset_mask)) {
+  if (!Address::CanHoldStoreOffset(size, offset, &offset_mask)) {
     ASSERT(reg != IP);
     ASSERT(base != IP);
     AddImmediate(IP, base, offset & ~offset_mask, cond);
     base = IP;
     offset = offset & offset_mask;
   }
-  switch (type) {
+  switch (size) {
     case kByte:
       strb(reg, Address(base, offset), cond);
       break;
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index 19033fa..44e06f3 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -168,6 +168,7 @@
   kWordPair,
   kSWord,
   kDWord,
+  kRegList,
 };
 
 
@@ -214,6 +215,10 @@
     return *this;
   }
 
+  bool Equals(const Address& other) const {
+    return (encoding_ == other.encoding_) && (kind_ == other.kind_);
+  }
+
   explicit Address(Register rn, int32_t offset = 0, Mode am = Offset) {
     ASSERT(Utils::IsAbsoluteUint(12, offset));
     kind_ = Immediate;
@@ -237,10 +242,12 @@
     encoding_ = so.encoding() | am | (static_cast<uint32_t>(rn) << kRnShift);
   }
 
-  static bool CanHoldLoadOffset(OperandSize type,
+  static OperandSize OperandSizeFor(intptr_t cid);
+
+  static bool CanHoldLoadOffset(OperandSize size,
                                 int32_t offset,
                                 int32_t* offset_mask);
-  static bool CanHoldStoreOffset(OperandSize type,
+  static bool CanHoldStoreOffset(OperandSize size,
                                  int32_t offset,
                                  int32_t* offset_mask);
 
@@ -699,7 +706,7 @@
   void Rrx(Register rd, Register rm, Condition cond = AL);
 
   // Fill rd with the sign of rm.
-  void SignFill(Register rd, Register rm);
+  void SignFill(Register rd, Register rm, Condition cond = AL);
 
   void Vreciprocalqs(QRegister qd, QRegister qm);
   void VreciprocalSqrtqs(QRegister qd, QRegister qm);
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index 5bf20fe..74d9da1 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -442,8 +442,6 @@
   }
 
   // Logical immediate operations.
-  // TODO(zra): Add macros that check IsImmLogical, and fall back on a longer
-  // sequence on failure.
   void andi(Register rd, Register rn, uint64_t imm) {
     Operand imm_op;
     const bool immok = Operand::IsImmLogical(imm, kXRegSizeInBits, &imm_op);
@@ -734,6 +732,27 @@
   }
 
   // SIMD operations.
+  void vand(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VAND, vd, vn, vm);
+  }
+  void vorr(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VORR, vd, vn, vm);
+  }
+  void veor(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VEOR, vd, vn, vm);
+  }
+  void vaddw(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VADDW, vd, vn, vm);
+  }
+  void vaddx(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VADDX, vd, vn, vm);
+  }
+  void vsubw(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VSUBW, vd, vn, vm);
+  }
+  void vsubx(VRegister vd, VRegister vn, VRegister vm) {
+    EmitSIMDThreeSameOp(VSUBX, vd, vn, vm);
+  }
   void vadds(VRegister vd, VRegister vn, VRegister vm) {
     EmitSIMDThreeSameOp(VADDS, vd, vn, vm);
   }
@@ -758,18 +777,57 @@
   void vdivd(VRegister vd, VRegister vn, VRegister vm) {
     EmitSIMDThreeSameOp(VDIVD, vd, vn, vm);
   }
+  void vnot(VRegister vd, VRegister vn) {
+    EmitSIMDTwoRegOp(VNOT, vd, vn);
+  }
+  void vabss(VRegister vd, VRegister vn) {
+    EmitSIMDTwoRegOp(VABSS, vd, vn);
+  }
+  void vabsd(VRegister vd, VRegister vn) {
+    EmitSIMDTwoRegOp(VABSD, vd, vn);
+  }
+  void vnegs(VRegister vd, VRegister vn) {
+    EmitSIMDTwoRegOp(VNEGS, vd, vn);
+  }
+  void vnegd(VRegister vd, VRegister vn) {
+    EmitSIMDTwoRegOp(VNEGD, vd, vn);
+  }
+  void vdupw(VRegister vd, Register rn) {
+    const VRegister vn = static_cast<VRegister>(rn);
+    EmitSIMDCopyOp(VDUPI, vd, vn, kWord, 0, 0);
+  }
+  void vdupx(VRegister vd, Register rn) {
+    const VRegister vn = static_cast<VRegister>(rn);
+    EmitSIMDCopyOp(VDUPI, vd, vn, kDoubleWord, 0, 0);
+  }
   void vdups(VRegister vd, VRegister vn, int32_t idx) {
     EmitSIMDCopyOp(VDUP, vd, vn, kSWord, 0, idx);
   }
   void vdupd(VRegister vd, VRegister vn, int32_t idx) {
     EmitSIMDCopyOp(VDUP, vd, vn, kDWord, 0, idx);
   }
+  void vinsw(VRegister vd, int32_t didx, Register rn) {
+    const VRegister vn = static_cast<VRegister>(rn);
+    EmitSIMDCopyOp(VINSI, vd, vn, kWord, 0, didx);
+  }
+  void vinsx(VRegister vd, int32_t didx, Register rn) {
+    const VRegister vn = static_cast<VRegister>(rn);
+    EmitSIMDCopyOp(VINSI, vd, vn, kDoubleWord, 0, didx);
+  }
   void vinss(VRegister vd, int32_t didx, VRegister vn, int32_t sidx) {
     EmitSIMDCopyOp(VINS, vd, vn, kSWord, sidx, didx);
   }
   void vinsd(VRegister vd, int32_t didx, VRegister vn, int32_t sidx) {
     EmitSIMDCopyOp(VINS, vd, vn, kDWord, sidx, didx);
   }
+  void vmovrs(Register rd, VRegister vn, int32_t sidx) {
+    const VRegister vd = static_cast<VRegister>(rd);
+    EmitSIMDCopyOp(VMOVW, vd, vn, kWord, 0, sidx);
+  }
+  void vmovrd(Register rd, VRegister vn, int32_t sidx) {
+    const VRegister vd = static_cast<VRegister>(rd);
+    EmitSIMDCopyOp(VMOVX, vd, vn, kDoubleWord, 0, sidx);
+  }
 
   // Aliases.
   void mov(Register rd, Register rn) {
@@ -779,6 +837,9 @@
       orr(rd, ZR, Operand(rn));
     }
   }
+  void vmov(VRegister vd, VRegister vn) {
+    vorr(vd, vn, vn);
+  }
   void mvn(Register rd, Register rm) {
     orn(rd, ZR, Operand(rm));
   }
@@ -799,11 +860,23 @@
     ASSERT(reg != PP);  // Only pop PP with PopAndUntagPP().
     ldr(reg, Address(SP, 1 * kWordSize, Address::PostIndex));
   }
+  void PushFloat(VRegister reg) {
+    fstrs(reg, Address(SP, -1 * kFloatSize, Address::PreIndex));
+  }
   void PushDouble(VRegister reg) {
-    fstrd(reg, Address(SP, -1 * kWordSize, Address::PreIndex));
+    fstrd(reg, Address(SP, -1 * kDoubleSize, Address::PreIndex));
+  }
+  void PushQuad(VRegister reg) {
+    fstrq(reg, Address(SP, -1 * kQuadSize, Address::PreIndex));
+  }
+  void PopFloat(VRegister reg) {
+    fldrs(reg, Address(SP, 1 * kFloatSize, Address::PostIndex));
   }
   void PopDouble(VRegister reg) {
-    fldrd(reg, Address(SP, 1 * kWordSize, Address::PostIndex));
+    fldrd(reg, Address(SP, 1 * kDoubleSize, Address::PostIndex));
+  }
+  void PopQuad(VRegister reg) {
+    fldrq(reg, Address(SP, 1 * kQuadSize, Address::PostIndex));
   }
   void TagAndPushPP() {
     // Add the heap object tag back to PP before putting it on the stack.
@@ -1464,6 +1537,14 @@
     Emit(encoding);
   }
 
+  void EmitSIMDTwoRegOp(SIMDTwoRegOp op, VRegister vd, VRegister vn) {
+    const int32_t encoding =
+        op |
+        (static_cast<int32_t>(vd) << kVdShift) |
+        (static_cast<int32_t>(vn) << kVnShift);
+    Emit(encoding);
+  }
+
   void StoreIntoObjectFilter(Register object, Register value, Label* no_update);
 
   // Shorter filtering sequence that assumes that value is not a smi.
diff --git a/runtime/vm/assembler_arm64_test.cc b/runtime/vm/assembler_arm64_test.cc
index 7fed7c3..92134a3 100644
--- a/runtime/vm/assembler_arm64_test.cc
+++ b/runtime/vm/assembler_arm64_test.cc
@@ -1846,6 +1846,191 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(VinswVmovrs, assembler) {
+  __ LoadImmediate(R0, 42, kNoPP);
+  __ LoadImmediate(R1, 43, kNoPP);
+  __ LoadImmediate(R2, 44, kNoPP);
+  __ LoadImmediate(R3, 45, kNoPP);
+
+  __ vinsw(V0, 0, R0);
+  __ vinsw(V0, 1, R1);
+  __ vinsw(V0, 2, R2);
+  __ vinsw(V0, 3, R3);
+
+  __ vmovrs(R4, V0, 0);
+  __ vmovrs(R5, V0, 1);
+  __ vmovrs(R6, V0, 2);
+  __ vmovrs(R7, V0, 3);
+
+  __ add(R0, R4, Operand(R5));
+  __ add(R0, R0, Operand(R6));
+  __ add(R0, R0, Operand(R7));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(VinswVmovrs, test) {
+  EXPECT(test != NULL);
+  typedef int (*Tst)();
+  EXPECT_EQ(174, EXECUTE_TEST_CODE_INT64(Tst, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(VinsxVmovrd, assembler) {
+  __ LoadImmediate(R0, 42, kNoPP);
+  __ LoadImmediate(R1, 43, kNoPP);
+
+  __ vinsx(V0, 0, R0);
+  __ vinsx(V0, 1, R1);
+
+  __ vmovrd(R2, V0, 0);
+  __ vmovrd(R3, V0, 1);
+
+  __ add(R0, R2, Operand(R3));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(VinsxVmovrd, test) {
+  EXPECT(test != NULL);
+  typedef int (*Tst)();
+  EXPECT_EQ(85, EXECUTE_TEST_CODE_INT64(Tst, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vnot, assembler) {
+  __ LoadImmediate(R0, 0xfffffffe, kNoPP);
+  __ LoadImmediate(R1, 0xffffffff, kNoPP);
+  __ vinsw(V1, 0, R1);
+  __ vinsw(V1, 1, R0);
+  __ vinsw(V1, 2, R1);
+  __ vinsw(V1, 3, R0);
+
+  __ vnot(V0, V1);
+
+  __ vmovrs(R2, V0, 0);
+  __ vmovrs(R3, V0, 1);
+  __ vmovrs(R4, V0, 2);
+  __ vmovrs(R5, V0, 3);
+  __ add(R0, R2, Operand(R3));
+  __ add(R0, R0, Operand(R4));
+  __ add(R0, R0, Operand(R5));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vnot, test) {
+  EXPECT(test != NULL);
+  typedef int (*Tst)();
+  EXPECT_EQ(2, EXECUTE_TEST_CODE_INT64(Tst, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vabss, assembler) {
+  __ LoadDImmediate(V1, 21.0, kNoPP);
+  __ LoadDImmediate(V2, -21.0, kNoPP);
+
+  __ fcvtsd(V1, V1);
+  __ fcvtsd(V2, V2);
+
+  __ veor(V3, V3, V3);
+  __ vinss(V3, 1, V1, 0);
+  __ vinss(V3, 3, V2, 0);
+
+  __ vabss(V4, V3);
+
+  __ vinss(V5, 0, V4, 1);
+  __ vinss(V6, 0, V4, 3);
+
+  __ fcvtds(V5, V5);
+  __ fcvtds(V6, V6);
+
+  __ faddd(V0, V5, V6);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vabss, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vabsd, assembler) {
+  __ LoadDImmediate(V1, 21.0, kNoPP);
+  __ LoadDImmediate(V2, -21.0, kNoPP);
+
+  __ vinsd(V3, 0, V1, 0);
+  __ vinsd(V3, 1, V2, 0);
+
+  __ vabsd(V4, V3);
+
+  __ vinsd(V5, 0, V4, 0);
+  __ vinsd(V6, 0, V4, 1);
+
+  __ faddd(V0, V5, V6);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vabsd, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vnegs, assembler) {
+  __ LoadDImmediate(V1, 42.0, kNoPP);
+  __ LoadDImmediate(V2, -84.0, kNoPP);
+
+  __ fcvtsd(V1, V1);
+  __ fcvtsd(V2, V2);
+
+  __ veor(V3, V3, V3);
+  __ vinss(V3, 1, V1, 0);
+  __ vinss(V3, 3, V2, 0);
+
+  __ vnegs(V4, V3);
+
+  __ vinss(V5, 0, V4, 1);
+  __ vinss(V6, 0, V4, 3);
+
+  __ fcvtds(V5, V5);
+  __ fcvtds(V6, V6);
+  __ faddd(V0, V5, V6);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vnegs, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vnegd, assembler) {
+  __ LoadDImmediate(V1, 42.0, kNoPP);
+  __ LoadDImmediate(V2, -84.0, kNoPP);
+
+  __ vinsd(V3, 0, V1, 0);
+  __ vinsd(V3, 1, V2, 0);
+
+  __ vnegd(V4, V3);
+
+  __ vinsd(V5, 0, V4, 0);
+  __ vinsd(V6, 0, V4, 1);
+
+  __ faddd(V0, V5, V6);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vnegd, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
 ASSEMBLER_TEST_GENERATE(Vadds, assembler) {
   __ LoadDImmediate(V0, 0.0, kNoPP);
   __ LoadDImmediate(V1, 1.0, kNoPP);
@@ -1857,21 +2042,17 @@
   __ fcvtsd(V2, V2);
   __ fcvtsd(V3, V3);
 
-  const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord);
-  const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
-  __ fstrs(V0, Address(SP, -1 * sword_bytes, Address::PreIndex));
-  __ fstrs(V1, Address(SP, -1 * sword_bytes, Address::PreIndex));
-  __ fstrs(V2, Address(SP, -1 * sword_bytes, Address::PreIndex));
-  __ fstrs(V3, Address(SP, -1 * sword_bytes, Address::PreIndex));
+  __ vinss(V4, 0, V0, 0);
+  __ vinss(V4, 1, V1, 0);
+  __ vinss(V4, 2, V2, 0);
+  __ vinss(V4, 3, V3, 0);
 
-  __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
   __ vadds(V5, V4, V4);
-  __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
 
-  __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex));
-  __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex));
-  __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex));
-  __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex));
+  __ vinss(V0, 0, V5, 0);
+  __ vinss(V1, 0, V5, 1);
+  __ vinss(V2, 0, V5, 2);
+  __ vinss(V3, 0, V5, 3);
 
   __ fcvtds(V0, V0);
   __ fcvtds(V1, V1);
@@ -1903,21 +2084,17 @@
   __ fcvtsd(V2, V2);
   __ fcvtsd(V3, V3);
 
-  const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord);
-  const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
-  __ fstrs(V0, Address(SP, -1 * sword_bytes, Address::PreIndex));
-  __ fstrs(V1, Address(SP, -1 * sword_bytes, Address::PreIndex));
-  __ fstrs(V2, Address(SP, -1 * sword_bytes, Address::PreIndex));
-  __ fstrs(V3, Address(SP, -1 * sword_bytes, Address::PreIndex));
+  __ vinss(V4, 0, V0, 0);
+  __ vinss(V4, 1, V1, 0);
+  __ vinss(V4, 2, V2, 0);
+  __ vinss(V4, 3, V3, 0);
 
-  __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
   __ vsubs(V5, V5, V4);
-  __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
 
-  __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex));
-  __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex));
-  __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex));
-  __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex));
+  __ vinss(V0, 0, V5, 0);
+  __ vinss(V1, 0, V5, 1);
+  __ vinss(V2, 0, V5, 2);
+  __ vinss(V3, 0, V5, 3);
 
   __ fcvtds(V0, V0);
   __ fcvtds(V1, V1);
@@ -1948,21 +2125,17 @@
   __ fcvtsd(V2, V2);
   __ fcvtsd(V3, V3);
 
-  const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord);
-  const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
-  __ fstrs(V0, Address(SP, -1 * sword_bytes, Address::PreIndex));
-  __ fstrs(V1, Address(SP, -1 * sword_bytes, Address::PreIndex));
-  __ fstrs(V2, Address(SP, -1 * sword_bytes, Address::PreIndex));
-  __ fstrs(V3, Address(SP, -1 * sword_bytes, Address::PreIndex));
+  __ vinss(V4, 0, V0, 0);
+  __ vinss(V4, 1, V1, 0);
+  __ vinss(V4, 2, V2, 0);
+  __ vinss(V4, 3, V3, 0);
 
-  __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
   __ vmuls(V5, V4, V4);
-  __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
 
-  __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex));
-  __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex));
-  __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex));
-  __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex));
+  __ vinss(V0, 0, V5, 0);
+  __ vinss(V1, 0, V5, 1);
+  __ vinss(V2, 0, V5, 2);
+  __ vinss(V3, 0, V5, 3);
 
   __ fcvtds(V0, V0);
   __ fcvtds(V1, V1);
@@ -1993,21 +2166,17 @@
   __ fcvtsd(V2, V2);
   __ fcvtsd(V3, V3);
 
-  const int sword_bytes = 1 << Log2OperandSizeBytes(kSWord);
-  const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
-  __ fstrs(V0, Address(SP, -1 * sword_bytes, Address::PreIndex));
-  __ fstrs(V1, Address(SP, -1 * sword_bytes, Address::PreIndex));
-  __ fstrs(V2, Address(SP, -1 * sword_bytes, Address::PreIndex));
-  __ fstrs(V3, Address(SP, -1 * sword_bytes, Address::PreIndex));
+  __ vinss(V4, 0, V0, 0);
+  __ vinss(V4, 1, V1, 0);
+  __ vinss(V4, 2, V2, 0);
+  __ vinss(V4, 3, V3, 0);
 
-  __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
   __ vdivs(V5, V4, V4);
-  __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
 
-  __ fldrs(V3, Address(SP, 1 * sword_bytes, Address::PostIndex));
-  __ fldrs(V2, Address(SP, 1 * sword_bytes, Address::PostIndex));
-  __ fldrs(V1, Address(SP, 1 * sword_bytes, Address::PostIndex));
-  __ fldrs(V0, Address(SP, 1 * sword_bytes, Address::PostIndex));
+  __ vinss(V0, 0, V5, 0);
+  __ vinss(V1, 0, V5, 1);
+  __ vinss(V2, 0, V5, 2);
+  __ vinss(V3, 0, V5, 3);
 
   __ fcvtds(V0, V0);
   __ fcvtds(V1, V1);
@@ -2027,22 +2196,17 @@
 }
 
 
-
 ASSEMBLER_TEST_GENERATE(Vaddd, assembler) {
   __ LoadDImmediate(V0, 2.0, kNoPP);
   __ LoadDImmediate(V1, 3.0, kNoPP);
 
-  const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord);
-  const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
-  __ fstrd(V0, Address(SP, -1 * dword_bytes, Address::PreIndex));
-  __ fstrd(V1, Address(SP, -1 * dword_bytes, Address::PreIndex));
+  __ vinsd(V4, 0, V0, 0);
+  __ vinsd(V4, 1, V1, 0);
 
-  __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
   __ vaddd(V5, V4, V4);
-  __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
 
-  __ fldrd(V1, Address(SP, 1 * dword_bytes, Address::PostIndex));
-  __ fldrd(V0, Address(SP, 1 * dword_bytes, Address::PostIndex));
+  __ vinsd(V0, 0, V5, 0);
+  __ vinsd(V1, 0, V5, 1);
 
   __ faddd(V0, V0, V1);
   __ ret();
@@ -2060,17 +2224,13 @@
   __ LoadDImmediate(V1, 3.0, kNoPP);
   __ LoadDImmediate(V5, 0.0, kNoPP);
 
-  const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord);
-  const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
-  __ fstrd(V0, Address(SP, -1 * dword_bytes, Address::PreIndex));
-  __ fstrd(V1, Address(SP, -1 * dword_bytes, Address::PreIndex));
+  __ vinsd(V4, 0, V0, 0);
+  __ vinsd(V4, 1, V1, 0);
 
-  __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
   __ vsubd(V5, V5, V4);
-  __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
 
-  __ fldrd(V1, Address(SP, 1 * dword_bytes, Address::PostIndex));
-  __ fldrd(V0, Address(SP, 1 * dword_bytes, Address::PostIndex));
+  __ vinsd(V0, 0, V5, 0);
+  __ vinsd(V1, 0, V5, 1);
 
   __ faddd(V0, V0, V1);
   __ ret();
@@ -2087,17 +2247,13 @@
   __ LoadDImmediate(V0, 2.0, kNoPP);
   __ LoadDImmediate(V1, 3.0, kNoPP);
 
-  const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord);
-  const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
-  __ fstrd(V0, Address(SP, -1 * dword_bytes, Address::PreIndex));
-  __ fstrd(V1, Address(SP, -1 * dword_bytes, Address::PreIndex));
+  __ vinsd(V4, 0, V0, 0);
+  __ vinsd(V4, 1, V1, 0);
 
-  __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
   __ vmuld(V5, V4, V4);
-  __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
 
-  __ fldrd(V1, Address(SP, 1 * dword_bytes, Address::PostIndex));
-  __ fldrd(V0, Address(SP, 1 * dword_bytes, Address::PostIndex));
+  __ vinsd(V0, 0, V5, 0);
+  __ vinsd(V1, 0, V5, 1);
 
   __ faddd(V0, V0, V1);
   __ ret();
@@ -2114,17 +2270,13 @@
   __ LoadDImmediate(V0, 2.0, kNoPP);
   __ LoadDImmediate(V1, 3.0, kNoPP);
 
-  const int dword_bytes = 1 << Log2OperandSizeBytes(kDWord);
-  const int qword_bytes = 1 << Log2OperandSizeBytes(kQWord);
-  __ fstrd(V0, Address(SP, -1 * dword_bytes, Address::PreIndex));
-  __ fstrd(V1, Address(SP, -1 * dword_bytes, Address::PreIndex));
+  __ vinsd(V4, 0, V0, 0);
+  __ vinsd(V4, 1, V1, 0);
 
-  __ fldrq(V4, Address(SP, 1 * qword_bytes, Address::PostIndex));
   __ vdivd(V5, V4, V4);
-  __ fstrq(V5, Address(SP, -1 * qword_bytes, Address::PreIndex));
 
-  __ fldrd(V1, Address(SP, 1 * dword_bytes, Address::PostIndex));
-  __ fldrd(V0, Address(SP, 1 * dword_bytes, Address::PostIndex));
+  __ vinsd(V0, 0, V5, 0);
+  __ vinsd(V1, 0, V5, 1);
 
   __ faddd(V0, V0, V1);
   __ ret();
@@ -2247,6 +2399,209 @@
 }
 
 
+ASSEMBLER_TEST_GENERATE(Vand, assembler) {
+  __ LoadDImmediate(V1, 21.0, kNoPP);
+  __ LoadImmediate(R0, 0xffffffff, kNoPP);
+
+  // V0 <- (0, 0xffffffff, 0, 0xffffffff)
+  __ fmovdr(V0, R0);
+  __ vinss(V0, 2, V0, 0);
+
+  // V1 <- (21.0, 21.0, 21.0, 21.0)
+  __ fcvtsd(V1, V1);
+  __ vdups(V1, V1, 0);
+
+  __ vand(V2, V1, V0);
+
+  __ vinss(V3, 0, V2, 0);
+  __ vinss(V4, 0, V2, 1);
+  __ vinss(V5, 0, V2, 2);
+  __ vinss(V6, 0, V2, 3);
+
+  __ fcvtds(V3, V3);
+  __ fcvtds(V4, V4);
+  __ fcvtds(V5, V5);
+  __ fcvtds(V6, V6);
+
+  __ vaddd(V0, V3, V4);
+  __ vaddd(V0, V0, V5);
+  __ vaddd(V0, V0, V6);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vand, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vorr, assembler) {
+  __ LoadDImmediate(V1, 10.5, kNoPP);
+  __ fcvtsd(V1, V1);
+
+  // V0 <- (0, 10.5, 0, 10.5)
+  __ fmovdd(V0, V1);
+  __ vinss(V0, 2, V0, 0);
+
+  // V1 <- (10.5, 0, 10.5, 0)
+  __ veor(V1, V1, V1);
+  __ vinss(V1, 1, V0, 0);
+  __ vinss(V1, 3, V0, 0);
+
+  __ vorr(V2, V1, V0);
+
+  __ vinss(V3, 0, V2, 0);
+  __ vinss(V4, 0, V2, 1);
+  __ vinss(V5, 0, V2, 2);
+  __ vinss(V6, 0, V2, 3);
+
+  __ fcvtds(V3, V3);
+  __ fcvtds(V4, V4);
+  __ fcvtds(V5, V5);
+  __ fcvtds(V6, V6);
+
+  __ vaddd(V0, V3, V4);
+  __ vaddd(V0, V0, V5);
+  __ vaddd(V0, V0, V6);
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vorr, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42.0, EXECUTE_TEST_CODE_DOUBLE(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Veor, assembler) {
+  __ LoadImmediate(R1, 0xffffffff, kNoPP);
+  __ LoadImmediate(R2, ~21, kNoPP);
+
+  __ vinsw(V1, 0, R1);
+  __ vinsw(V1, 1, R2);
+  __ vinsw(V1, 2, R1);
+  __ vinsw(V1, 3, R2);
+
+  __ vinsw(V2, 0, R1);
+  __ vinsw(V2, 1, R1);
+  __ vinsw(V2, 2, R1);
+  __ vinsw(V2, 3, R1);
+
+  __ veor(V0, V1, V2);
+
+  __ vmovrs(R3, V0, 0);
+  __ vmovrs(R4, V0, 1);
+  __ vmovrs(R5, V0, 2);
+  __ vmovrs(R6, V0, 3);
+
+  __ add(R0, R3, Operand(R4));
+  __ add(R0, R0, Operand(R5));
+  __ add(R0, R0, Operand(R6));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Veor, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vaddw, assembler) {
+  __ LoadImmediate(R4, 21, kNoPP);
+
+  __ vdupw(V1, R4);
+  __ vdupw(V2, R4);
+
+  __ vaddw(V0, V1, V2);
+
+  __ vmovrs(R0, V0, 0);
+  __ vmovrs(R1, V0, 1);
+  __ vmovrs(R2, V0, 2);
+  __ vmovrs(R3, V0, 3);
+  __ add(R0, R0, Operand(R1));
+  __ add(R0, R0, Operand(R2));
+  __ add(R0, R0, Operand(R3));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vaddw, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(168, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vsubw, assembler) {
+  __ LoadImmediate(R4, 31, kNoPP);
+  __ LoadImmediate(R5, 10, kNoPP);
+
+  __ vdupw(V1, R4);
+  __ vdupw(V2, R5);
+
+  __ vsubw(V0, V1, V2);
+
+  __ vmovrs(R0, V0, 0);
+  __ vmovrs(R1, V0, 1);
+  __ vmovrs(R2, V0, 2);
+  __ vmovrs(R3, V0, 3);
+  __ add(R0, R0, Operand(R1));
+  __ add(R0, R0, Operand(R2));
+  __ add(R0, R0, Operand(R3));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vsubw, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(84, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vaddx, assembler) {
+  __ LoadImmediate(R4, 21, kNoPP);
+
+  __ vdupx(V1, R4);
+  __ vdupx(V2, R4);
+
+  __ vaddx(V0, V1, V2);
+
+  __ vmovrd(R0, V0, 0);
+  __ vmovrd(R1, V0, 1);
+  __ add(R0, R0, Operand(R1));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vaddx, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(84, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
+ASSEMBLER_TEST_GENERATE(Vsubx, assembler) {
+  __ LoadImmediate(R4, 31, kNoPP);
+  __ LoadImmediate(R5, 10, kNoPP);
+
+  __ vdupx(V1, R4);
+  __ vdupx(V2, R5);
+
+  __ vsubx(V0, V1, V2);
+
+  __ vmovrd(R0, V0, 0);
+  __ vmovrd(R1, V0, 1);
+  __ add(R0, R0, Operand(R1));
+  __ ret();
+}
+
+
+ASSEMBLER_TEST_RUN(Vsubx, test) {
+  typedef int (*SimpleCode)();
+  EXPECT_EQ(42, EXECUTE_TEST_CODE_INT64(SimpleCode, test->entry()));
+}
+
+
 // Called from assembler_test.cc.
 // LR: return address.
 // R0: context.
diff --git a/runtime/vm/block_scheduler.cc b/runtime/vm/block_scheduler.cc
index 1591929..99d4ba3 100644
--- a/runtime/vm/block_scheduler.cc
+++ b/runtime/vm/block_scheduler.cc
@@ -10,11 +10,17 @@
 
 namespace dart {
 
+DEFINE_FLAG(bool, emit_edge_counters, true, "Emit edge counters at targets.");
+
 // Compute the edge count at the deopt id of a TargetEntry or Goto.
 static intptr_t ComputeEdgeCount(const Code& unoptimized_code,
                                  intptr_t deopt_id) {
   ASSERT(deopt_id != Isolate::kNoDeoptId);
 
+  if (!FLAG_emit_edge_counters) {
+    // Assume everything was visited once.
+    return 1;
+  }
   uword pc = unoptimized_code.GetPcForDeoptId(deopt_id, PcDescriptors::kDeopt);
   Array& array = Array::Handle();
   array ^= CodePatcher::GetEdgeCounterAt(pc, unoptimized_code);
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index faac1ea..c2f79f6 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -55,7 +55,6 @@
 
 DECLARE_FLAG(int, deoptimization_counter_threshold);
 DECLARE_FLAG(bool, enable_type_checks);
-DECLARE_FLAG(bool, report_usage_count);
 DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
 DEFINE_FLAG(bool, use_osr, true, "Use on-stack replacement.");
diff --git a/runtime/vm/code_patcher.cc b/runtime/vm/code_patcher.cc
index 46f8a4d..7aca73d 100644
--- a/runtime/vm/code_patcher.cc
+++ b/runtime/vm/code_patcher.cc
@@ -17,10 +17,9 @@
                                                      intptr_t size)
     : address_(address), size_(size) {
   if (FLAG_write_protect_code) {
-    bool status =
-        VirtualMemory::Protect(reinterpret_cast<void*>(address),
-                               size,
-                               VirtualMemory::kReadWrite);
+    bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address),
+                                         size,
+                                         VirtualMemory::kReadWrite);
     ASSERT(status);
   }
 }
@@ -28,10 +27,9 @@
 
 WritableInstructionsScope::~WritableInstructionsScope() {
   if (FLAG_write_protect_code) {
-    bool status =
-        VirtualMemory::Protect(reinterpret_cast<void*>(address_),
-                               size_,
-                               VirtualMemory::kReadExecute);
+    bool status = VirtualMemory::Protect(reinterpret_cast<void*>(address_),
+                                         size_,
+                                         VirtualMemory::kReadExecute);
     ASSERT(status);
   }
 }
diff --git a/runtime/vm/constants_arm64.h b/runtime/vm/constants_arm64.h
index d5550e4..46459b4 100644
--- a/runtime/vm/constants_arm64.h
+++ b/runtime/vm/constants_arm64.h
@@ -457,6 +457,10 @@
 enum SIMDCopyOp {
   SIMDCopyMask = 0x9fe08400,
   SIMDCopyFixed = DPSimd1Fixed | B10,
+  VDUPI = SIMDCopyFixed | B30 | B11,
+  VINSI = SIMDCopyFixed | B30 | B12 | B11,
+  VMOVW = SIMDCopyFixed | B13 | B12 | B11,
+  VMOVX = SIMDCopyFixed | B30 | B13 | B12 | B11,
   VDUP = SIMDCopyFixed | B30,
   VINS = SIMDCopyFixed | B30 | B29,
 };
@@ -465,6 +469,13 @@
 enum SIMDThreeSameOp {
   SIMDThreeSameMask = 0x9f200400,
   SIMDThreeSameFixed = DPSimd1Fixed | B21 | B10,
+  VAND = SIMDThreeSameFixed | B30 | B12 | B11,
+  VORR = SIMDThreeSameFixed | B30 | B23 | B12 | B11,
+  VEOR = SIMDThreeSameFixed | B30 | B29 | B12 | B11,
+  VADDW = SIMDThreeSameFixed | B30 | B23 | B15,
+  VADDX = SIMDThreeSameFixed | B30 | B23 | B22 | B15,
+  VSUBW = SIMDThreeSameFixed | B30 | B29 | B23 | B15,
+  VSUBX = SIMDThreeSameFixed | B30 | B29 | B23 | B22 | B15,
   VADDS = SIMDThreeSameFixed | B30 | B15 | B14 | B12,
   VADDD = SIMDThreeSameFixed | B30 | B22 | B15 | B14 | B12,
   VSUBS = SIMDThreeSameFixed | B30 | B23 | B15 | B14 | B12,
@@ -475,6 +486,17 @@
   VDIVD = SIMDThreeSameFixed | B30 | B29 | B22 | B15 | B14 | B13 | B12 | B11,
 };
 
+// C.3.6.17
+enum SIMDTwoRegOp {
+  SIMDTwoRegMask = 0x9f3e0c00,
+  SIMDTwoRegFixed = DPSimd1Fixed | B21 | B11,
+  VNOT = SIMDTwoRegFixed | B30 | B29 | B14 | B12,
+  VABSS = SIMDTwoRegFixed | B30 | B23 | B15 | B14 | B13 | B12,
+  VNEGS = SIMDTwoRegFixed | B30 | B29 | B23 | B15 | B14 | B13 | B12,
+  VABSD = SIMDTwoRegFixed | B30 | B23 | B22 | B15 | B14 | B13 | B12,
+  VNEGD = SIMDTwoRegFixed | B30 | B29 | B23 | B22 | B15 | B14 | B13 | B12,
+};
+
 // C.3.6.22
 enum FPCompareOp {
   FPCompareMask = 0xffa0fc07,
@@ -552,6 +574,7 @@
 _V(LogicalShift)                                                               \
 _V(SIMDCopy)                                                                   \
 _V(SIMDThreeSame)                                                              \
+_V(SIMDTwoReg)                                                                 \
 _V(FPCompare)                                                                  \
 _V(FPOneSource)                                                                \
 _V(FPTwoSource)                                                                \
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 6835887..4c04cba 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -44,6 +44,7 @@
             "Check function fingerprints");
 DEFINE_FLAG(bool, trace_api, false,
             "Trace invocation of API calls (debug mode only)");
+DEFINE_FLAG(bool, load_async, true, "load source code asynchronously");
 
 ThreadLocalKey Api::api_native_key_ = Thread::kUnsetThreadLocalKey;
 Dart_Handle Api::true_handle_ = NULL;
@@ -1193,10 +1194,7 @@
 
 
 DART_EXPORT bool Dart_IsVMFlagSet(const char* flag_name) {
-  if (Flags::Lookup(flag_name) != NULL) {
-    return true;
-  }
-  return false;
+  return Flags::IsSet(flag_name);
 }
 
 
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 3470c06..00c847f 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -5264,7 +5264,7 @@
 
     EXPECT(arg_values[1].as_int32 == 77);
 
-    EXPECT(arg_values[2].as_uint64 == 0xffffffffffffffff);
+    EXPECT(arg_values[2].as_uint64 == 0xffffffffffffffffLL);
 
     EXPECT(arg_values[3].as_bool == true);
 
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 49d2d70..5802280 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -27,11 +27,12 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, verbose_debug, false, "Verbose debugger messages");
-DEFINE_FLAG(bool, trace_debugger_stacktrace, false,
-            "Trace debugger stacktrace collection");
+DEFINE_FLAG(bool, enable_debugger, true, "Enables debugger step checks");
 DEFINE_FLAG(bool, show_invisible_frames, false,
             "Show invisible frames in debugger stack traces");
+DEFINE_FLAG(bool, trace_debugger_stacktrace, false,
+            "Trace debugger stacktrace collection");
+DEFINE_FLAG(bool, verbose_debug, false, "Verbose debugger messages");
 
 
 Debugger::EventHandler* Debugger::event_handler_ = NULL;
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index 0c9a7ec..47b580c 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -1392,12 +1392,13 @@
 };
 
 
-DeoptInfoBuilder::DeoptInfoBuilder(const intptr_t num_args)
-    : instructions_(),
+DeoptInfoBuilder::DeoptInfoBuilder(Isolate* isolate, const intptr_t num_args)
+    : isolate_(isolate),
+      instructions_(),
       object_table_(GrowableObjectArray::Handle(
           GrowableObjectArray::New(Heap::kOld))),
       num_args_(num_args),
-      trie_root_(new TrieNode()),
+      trie_root_(new(isolate) TrieNode()),
       current_info_number_(0),
       frame_start_(-1),
       materializations_() {
@@ -1436,7 +1437,8 @@
 #endif
   const intptr_t object_table_index = FindOrAddObjectInTable(code);
   ASSERT(dest_index == FrameSize());
-  instructions_.Add(new DeoptRetAddressInstr(object_table_index, deopt_id));
+  instructions_.Add(
+      new(isolate()) DeoptRetAddressInstr(object_table_index, deopt_id));
 }
 
 
@@ -1444,7 +1446,7 @@
                                    intptr_t dest_index) {
   intptr_t object_table_index = FindOrAddObjectInTable(code);
   ASSERT(dest_index == FrameSize());
-  instructions_.Add(new DeoptPcMarkerInstr(object_table_index));
+  instructions_.Add(new(isolate()) DeoptPcMarkerInstr(object_table_index));
 }
 
 
@@ -1452,7 +1454,7 @@
                              intptr_t dest_index) {
   intptr_t object_table_index = FindOrAddObjectInTable(code);
   ASSERT(dest_index == FrameSize());
-  instructions_.Add(new DeoptPpInstr(object_table_index));
+  instructions_.Add(new(isolate()) DeoptPpInstr(object_table_index));
 }
 
 
@@ -1462,42 +1464,45 @@
   DeoptInstr* deopt_instr = NULL;
   if (source_loc.IsConstant()) {
     intptr_t object_table_index = FindOrAddObjectInTable(source_loc.constant());
-    deopt_instr = new DeoptConstantInstr(object_table_index);
+    deopt_instr = new(isolate()) DeoptConstantInstr(object_table_index);
   } else if (source_loc.IsRegister()) {
     ASSERT(value->definition()->representation() == kTagged);
-    deopt_instr = new DeoptRegisterInstr(source_loc.reg());
+    deopt_instr = new(isolate()) DeoptRegisterInstr(source_loc.reg());
   } else if (source_loc.IsFpuRegister()) {
     if (value->definition()->representation() == kUnboxedDouble) {
-      deopt_instr = new DeoptFpuRegisterInstr(source_loc.fpu_reg());
+      deopt_instr = new(isolate()) DeoptFpuRegisterInstr(source_loc.fpu_reg());
     } else if (value->definition()->representation() == kUnboxedFloat32x4) {
-      deopt_instr = new DeoptFloat32x4FpuRegisterInstr(source_loc.fpu_reg());
+      deopt_instr =
+          new(isolate()) DeoptFloat32x4FpuRegisterInstr(source_loc.fpu_reg());
     } else if (value->definition()->representation() == kUnboxedInt32x4) {
-      deopt_instr = new DeoptInt32x4FpuRegisterInstr(source_loc.fpu_reg());
+      deopt_instr =
+          new(isolate()) DeoptInt32x4FpuRegisterInstr(source_loc.fpu_reg());
     } else {
       ASSERT(value->definition()->representation() == kUnboxedFloat64x2);
-      deopt_instr = new DeoptFloat64x2FpuRegisterInstr(source_loc.fpu_reg());
+      deopt_instr =
+          new(isolate()) DeoptFloat64x2FpuRegisterInstr(source_loc.fpu_reg());
     }
   } else if (source_loc.IsStackSlot()) {
     ASSERT(value->definition()->representation() == kTagged);
     intptr_t source_index = CalculateStackIndex(source_loc);
-    deopt_instr = new DeoptStackSlotInstr(source_index);
+    deopt_instr = new(isolate()) DeoptStackSlotInstr(source_index);
   } else if (source_loc.IsDoubleStackSlot()) {
     intptr_t source_index = CalculateStackIndex(source_loc);
     if (value->definition()->representation() == kUnboxedDouble) {
-      deopt_instr = new DeoptDoubleStackSlotInstr(source_index);
+      deopt_instr = new(isolate()) DeoptDoubleStackSlotInstr(source_index);
     } else {
       ASSERT(value->definition()->representation() == kUnboxedMint);
-      deopt_instr = new DeoptInt64StackSlotInstr(source_index);
+      deopt_instr = new(isolate()) DeoptInt64StackSlotInstr(source_index);
     }
   } else if (source_loc.IsQuadStackSlot()) {
     intptr_t source_index = CalculateStackIndex(source_loc);
     if (value->definition()->representation() == kUnboxedFloat32x4) {
-      deopt_instr = new DeoptFloat32x4StackSlotInstr(source_index);
+      deopt_instr = new(isolate()) DeoptFloat32x4StackSlotInstr(source_index);
     } else if (value->definition()->representation() == kUnboxedInt32x4) {
-      deopt_instr = new DeoptInt32x4StackSlotInstr(source_index);
+      deopt_instr = new(isolate()) DeoptInt32x4StackSlotInstr(source_index);
     } else {
       ASSERT(value->definition()->representation() == kUnboxedFloat64x2);
-      deopt_instr = new DeoptFloat64x2StackSlotInstr(source_index);
+      deopt_instr = new(isolate()) DeoptFloat64x2StackSlotInstr(source_index);
     }
   } else if (source_loc.IsPairLocation()) {
     ASSERT(value->definition()->representation() == kUnboxedMint);
@@ -1509,20 +1514,21 @@
     // 4) S, R.
     PairLocation* pair = source_loc.AsPairLocation();
     if (pair->At(0).IsRegister() && pair->At(1).IsRegister()) {
-      deopt_instr = new DeoptInt64RegisterPairInstr(pair->At(0).reg(),
-                                                    pair->At(1).reg());
+      deopt_instr =
+          new(isolate()) DeoptInt64RegisterPairInstr(pair->At(0).reg(),
+                                                     pair->At(1).reg());
     } else if (pair->At(0).IsStackSlot() && pair->At(1).IsStackSlot()) {
-      deopt_instr = new DeoptInt64StackSlotPairInstr(
+      deopt_instr = new(isolate()) DeoptInt64StackSlotPairInstr(
           CalculateStackIndex(pair->At(0)),
           CalculateStackIndex(pair->At(1)));
     } else if (pair->At(0).IsRegister() && pair->At(1).IsStackSlot()) {
-      deopt_instr = new DeoptInt64StackSlotRegisterInstr(
+      deopt_instr = new(isolate()) DeoptInt64StackSlotRegisterInstr(
           CalculateStackIndex(pair->At(1)),
           pair->At(0).reg(),
           true);
     } else {
       ASSERT(pair->At(0).IsStackSlot() && pair->At(1).IsRegister());
-      deopt_instr = new DeoptInt64StackSlotRegisterInstr(
+      deopt_instr = new(isolate()) DeoptInt64StackSlotRegisterInstr(
           CalculateStackIndex(pair->At(0)),
           pair->At(1).reg(),
           false);
@@ -1532,7 +1538,7 @@
     const intptr_t index = FindMaterialization(
         value->definition()->AsMaterializeObject());
     ASSERT(index >= 0);
-    deopt_instr = new DeoptMaterializedObjectRefInstr(index);
+    deopt_instr = new(isolate()) DeoptMaterializedObjectRefInstr(index);
   } else {
     UNREACHABLE();
   }
@@ -1544,26 +1550,26 @@
 
 void DeoptInfoBuilder::AddCallerFp(intptr_t dest_index) {
   ASSERT(dest_index == FrameSize());
-  instructions_.Add(new DeoptCallerFpInstr());
+  instructions_.Add(new(isolate()) DeoptCallerFpInstr());
 }
 
 
 void DeoptInfoBuilder::AddCallerPp(intptr_t dest_index) {
   ASSERT(dest_index == FrameSize());
-  instructions_.Add(new DeoptCallerPpInstr());
+  instructions_.Add(new(isolate()) DeoptCallerPpInstr());
 }
 
 
 void DeoptInfoBuilder::AddCallerPc(intptr_t dest_index) {
   ASSERT(dest_index == FrameSize());
-  instructions_.Add(new DeoptCallerPcInstr());
+  instructions_.Add(new(isolate()) DeoptCallerPcInstr());
 }
 
 
 void DeoptInfoBuilder::AddConstant(const Object& obj, intptr_t dest_index) {
   ASSERT(dest_index == FrameSize());
   intptr_t object_table_index = FindOrAddObjectInTable(obj);
-  instructions_.Add(new DeoptConstantInstr(object_table_index));
+  instructions_.Add(new(isolate()) DeoptConstantInstr(object_table_index));
 }
 
 
@@ -1584,7 +1590,8 @@
     }
   }
 
-  instructions_.Add(new DeoptMaterializeObjectInstr(non_null_fields));
+  instructions_.Add(
+      new(isolate()) DeoptMaterializeObjectInstr(non_null_fields));
 }
 
 
@@ -1642,7 +1649,8 @@
   // Allocate space for the translation.  If the shared suffix is longer
   // than one instruction, we replace it with a single suffix instruction.
   if (suffix_length > 1) length -= (suffix_length - 1);
-  const DeoptInfo& deopt_info = DeoptInfo::Handle(DeoptInfo::New(length));
+  const DeoptInfo& deopt_info =
+      DeoptInfo::Handle(isolate(), DeoptInfo::New(length));
 
   // Write the unshared instructions and build their sub-tree.
   TrieNode* node = NULL;
@@ -1651,14 +1659,14 @@
     DeoptInstr* instr = instructions_[i];
     deopt_info.SetAt(i, instr->kind(), instr->source_index());
     TrieNode* child = node;
-    node = new TrieNode(instr, current_info_number_);
+    node = new(isolate()) TrieNode(instr, current_info_number_);
     node->AddChild(child);
   }
 
   if (suffix_length > 1) {
     suffix->AddChild(node);
     DeoptInstr* instr =
-        new DeoptSuffixInstr(suffix->info_number(), suffix_length);
+        new(isolate()) DeoptSuffixInstr(suffix->info_number(), suffix_length);
     deopt_info.SetAt(length - 1, instr->kind(), instr->source_index());
   } else {
     trie_root_->AddChild(node);
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index 23a5e97..c287e34 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -295,7 +295,7 @@
 // the heap and reset the builder's internal state for the next DeoptInfo.
 class DeoptInfoBuilder : public ValueObject {
  public:
-  explicit DeoptInfoBuilder(const intptr_t num_args);
+  DeoptInfoBuilder(Isolate* isolate, const intptr_t num_args);
 
   // 'object_table' holds all objects referred to by DeoptInstr in
   // all DeoptInfo instances for a single Code object.
@@ -350,6 +350,10 @@
 
   void AddConstant(const Object& obj, intptr_t dest_index);
 
+  Isolate* isolate() const { return isolate_; }
+
+  Isolate* isolate_;
+
   GrowableArray<DeoptInstr*> instructions_;
   const GrowableObjectArray& object_table_;
   const intptr_t num_args_;
diff --git a/runtime/vm/disassembler_arm64.cc b/runtime/vm/disassembler_arm64.cc
index 797d4d5..04f5b6c 100644
--- a/runtime/vm/disassembler_arm64.cc
+++ b/runtime/vm/disassembler_arm64.cc
@@ -541,10 +541,18 @@
       if (format[1] == 's') {
         ASSERT(STRING_STARTS_WITH(format, "vsz"));
         char const* sz_str;
-        if (instr->Bit(22) == 0) {
-          sz_str = "f32";
+        if (instr->Bits(14, 2) == 3) {
+          switch (instr->Bit(22)) {
+            case 0: sz_str = "s"; break;
+            case 1: sz_str = "d"; break;
+            default: UNREACHABLE(); break;
+          }
         } else {
-          sz_str = "f64";
+          switch (instr->Bit(22)) {
+            case 0: sz_str = "w"; break;
+            case 1: sz_str = "x"; break;
+            default: UNREACHABLE(); break;
+          }
         }
         buffer_pos_ += OS::SNPrint(current_position_in_buffer(),
                                    remaining_size_in_buffer(),
@@ -1028,8 +1036,18 @@
   const int32_t op = instr->Bit(29);
   const int32_t imm4 = instr->Bits(11, 4);
 
-  if ((Q == 1)  && (op == 0) && (imm4 == 0)) {
+  if ((op == 0) && (imm4 == 7)) {
+    if (Q == 0) {
+      Format(instr, "vmovrs 'rd, 'vn'idx5");
+    } else {
+      Format(instr, "vmovrd 'rd, 'vn'idx5");
+    }
+  } else if ((Q == 1)  && (op == 0) && (imm4 == 0)) {
     Format(instr, "vdup'csz 'vd, 'vn'idx5");
+  } else if ((Q == 1) && (op == 0) && (imm4 == 3)) {
+    Format(instr, "vins'csz 'vd'idx5, 'rn");
+  } else if ((Q == 1) && (op == 0) && (imm4 == 1)) {
+    Format(instr, "vdup'csz 'vd, 'rn");
   } else if ((Q == 1) && (op == 1)) {
     Format(instr, "vins'csz 'vd'idx5, 'vn'idx4");
   } else {
@@ -1048,7 +1066,19 @@
     return;
   }
 
-  if ((U == 0) && (opcode == 0x1a)) {
+  if ((U == 0) && (opcode == 0x3)) {
+    if (instr->Bit(23) == 0) {
+      Format(instr, "vand 'vd, 'vn, 'vm");
+    } else {
+      Format(instr, "vorr 'vd, 'vn, 'vm");
+    }
+  } else if ((U == 1) && (opcode == 0x3)) {
+    Format(instr, "veor 'vd, 'vn, 'vm");
+  } else if ((U == 0) && (opcode == 0x10)) {
+    Format(instr, "vadd'vsz 'vd, 'vn, 'vm");
+  } else if ((U == 1) && (opcode == 0x10)) {
+    Format(instr, "vsub'vsz 'vd, 'vn, 'vm");
+  } else if ((U == 0) && (opcode == 0x1a)) {
     if (instr->Bit(23) == 0) {
       Format(instr, "vadd'vsz 'vd, 'vn, 'vm");
     } else {
@@ -1064,11 +1094,48 @@
 }
 
 
+void ARM64Decoder::DecodeSIMDTwoReg(Instr* instr) {
+  const int32_t Q = instr->Bit(30);
+  const int32_t U = instr->Bit(29);
+  const int32_t op = instr->Bits(12, 5);
+  const int32_t sz = instr->Bits(22, 2);
+
+  if (Q == 0) {
+    Unknown(instr);
+    return;
+  }
+
+  if ((U == 1) && (op == 0x5)) {
+    Format(instr, "vnot 'vd, 'vn");
+  } else if ((U == 0) && (op == 0xf)) {
+    if (sz == 2) {
+      Format(instr, "vabss 'vd, 'vn");
+    } else if (sz == 3) {
+      Format(instr, "vabsd 'vd, 'vn");
+    } else {
+      Unknown(instr);
+    }
+  } else if ((U == 1) && (op == 0xf)) {
+    if (sz == 2) {
+      Format(instr, "vnegs 'vd, 'vn");
+    } else if (sz == 3) {
+      Format(instr, "vnegd 'vd, 'vn");
+    } else {
+      Unknown(instr);
+    }
+  } else {
+    Unknown(instr);
+  }
+}
+
+
 void ARM64Decoder::DecodeDPSimd1(Instr* instr) {
   if (instr->IsSIMDCopyOp()) {
     DecodeSIMDCopy(instr);
   } else if (instr->IsSIMDThreeSameOp()) {
     DecodeSIMDThreeSame(instr);
+  } else if (instr->IsSIMDTwoRegOp()) {
+    DecodeSIMDTwoReg(instr);
   } else {
     Unknown(instr);
   }
diff --git a/runtime/vm/flags.cc b/runtime/vm/flags.cc
index fdca04e..2c3cb13 100644
--- a/runtime/vm/flags.cc
+++ b/runtime/vm/flags.cc
@@ -98,6 +98,15 @@
 }
 
 
+bool Flags::IsSet(const char* name) {
+  Flag* flag = Lookup(name);
+  return (flag != NULL) &&
+         (flag->type_ == Flag::kBoolean) &&
+         (flag->bool_ptr_ != NULL) &&
+         (*flag->bool_ptr_ == true);
+}
+
+
 bool Flags::Register_bool(bool* addr,
                           const char* name,
                           bool default_value,
diff --git a/runtime/vm/flags.h b/runtime/vm/flags.h
index f9d88f0..b4bee00 100644
--- a/runtime/vm/flags.h
+++ b/runtime/vm/flags.h
@@ -64,6 +64,8 @@
 
   static Flag* Lookup(const char* name);
 
+  static bool IsSet(const char* name);
+
   static bool Initialized() { return initialized_; }
 
  private:
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index e7f25a8e..bc4e956 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -21,7 +21,8 @@
 FlowGraph::FlowGraph(const FlowGraphBuilder& builder,
                      GraphEntryInstr* graph_entry,
                      intptr_t max_block_id)
-  : parent_(),
+  : isolate_(Isolate::Current()),
+    parent_(),
     current_ssa_temp_index_(0),
     max_block_id_(max_block_id),
     builder_(builder),
@@ -86,7 +87,7 @@
     }
   }
   // Otherwise, allocate and add it to the pool.
-  ConstantInstr* constant = new ConstantInstr(object);
+  ConstantInstr* constant = new(isolate()) ConstantInstr(object);
   constant->set_ssa_temp_index(alloc_ssa_temp_index());
   AddToInitialDefinitions(constant);
   return constant;
@@ -119,7 +120,7 @@
   }
   instr->InsertAfter(prev);
   ASSERT(instr->env() == NULL);
-  if (env != NULL) env->DeepCopyTo(instr);
+  if (env != NULL) env->DeepCopyTo(isolate(), instr);
 }
 
 
@@ -132,7 +133,7 @@
     AllocateSSAIndexes(instr->AsDefinition());
   }
   ASSERT(instr->env() == NULL);
-  if (env != NULL) env->DeepCopyTo(instr);
+  if (env != NULL) env->DeepCopyTo(isolate(), instr);
   return prev->AppendInstruction(instr);
 }
 
@@ -270,7 +271,8 @@
 LivenessAnalysis::LivenessAnalysis(
   intptr_t variable_count,
   const GrowableArray<BlockEntryInstr*>& postorder)
-    : variable_count_(variable_count),
+    : isolate_(Isolate::Current()),
+      variable_count_(variable_count),
       postorder_(postorder),
       live_out_(postorder.length()),
       kill_(postorder.length()),
@@ -326,9 +328,9 @@
 void LivenessAnalysis::Analyze() {
   const intptr_t block_count = postorder_.length();
   for (intptr_t i = 0; i < block_count; i++) {
-    live_out_.Add(new BitVector(variable_count_));
-    kill_.Add(new BitVector(variable_count_));
-    live_in_.Add(new BitVector(variable_count_));
+    live_out_.Add(new(isolate()) BitVector(variable_count_));
+    kill_.Add(new(isolate()) BitVector(variable_count_));
+    live_in_.Add(new(isolate()) BitVector(variable_count_));
   }
 
   ComputeInitialSets();
@@ -439,7 +441,7 @@
 void VariableLivenessAnalysis::ComputeInitialSets() {
   const intptr_t block_count = postorder_.length();
 
-  BitVector* last_loads = new BitVector(variable_count_);
+  BitVector* last_loads = new(isolate()) BitVector(variable_count_);
   for (intptr_t i = 0; i < block_count; i++) {
     BlockEntryInstr* block = postorder_[i];
 
@@ -563,7 +565,7 @@
     idom.Add(parent_[i]);
     semi.Add(i);
     label.Add(i);
-    dominance_frontier->Add(new BitVector(size));
+    dominance_frontier->Add(new(isolate()) BitVector(size));
   }
 
   // Loop over the blocks in reverse preorder (not including the graph
@@ -726,7 +728,7 @@
     // are unknown and so treated like parameters.
     intptr_t count = IsCompiledForOsr() ? variable_count() : parameter_count();
     for (intptr_t i = 0; i < count; ++i) {
-      ParameterInstr* param = new ParameterInstr(i, entry);
+      ParameterInstr* param = new(isolate()) ParameterInstr(i, entry);
       param->set_ssa_temp_index(alloc_ssa_temp_index());  // New SSA temp.
       AddToInitialDefinitions(param);
       env.Add(param);
@@ -754,7 +756,8 @@
 void FlowGraph::AttachEnvironment(Instruction* instr,
                                   GrowableArray<Definition*>* env) {
   Environment* deopt_env =
-      Environment::From(*env,
+      Environment::From(isolate(),
+                        *env,
                         num_non_copied_params_,
                         Code::Handle(parsed_function_.code()));
   // TODO(fschneider): Add predicates CanEagerlyDeoptimize and
@@ -764,7 +767,8 @@
   // also don't have an eager deoptimziation point, so the environment attached
   // here is only used for after the call.
   if (instr->IsClosureCall()) {
-    deopt_env = deopt_env->DeepCopy(deopt_env->Length() - instr->InputCount());
+    deopt_env = deopt_env->DeepCopy(isolate(),
+                                    deopt_env->Length() - instr->InputCount());
   }
   instr->SetEnvironment(deopt_env);
   for (Environment::DeepIterator it(deopt_env); !it.Done(); it.Advance()) {
@@ -805,7 +809,7 @@
   } else if (block_entry->IsCatchBlockEntry()) {
     // Add real definitions for all locals and parameters.
     for (intptr_t i = 0; i < env->length(); ++i) {
-      ParameterInstr* param = new ParameterInstr(i, block_entry);
+      ParameterInstr* param = new(isolate()) ParameterInstr(i, block_entry);
       param->set_ssa_temp_index(alloc_ssa_temp_index());  // New SSA temp.
       (*env)[i] = param;
       block_entry->AsCatchBlockEntry()->initial_definitions()->Add(param);
@@ -970,7 +974,7 @@
         PhiInstr* phi = (*successor->phis())[i];
         if (phi != NULL) {
           // Rename input operand.
-          Value* use = new Value((*env)[i]);
+          Value* use = new(isolate()) Value((*env)[i]);
           phi->SetInputAt(pred_index, use);
         }
       }
@@ -1026,7 +1030,7 @@
 // Design & Implementation" (Muchnick) p192.
 BitVector* FlowGraph::FindLoop(BlockEntryInstr* m, BlockEntryInstr* n) {
   GrowableArray<BlockEntryInstr*> stack;
-  BitVector* loop = new BitVector(preorder_.length());
+  BitVector* loop = new(isolate()) BitVector(preorder_.length());
 
   loop->Add(n->preorder_number());
   if (n != m) {
@@ -1050,7 +1054,7 @@
 
 ZoneGrowableArray<BlockEntryInstr*>* FlowGraph::ComputeLoops() {
   ZoneGrowableArray<BlockEntryInstr*>* loop_headers =
-      new ZoneGrowableArray<BlockEntryInstr*>();
+      new(isolate()) ZoneGrowableArray<BlockEntryInstr*>();
 
   for (BlockIterator it = postorder_iterator();
        !it.Done();
@@ -1126,7 +1130,7 @@
 
 
 void FlowGraph::ComputeBlockEffects() {
-  block_effects_ = new BlockEffects(this);
+  block_effects_ = new(isolate()) BlockEffects(this);
 }
 
 
@@ -1134,11 +1138,11 @@
     : available_at_(flow_graph->postorder().length()) {
   // We are tracking a single effect.
   ASSERT(EffectSet::kLastEffect == 1);
-
+  Isolate* isolate = flow_graph->isolate();
   const intptr_t block_count = flow_graph->postorder().length();
 
   // Set of blocks that contain side-effects.
-  BitVector* kill = new BitVector(block_count);
+  BitVector* kill = new(isolate) BitVector(block_count);
 
   // Per block available-after sets. Block A is available after the block B if
   // and only if A is either equal to B or A is available at B and B contains no
@@ -1164,7 +1168,7 @@
     }
   }
 
-  BitVector* temp = new BitVector(block_count);
+  BitVector* temp = new(isolate) BitVector(block_count);
 
   // Recompute available-at based on predecessors' available-after until the fix
   // point is reached.
@@ -1196,8 +1200,10 @@
       if ((current == NULL) || !current->Equals(*temp)) {
         // Available-at changed: update it and recompute available-after.
         if (available_at_[block_num] == NULL) {
-          current = available_at_[block_num] = new BitVector(block_count);
-          available_after[block_num] = new BitVector(block_count);
+          current = available_at_[block_num] =
+              new(isolate) BitVector(block_count);
+          available_after[block_num] =
+              new(isolate) BitVector(block_count);
           // Block is always available after itself.
           available_after[block_num]->Add(block_num);
         }
diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h
index 26116b8..9d2d42e 100644
--- a/runtime/vm/flow_graph.h
+++ b/runtime/vm/flow_graph.h
@@ -102,6 +102,8 @@
     return current_ssa_temp_index();
   }
 
+  Isolate* isolate() const { return isolate_; }
+
   intptr_t max_block_id() const { return max_block_id_; }
   void set_max_block_id(intptr_t id) { max_block_id_ = id; }
   intptr_t allocate_block_id() { return ++max_block_id_; }
@@ -174,7 +176,7 @@
   // have to keep deoptimization environment at gotos for LICM purposes.
   void CopyDeoptTarget(Instruction* to, Instruction* from) {
     if (is_licm_allowed()) {
-      to->InheritDeoptTarget(from);
+      to->InheritDeoptTarget(isolate(), from);
     }
   }
 
@@ -266,6 +268,8 @@
   // body blocks for each loop header.
   ZoneGrowableArray<BlockEntryInstr*>* ComputeLoops();
 
+  Isolate* isolate_;
+
   // DiscoverBlocks computes parent_ and assigned_vars_ which are then used
   // if/when computing SSA.
   GrowableArray<intptr_t> parent_;
@@ -350,6 +354,10 @@
   // for blocks until they stop changing.
   void ComputeLiveInAndLiveOutSets();
 
+  Isolate* isolate() const { return isolate_; }
+
+  Isolate* isolate_;
+
   const intptr_t variable_count_;
 
   const GrowableArray<BlockEntryInstr*>& postorder_;
diff --git a/runtime/vm/flow_graph_allocator.cc b/runtime/vm/flow_graph_allocator.cc
index bfc098f..de0cbed 100644
--- a/runtime/vm/flow_graph_allocator.cc
+++ b/runtime/vm/flow_graph_allocator.cc
@@ -135,7 +135,7 @@
       Instruction* current = it.Current();
 
       // Initialize location summary for instruction.
-      current->InitializeLocationSummary(true);  // Optimizing.
+      current->InitializeLocationSummary(Isolate::Current(), true);  // opt
       LocationSummary* locs = current->locs();
 
       // Handle definitions.
@@ -1913,7 +1913,7 @@
          safepoint != NULL;
          safepoint = safepoint->next()) {
       // Mark the stack slot as having an object.
-      safepoint->locs()->stack_bitmap()->Set(stack_index, true);
+      safepoint->locs()->SetStackBit(stack_index);
     }
     range = range->next_sibling();
   }
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 00c7e57..887d111 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -39,9 +39,12 @@
             "Trace type check elimination at compile time.");
 DEFINE_FLAG(bool, warn_on_javascript_compatibility, false,
             "Warn on incompatibilities between vm and dart2js.");
+
+DECLARE_FLAG(bool, enable_debugger);
 DECLARE_FLAG(bool, enable_type_checks);
-DECLARE_FLAG(bool, warning_as_error);
+DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, silent_warnings);
+DECLARE_FLAG(bool, warning_as_error);
 
 
 // TODO(srdjan): Allow compiler to add constants as they are encountered in
@@ -288,7 +291,9 @@
       // TODO(zerny): Avoid creating unnecessary environments. Note that some
       // optimizations need deoptimization info for non-deoptable instructions,
       // eg, LICM on GOTOs.
-      if (instr->env() != NULL) call_->env()->DeepCopyToOuter(instr);
+      if (instr->env() != NULL) {
+        call_->env()->DeepCopyToOuter(callee_graph->isolate(), instr);
+      }
     }
     if (instr->IsGoto()) {
       instr->AsGoto()->adjust_edge_weight(scale_factor);
@@ -345,7 +350,7 @@
     caller_graph_->set_max_block_id(join_id);
     JoinEntryInstr* join =
         new JoinEntryInstr(join_id, CatchClauseNode::kInvalidTryIndex);
-    join->InheritDeoptTargetAfter(call_);
+    join->InheritDeoptTargetAfter(isolate(), call_);
 
     // The dominator set of the join is the intersection of the dominator
     // sets of all the predecessors.  If we keep the dominator sets ordered
@@ -364,7 +369,7 @@
     for (intptr_t i = 0; i < num_exits; ++i) {
       // Add the control-flow edge.
       GotoInstr* goto_instr = new GotoInstr(join);
-      goto_instr->InheritDeoptTarget(ReturnAt(i));
+      goto_instr->InheritDeoptTarget(isolate(), ReturnAt(i));
       LastInstructionAt(i)->LinkTo(goto_instr);
       ExitBlockAt(i)->set_last_instruction(LastInstructionAt(i)->next());
       join->predecessors_.Add(ExitBlockAt(i));
@@ -449,7 +454,7 @@
     TargetEntryInstr* false_block =
         new TargetEntryInstr(caller_graph_->allocate_block_id(),
                              call_block->try_index());
-    false_block->InheritDeoptTargetAfter(call_);
+    false_block->InheritDeoptTargetAfter(isolate(), call_);
     false_block->LinkTo(call_->next());
     call_block->ReplaceAsPredecessorWith(false_block);
 
@@ -460,7 +465,7 @@
                                                new Value(true_const),
                                                new Value(true_const),
                                                false));  // No number check.
-    branch->InheritDeoptTarget(call_);
+    branch->InheritDeoptTarget(isolate(), call_);
     *branch->true_successor_address() = callee_entry;
     *branch->false_successor_address() = false_block;
 
@@ -999,7 +1004,7 @@
   // statements for which there is no associated source position.
   const Function& function = owner()->parsed_function()->function();
   if ((node->token_pos() != Scanner::kNoSourcePos) &&
-      !function.is_native()) {
+      !function.is_native() && FLAG_enable_debugger) {
     AddInstruction(new DebugStepCheckInstr(node->token_pos(),
                                            PcDescriptors::kReturn));
   }
@@ -2194,7 +2199,7 @@
           for_value.value()->BindsToConstant()
               ? kNoStoreBarrier
               : kEmitStoreBarrier;
-      intptr_t index_scale = FlowGraphCompiler::ElementSizeFor(class_id);
+      const intptr_t index_scale = Instance::ElementSizeFor(class_id);
       StoreIndexedInstr* store = new StoreIndexedInstr(
           array, index, for_value.value(), emit_store_barrier,
           index_scale, class_id, deopt_id, node->token_pos());
@@ -3108,8 +3113,10 @@
   // call.
   if (node->value()->IsLiteralNode() ||
       node->value()->IsLoadLocalNode()) {
-    AddInstruction(new DebugStepCheckInstr(node->token_pos(),
-                                           PcDescriptors::kRuntimeCall));
+    if (FLAG_enable_debugger) {
+      AddInstruction(new DebugStepCheckInstr(node->token_pos(),
+                                             PcDescriptors::kRuntimeCall));
+    }
   }
 
   ValueGraphVisitor for_value(owner());
@@ -3519,12 +3526,15 @@
       !function.is_native()) {
     // Always allocate CheckOverflowInstr so that deopt-ids match regardless
     // if we inline or not.
-    CheckStackOverflowInstr* check =
-        new CheckStackOverflowInstr(function.token_pos(), 0);
-    // If we are inlining don't actually attach the stack check. We must still
-    // create the stack check in order to allocate a deopt id.
-    if (!owner()->IsInlining()) {
-      AddInstruction(check);
+    if (!function.IsImplicitGetterFunction() &&
+        !function.IsImplicitSetterFunction()) {
+      CheckStackOverflowInstr* check =
+          new CheckStackOverflowInstr(function.token_pos(), 0);
+      // If we are inlining don't actually attach the stack check. We must still
+      // create the stack check in order to allocate a deopt id.
+      if (!owner()->IsInlining()) {
+        AddInstruction(check);
+      }
     }
   }
 
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 8f62c7d..938a30a 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -9,6 +9,7 @@
 #include "platform/globals.h"
 #include "vm/allocation.h"
 #include "vm/ast.h"
+#include "vm/flow_graph.h"
 #include "vm/growable_array.h"
 #include "vm/intermediate_language.h"
 #include "vm/raw_object.h"
@@ -19,7 +20,6 @@
 class Array;
 class Class;
 class Field;
-class FlowGraph;
 class LocalVariable;
 class ParsedFunction;
 class String;
@@ -129,6 +129,8 @@
   Definition* JoinReturns(BlockEntryInstr** exit_block,
                           Instruction** last_instruction);
 
+  Isolate* isolate() const { return caller_graph_->isolate(); }
+
   FlowGraph* caller_graph_;
   Definition* call_;
   GrowableArray<Data> exits_;
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 7da1818..a1762f3 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -30,7 +30,6 @@
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, intrinsify);
 DECLARE_FLAG(bool, propagate_ic_data);
-DECLARE_FLAG(bool, report_usage_count);
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, use_cha);
 DECLARE_FLAG(bool, use_osr);
@@ -83,7 +82,8 @@
 FlowGraphCompiler::FlowGraphCompiler(Assembler* assembler,
                                      FlowGraph* flow_graph,
                                      bool is_optimizing)
-    : assembler_(assembler),
+    : isolate_(Isolate::Current()),
+      assembler_(assembler),
       parsed_function_(flow_graph->parsed_function()),
       flow_graph_(*flow_graph),
       block_order_(*flow_graph->CodegenBlockOrder(is_optimizing)),
@@ -99,13 +99,13 @@
       is_optimizing_(is_optimizing),
       may_reoptimize_(false),
       double_class_(Class::ZoneHandle(
-          Isolate::Current()->object_store()->double_class())),
+          isolate_->object_store()->double_class())),
       float32x4_class_(Class::ZoneHandle(
-          Isolate::Current()->object_store()->float32x4_class())),
+          isolate_->object_store()->float32x4_class())),
       float64x2_class_(Class::ZoneHandle(
-          Isolate::Current()->object_store()->float64x2_class())),
+          isolate_->object_store()->float64x2_class())),
       int32x4_class_(Class::ZoneHandle(
-          Isolate::Current()->object_store()->int32x4_class())),
+          isolate_->object_store()->int32x4_class())),
       list_class_(Class::ZoneHandle(
           Library::Handle(Library::CoreLibrary()).
               LookupClass(Symbols::List()))),
@@ -168,8 +168,7 @@
 
 
 bool FlowGraphCompiler::CanOptimize() {
-  return !FLAG_report_usage_count &&
-         (FLAG_optimization_counter_threshold >= 0);
+  return FLAG_optimization_counter_threshold >= 0;
 }
 
 
@@ -351,7 +350,7 @@
                                   "FlowGraphCompiler Bailout: %s %s",
                                   String::Handle(function.name()).ToCString(),
                                   reason));
-  Isolate::Current()->long_jump_base()->Jump(1, error);
+  isolate()->long_jump_base()->Jump(1, error);
   UNREACHABLE();
 }
 
@@ -395,7 +394,7 @@
     move_instr->AddMove(dest, src);
     // Update safepoint bitmap to indicate that the target location
     // now contains a pointer.
-    instr->locs()->stack_bitmap()->Set(dest_index, true);
+    instr->locs()->SetStackBit(dest_index);
   }
   parallel_move_resolver()->EmitNativeCode(move_instr);
 }
@@ -593,7 +592,7 @@
     return NULL;
   }
 
-  Environment* env = instruction->env()->DeepCopy();
+  Environment* env = instruction->env()->DeepCopy(isolate());
   // 1. Iterate the registers in the order they will be spilled to compute
   //    the slots they will be spilled to.
   intptr_t next_slot = StackSize();
@@ -718,7 +717,7 @@
   const Function& function = parsed_function().function();
   const intptr_t incoming_arg_count =
       function.HasOptionalParameters() ? 0 : function.num_fixed_parameters();
-  DeoptInfoBuilder builder(incoming_arg_count);
+  DeoptInfoBuilder builder(isolate(), incoming_arg_count);
 
   const Array& array =
       Array::Handle(Array::New(DeoptTable::SizeFor(deopt_infos_.length()),
@@ -771,7 +770,6 @@
 // Returns 'true' if code generation for this function is complete, i.e.,
 // no fall-through to regular code is needed.
 void FlowGraphCompiler::TryIntrinsify() {
-  if (!CanOptimizeFunction()) return;
   // Intrinsification skips arguments checks, therefore disable if in checked
   // mode.
   if (FLAG_intrinsify && !FLAG_enable_type_checks) {
@@ -976,7 +974,7 @@
 void FlowGraphCompiler::AllocateRegistersLocally(Instruction* instr) {
   ASSERT(!is_optimizing());
 
-  instr->InitializeLocationSummary(false);  // Not optimizing.
+  instr->InitializeLocationSummary(isolate(), false);  // Not optimizing.
   LocationSummary* locs = instr->locs();
 
   bool blocked_registers[kNumberOfCpuRegisters];
@@ -1291,50 +1289,6 @@
 }
 
 
-intptr_t FlowGraphCompiler::ElementSizeFor(intptr_t cid) {
-  if (RawObject::IsExternalTypedDataClassId(cid)) {
-    return ExternalTypedData::ElementSizeInBytes(cid);
-  } else if (RawObject::IsTypedDataClassId(cid)) {
-    return TypedData::ElementSizeInBytes(cid);
-  }
-  switch (cid) {
-    case kArrayCid:
-    case kImmutableArrayCid:
-      return Array::kBytesPerElement;
-    case kOneByteStringCid:
-      return OneByteString::kBytesPerElement;
-    case kTwoByteStringCid:
-      return TwoByteString::kBytesPerElement;
-    default:
-      UNIMPLEMENTED();
-      return 0;
-  }
-}
-
-
-intptr_t FlowGraphCompiler::DataOffsetFor(intptr_t cid) {
-  if (RawObject::IsExternalTypedDataClassId(cid)) {
-    // Elements start at offset 0 of the external data.
-    return 0;
-  }
-  if (RawObject::IsTypedDataClassId(cid)) {
-    return TypedData::data_offset();
-  }
-  switch (cid) {
-    case kArrayCid:
-    case kImmutableArrayCid:
-      return Array::data_offset();
-    case kOneByteStringCid:
-      return OneByteString::data_offset();
-    case kTwoByteStringCid:
-      return TwoByteString::data_offset();
-    default:
-      UNIMPLEMENTED();
-      return Array::data_offset();
-  }
-}
-
-
 static int HighestCountFirst(const CidTarget* a, const CidTarget* b) {
   // Negative if 'a' should sort before 'b'.
   return b->count - a->count;
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index e2f30da..6950ce3 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -447,24 +447,6 @@
 
   bool may_reoptimize() const { return may_reoptimize_; }
 
-  // Array/list element address computations.
-  static intptr_t DataOffsetFor(intptr_t cid);
-  static intptr_t ElementSizeFor(intptr_t cid);
-  Address ElementAddressForIntIndex(intptr_t cid,
-                                    intptr_t index_scale,
-                                    Register array,
-                                    intptr_t offset);
-  Address ElementAddressForRegIndex(intptr_t cid,
-                                    intptr_t index_scale,
-                                    Register array,
-                                    Register index);
-  Address ExternalElementAddressForIntIndex(intptr_t index_scale,
-                                            Register array,
-                                            intptr_t offset);
-  Address ExternalElementAddressForRegIndex(intptr_t index_scale,
-                                            Register array,
-                                            Register index);
-
   // Returns 'sorted' array in decreasing count order.
   static void SortICDataByCount(const ICData& ic_data,
                                 GrowableArray<CidTarget>* sorted);
@@ -472,6 +454,8 @@
  private:
   friend class CheckStackOverflowSlowPath;  // For pending_deoptimization_env_.
 
+  Isolate* isolate() const { return isolate_; }
+
   void EmitFrameEntry();
 
   void AddStaticCallTarget(const Function& function);
@@ -574,7 +558,8 @@
 
   void EmitSourceLine(Instruction* instr);
 
-  class Assembler* assembler_;
+  Isolate* isolate_;
+  Assembler* assembler_;
   const ParsedFunction& parsed_function_;
   const FlowGraph& flow_graph_;
   const GrowableArray<BlockEntryInstr*>& block_order_;
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 17253e2..01f5859 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -1447,7 +1447,10 @@
   }
 
   // Store general purpose registers with the highest register number at the
-  // lowest address.
+  // lowest address. The order in which the registers are pushed must match the
+  // order in which the registers are encoded in the safe point's stack map.
+  // NOTE: Using ARM's multi-register push, pushes the registers in the wrong
+  // order.
   for (intptr_t reg_idx = 0; reg_idx < kNumberOfCpuRegisters; ++reg_idx) {
     Register reg = static_cast<Register>(reg_idx);
     if (locs->live_registers()->ContainsRegister(reg)) {
@@ -1459,7 +1462,8 @@
 
 void FlowGraphCompiler::RestoreLiveRegisters(LocationSummary* locs) {
   // General purpose registers have the highest register number at the
-  // lowest address.
+  // lowest address. The order in which the registers are popped must match the
+  // order in which the registers are pushed in SaveLiveRegisters.
   for (intptr_t reg_idx = kNumberOfCpuRegisters - 1; reg_idx >= 0; --reg_idx) {
     Register reg = static_cast<Register>(reg_idx);
     if (locs->live_registers()->ContainsRegister(reg)) {
@@ -1511,11 +1515,11 @@
   for (intptr_t i = 0; i < len; i++) {
     const bool is_last_check = (i == (len - 1));
     Label next_test;
-    assembler()->CompareImmediate(class_id_reg, sorted[i].cid);
+    __ CompareImmediate(class_id_reg, sorted[i].cid);
     if (is_last_check) {
-      assembler()->b(deopt, NE);
+      __ b(deopt, NE);
     } else {
-      assembler()->b(&next_test, NE);
+      __ b(&next_test, NE);
     }
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
@@ -1528,47 +1532,11 @@
     AddStaticCallTarget(function);
     __ Drop(argument_count);
     if (!is_last_check) {
-      assembler()->b(&match_found);
+      __ b(&match_found);
     }
-    assembler()->Bind(&next_test);
+    __ Bind(&next_test);
   }
-  assembler()->Bind(&match_found);
-}
-
-
-Address FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
-                                                     intptr_t index_scale,
-                                                     Register array,
-                                                     intptr_t index) {
-  UNREACHABLE();
-  return FieldAddress(array, index);
-}
-
-
-Address FlowGraphCompiler::ElementAddressForRegIndex(intptr_t cid,
-                                                     intptr_t index_scale,
-                                                     Register array,
-                                                     Register index) {
-  UNREACHABLE();
-  return FieldAddress(array, index);
-}
-
-
-Address FlowGraphCompiler::ExternalElementAddressForIntIndex(
-    intptr_t index_scale,
-    Register array,
-    intptr_t index) {
-  UNREACHABLE();
-  return FieldAddress(array, index);
-}
-
-
-Address FlowGraphCompiler::ExternalElementAddressForRegIndex(
-    intptr_t index_scale,
-    Register array,
-    Register index) {
-  UNREACHABLE();
-  return FieldAddress(array, index);
+  __ Bind(&match_found);
 }
 
 
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index 61b97b9..c445bb5 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -1440,8 +1440,7 @@
                   reg_idx >= 0; --reg_idx) {
       VRegister fpu_reg = static_cast<VRegister>(reg_idx);
       if (locs->live_registers()->ContainsFpuRegister(fpu_reg)) {
-        // TODO(zra): Save the whole V register.
-        __ PushDouble(fpu_reg);
+        __ PushQuad(fpu_reg);
       }
     }
   }
@@ -1473,8 +1472,7 @@
     for (intptr_t reg_idx = 0; reg_idx < kNumberOfVRegisters; ++reg_idx) {
       VRegister fpu_reg = static_cast<VRegister>(reg_idx);
       if (locs->live_registers()->ContainsFpuRegister(fpu_reg)) {
-        // TODO(zra): Restore the whole V register.
-        __ PopDouble(fpu_reg);
+        __ PopQuad(fpu_reg);
       }
     }
   }
@@ -1529,42 +1527,6 @@
 }
 
 
-Address FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
-                                                     intptr_t index_scale,
-                                                     Register array,
-                                                     intptr_t index) {
-  UNREACHABLE();
-  return FieldAddress(array, index);
-}
-
-
-Address FlowGraphCompiler::ElementAddressForRegIndex(intptr_t cid,
-                                                     intptr_t index_scale,
-                                                     Register array,
-                                                     Register index) {
-  UNREACHABLE();
-  return FieldAddress(array, index);
-}
-
-
-Address FlowGraphCompiler::ExternalElementAddressForIntIndex(
-    intptr_t index_scale,
-    Register array,
-    intptr_t index) {
-  UNREACHABLE();
-  return FieldAddress(array, index);
-}
-
-
-Address FlowGraphCompiler::ExternalElementAddressForRegIndex(
-    intptr_t index_scale,
-    Register array,
-    Register index) {
-  UNREACHABLE();
-  return FieldAddress(array, index);
-}
-
-
 #undef __
 #define __ compiler_->assembler()->
 
@@ -1595,7 +1557,7 @@
     }
   } else if (source.IsFpuRegister()) {
     if (destination.IsFpuRegister()) {
-      __ fmovdd(destination.fpu_reg(), source.fpu_reg());
+      __ vmov(destination.fpu_reg(), source.fpu_reg());
     } else {
       if (destination.IsDoubleStackSlot()) {
         const intptr_t dest_offset = destination.ToStackSlotOffset();
@@ -1603,7 +1565,8 @@
         __ StoreDToOffset(src, FP, dest_offset, PP);
       } else {
         ASSERT(destination.IsQuadStackSlot());
-        UNIMPLEMENTED();
+        const intptr_t dest_offset = destination.ToStackSlotOffset();
+        __ StoreQToOffset(source.fpu_reg(), FP, dest_offset, PP);
       }
     }
   } else if (source.IsDoubleStackSlot()) {
@@ -1619,7 +1582,16 @@
       __ StoreDToOffset(VTMP, FP, dest_offset, PP);
     }
   } else if (source.IsQuadStackSlot()) {
-    UNIMPLEMENTED();
+    if (destination.IsFpuRegister()) {
+      const intptr_t dest_offset = source.ToStackSlotOffset();
+      __ LoadQFromOffset(destination.fpu_reg(), FP, dest_offset, PP);
+    } else {
+      ASSERT(destination.IsQuadStackSlot());
+      const intptr_t source_offset = source.ToStackSlotOffset();
+      const intptr_t dest_offset = destination.ToStackSlotOffset();
+      __ LoadQFromOffset(VTMP, FP, source_offset, PP);
+      __ StoreQToOffset(VTMP, FP, dest_offset, PP);
+    }
   } else {
     ASSERT(source.IsConstant());
     const Object& constant = source.constant();
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 01d002b..aa247a6 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -1539,62 +1539,6 @@
 }
 
 
-Address FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
-                                                     intptr_t index_scale,
-                                                     Register array,
-                                                     intptr_t index) {
-  const int64_t disp =
-      static_cast<int64_t>(index) * index_scale + DataOffsetFor(cid);
-  ASSERT(Utils::IsInt(32, disp));
-  return FieldAddress(array, static_cast<int32_t>(disp));
-}
-
-
-static ScaleFactor ToScaleFactor(intptr_t index_scale) {
-  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays with
-  // index scale factor > 1. E.g., for Uint8Array and OneByteString the index is
-  // expected to be untagged before accessing.
-  ASSERT(kSmiTagShift == 1);
-  switch (index_scale) {
-    case 1: return TIMES_1;
-    case 2: return TIMES_1;
-    case 4: return TIMES_2;
-    case 8: return TIMES_4;
-    case 16: return TIMES_8;
-    default:
-      UNREACHABLE();
-      return TIMES_1;
-  }
-}
-
-
-Address FlowGraphCompiler::ElementAddressForRegIndex(intptr_t cid,
-                                                     intptr_t index_scale,
-                                                     Register array,
-                                                     Register index) {
-  return FieldAddress(array,
-                      index,
-                      ToScaleFactor(index_scale),
-                      DataOffsetFor(cid));
-}
-
-
-Address FlowGraphCompiler::ExternalElementAddressForIntIndex(
-    intptr_t index_scale,
-    Register array,
-    intptr_t index) {
-  return Address(array, index * index_scale);
-}
-
-
-Address FlowGraphCompiler::ExternalElementAddressForRegIndex(
-    intptr_t index_scale,
-    Register array,
-    Register index) {
-  return Address(array, index, ToScaleFactor(index_scale), 0);
-}
-
-
 #undef __
 #define __ compiler_->assembler()->
 
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index 20e8c29..a7e571c 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -1597,42 +1597,6 @@
 }
 
 
-Address FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
-                                                     intptr_t index_scale,
-                                                     Register array,
-                                                     intptr_t index) {
-  UNREACHABLE();
-  return FieldAddress(array, index);
-}
-
-
-Address FlowGraphCompiler::ElementAddressForRegIndex(intptr_t cid,
-                                                     intptr_t index_scale,
-                                                     Register array,
-                                                     Register index) {
-  UNREACHABLE();
-  return FieldAddress(array, index);
-}
-
-
-Address FlowGraphCompiler::ExternalElementAddressForIntIndex(
-    intptr_t index_scale,
-    Register array,
-    intptr_t index) {
-  UNREACHABLE();
-  return FieldAddress(array, index);
-}
-
-
-Address FlowGraphCompiler::ExternalElementAddressForRegIndex(
-    intptr_t index_scale,
-    Register array,
-    Register index) {
-  UNREACHABLE();
-  return FieldAddress(array, index);
-}
-
-
 #undef __
 #define __ compiler_->assembler()->
 
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 24f3693..d6175ce 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -1550,11 +1550,11 @@
   for (intptr_t i = 0; i < len; i++) {
     const bool is_last_check = (i == (len - 1));
     Label next_test;
-    assembler()->cmpl(class_id_reg, Immediate(sorted[i].cid));
+    __ cmpl(class_id_reg, Immediate(sorted[i].cid));
     if (is_last_check) {
-      assembler()->j(NOT_EQUAL, deopt);
+      __ j(NOT_EQUAL, deopt);
     } else {
-      assembler()->j(NOT_EQUAL, &next_test);
+      __ j(NOT_EQUAL, &next_test);
     }
     // Do not use the code from the function, but let the code be patched so
     // that we can record the outgoing edges to other code.
@@ -1567,67 +1567,11 @@
     AddStaticCallTarget(function);
     __ Drop(argument_count);
     if (!is_last_check) {
-      assembler()->jmp(&match_found);
+      __ jmp(&match_found);
     }
-    assembler()->Bind(&next_test);
+    __ Bind(&next_test);
   }
-  assembler()->Bind(&match_found);
-}
-
-
-Address FlowGraphCompiler::ElementAddressForIntIndex(intptr_t cid,
-                                                     intptr_t index_scale,
-                                                     Register array,
-                                                     intptr_t index) {
-  const int64_t disp =
-      static_cast<int64_t>(index) * index_scale + DataOffsetFor(cid);
-  ASSERT(Utils::IsInt(32, disp));
-  return FieldAddress(array, static_cast<int32_t>(disp));
-}
-
-
-static ScaleFactor ToScaleFactor(intptr_t index_scale) {
-  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays with
-  // index scale factor > 1. E.g., for Uint8Array and OneByteString the index is
-  // expected to be untagged before accessing.
-  ASSERT(kSmiTagShift == 1);
-  switch (index_scale) {
-    case 1: return TIMES_1;
-    case 2: return TIMES_1;
-    case 4: return TIMES_2;
-    case 8: return TIMES_4;
-    case 16: return TIMES_8;
-    default:
-      UNREACHABLE();
-      return TIMES_1;
-  }
-}
-
-
-Address FlowGraphCompiler::ElementAddressForRegIndex(intptr_t cid,
-                                                     intptr_t index_scale,
-                                                     Register array,
-                                                     Register index) {
-  return FieldAddress(array,
-                      index,
-                      ToScaleFactor(index_scale),
-                      DataOffsetFor(cid));
-}
-
-
-Address FlowGraphCompiler::ExternalElementAddressForIntIndex(
-    intptr_t index_scale,
-    Register array,
-    intptr_t index) {
-  return Address(array, index * index_scale);
-}
-
-
-Address FlowGraphCompiler::ExternalElementAddressForRegIndex(
-    intptr_t index_scale,
-    Register array,
-    Register index) {
-  return Address(array, index, ToScaleFactor(index_scale), 0);
+  __ Bind(&match_found);
 }
 
 
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 96d5d22..fbc5327 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -28,7 +28,7 @@
 // Flags for inlining heuristics.
 DEFINE_FLAG(int, inline_getters_setters_smaller_than, 10,
     "Always inline getters and setters that have fewer instructions");
-DEFINE_FLAG(int, inlining_depth_threshold, 3,
+DEFINE_FLAG(int, inlining_depth_threshold, 5,
     "Inline function calls up to threshold nesting depth");
 DEFINE_FLAG(int, inlining_size_threshold, 25,
     "Always inline functions that have threshold or fewer instructions");
@@ -49,13 +49,16 @@
     "default 10%: calls above-equal 10% of max-count are inlined.");
 DEFINE_FLAG(bool, inline_recursive, true,
     "Inline recursive calls.");
+DEFINE_FLAG(int, max_inlined_per_depth, 500,
+    "Max. number of inlined calls per depth");
 DEFINE_FLAG(bool, print_inlining_tree, false, "Print inlining tree");
 
+DECLARE_FLAG(bool, compiler_stats);
+DECLARE_FLAG(bool, enable_type_checks);
+DECLARE_FLAG(int, deoptimization_counter_threshold);
 DECLARE_FLAG(bool, print_flow_graph);
 DECLARE_FLAG(bool, print_flow_graph_optimized);
-DECLARE_FLAG(int, deoptimization_counter_threshold);
 DECLARE_FLAG(bool, verify_compiler);
-DECLARE_FLAG(bool, compiler_stats);
 
 #define TRACE_INLINING(statement)                                              \
   do {                                                                         \
@@ -84,19 +87,6 @@
 }
 
 
-// Helper to create a parameter stub from an actual argument.
-static Definition* CreateParameterStub(intptr_t i,
-                                       Value* argument,
-                                       FlowGraph* graph) {
-  ConstantInstr* constant = argument->definition()->AsConstant();
-  if (constant != NULL) {
-    return new ConstantInstr(constant->value());
-  } else {
-    return new ParameterInstr(i, graph->graph_entry());
-  }
-}
-
-
 // Helper to get the default value of a formal parameter.
 static ConstantInstr* GetDefaultValue(intptr_t i,
                                       const ParsedFunction& parsed_function) {
@@ -239,6 +229,12 @@
              instance_calls_.is_empty());
   }
 
+  intptr_t NumCalls() const {
+    return instance_calls_.length() +
+           static_calls_.length() +
+           closure_calls_.length();
+  }
+
   void Clear() {
     static_calls_.Clear();
     closure_calls_.Clear();
@@ -437,6 +433,8 @@
 
   TargetEntryInstr* BuildDecisionGraph();
 
+  Isolate* isolate() const;
+
   CallSiteInliner* const owner_;
   PolymorphicInstanceCallInstr* const call_;
   const intptr_t num_variants_;
@@ -466,6 +464,8 @@
 
   FlowGraph* caller_graph() const { return caller_graph_; }
 
+  Isolate* isolate() const { return caller_graph_->isolate(); }
+
   // Inlining heuristics based on Cooper et al. 2008.
   bool ShouldWeInline(const Function& callee,
                       intptr_t instr_count,
@@ -515,6 +515,13 @@
     while (collected_call_sites_->HasCalls()) {
       TRACE_INLINING(OS::Print("  Depth %" Pd " ----------\n",
                                inlining_depth_));
+      if (collected_call_sites_->NumCalls() > FLAG_max_inlined_per_depth) {
+        break;
+      }
+      if (FLAG_print_inlining_tree) {
+        OS::Print("**Depth % " Pd " calls to inline %" Pd "\n",
+            inlining_depth_, collected_call_sites_->NumCalls());
+      }
       // Swap collected and inlining arrays and clear the new collecting array.
       call_sites_temp = collected_call_sites_;
       collected_call_sites_ = inlining_call_sites_;
@@ -538,6 +545,18 @@
         static_cast<double>(initial_size_);
   }
 
+  // Helper to create a parameter stub from an actual argument.
+  Definition* CreateParameterStub(intptr_t i,
+                                  Value* argument,
+                                  FlowGraph* graph) {
+    ConstantInstr* constant = argument->definition()->AsConstant();
+    if (constant != NULL) {
+      return new(isolate()) ConstantInstr(constant->value());
+    } else {
+      return new(isolate()) ParameterInstr(i, graph->graph_entry());
+    }
+  }
+
   bool TryInlining(const Function& function,
                    const Array& argument_names,
                    InlinedCallData* call_data) {
@@ -603,10 +622,9 @@
       return false;
     }
 
-    Isolate* isolate = Isolate::Current();
     // Save and clear deopt id.
-    const intptr_t prev_deopt_id = isolate->deopt_id();
-    isolate->set_deopt_id(0);
+    const intptr_t prev_deopt_id = isolate()->deopt_id();
+    isolate()->set_deopt_id(0);
     // Install bailout jump.
     LongJumpScope jump;
     if (setjmp(*jump.Set()) == 0) {
@@ -616,7 +634,7 @@
       {
         TimerScope timer(FLAG_compiler_stats,
                          &CompilerStats::graphinliner_parse_timer,
-                         isolate);
+                         isolate());
         parsed_function = GetParsedFunction(function, &in_cache);
       }
 
@@ -630,7 +648,7 @@
 
       // Build the callee graph.
       InlineExitCollector* exit_collector =
-          new InlineExitCollector(caller_graph_, call);
+          new(isolate()) InlineExitCollector(caller_graph_, call);
       FlowGraphBuilder builder(parsed_function,
                                ic_data_array,
                                exit_collector,
@@ -641,7 +659,7 @@
       {
         TimerScope timer(FLAG_compiler_stats,
                          &CompilerStats::graphinliner_build_timer,
-                         isolate);
+                         isolate());
         callee_graph = builder.BuildGraph();
       }
 
@@ -650,7 +668,8 @@
       // without linking between the caller and callee graphs.
       // TODO(zerny): Put more information in the stubs, eg, type information.
       ZoneGrowableArray<Definition*>* param_stubs =
-          new ZoneGrowableArray<Definition*>(function.NumParameters());
+          new(isolate()) ZoneGrowableArray<Definition*>(
+              function.NumParameters());
 
       // Create a parameter stub for each fixed positional parameter.
       for (intptr_t i = 0; i < function.num_fixed_parameters(); ++i) {
@@ -685,7 +704,7 @@
       {
         TimerScope timer(FLAG_compiler_stats,
                          &CompilerStats::graphinliner_ssa_timer,
-                         isolate);
+                         isolate());
         // Compute SSA on the callee graph, catching bailouts.
         callee_graph->ComputeSSA(caller_graph_->max_virtual_register_number(),
                                  param_stubs);
@@ -695,7 +714,7 @@
       {
         TimerScope timer(FLAG_compiler_stats,
                          &CompilerStats::graphinliner_opt_timer,
-                         isolate);
+                         isolate());
         // TODO(zerny): Do more optimization passes on the callee graph.
         FlowGraphOptimizer optimizer(callee_graph);
         optimizer.ApplyICData();
@@ -737,7 +756,7 @@
             (size > FLAG_inlining_constant_arguments_size_threshold)) {
           function.set_is_inlinable(false);
         }
-        isolate->set_deopt_id(prev_deopt_id);
+        isolate()->set_deopt_id(prev_deopt_id);
         TRACE_INLINING(OS::Print("     Bailout: heuristics with "
                                  "code size:  %" Pd ", "
                                  "call sites: %" Pd ", "
@@ -771,7 +790,7 @@
       // Build succeeded so we restore the bailout jump.
       inlined_ = true;
       inlined_size_ += size;
-      isolate->set_deopt_id(prev_deopt_id);
+      isolate()->set_deopt_id(prev_deopt_id);
 
       call_data->callee_graph = callee_graph;
       call_data->parameter_stubs = param_stubs;
@@ -793,9 +812,9 @@
       return true;
     } else {
       Error& error = Error::Handle();
-      error = isolate->object_store()->sticky_error();
-      isolate->object_store()->clear_sticky_error();
-      isolate->set_deopt_id(prev_deopt_id);
+      error = isolate()->object_store()->sticky_error();
+      isolate()->object_store()->clear_sticky_error();
+      isolate()->set_deopt_id(prev_deopt_id);
       TRACE_INLINING(OS::Print("     Bailout: %s\n", error.ToErrorCString()));
       PRINT_INLINING_TREE("Bailout",
           &call_data->caller, &function, call);
@@ -933,7 +952,7 @@
       }
     }
     *in_cache = false;
-    ParsedFunction* parsed_function = new ParsedFunction(function);
+    ParsedFunction* parsed_function = new(isolate()) ParsedFunction(function);
     Parser::ParseFunction(parsed_function);
     parsed_function->AllocateVariables();
     return parsed_function;
@@ -1001,8 +1020,6 @@
       }
       if (target.IsNull()) {
         TRACE_INLINING(OS::Print("     Bailout: non-closure operator\n"));
-        PRINT_INLINING_TREE("Non-closure operator",
-            call_info[call_idx].caller, &target, call);
         continue;
       }
       GrowableArray<Value*> arguments(call->ArgumentCount());
@@ -1089,7 +1106,7 @@
             Object::ZoneHandle(
                 parsed_function.default_parameter_values().At(
                     i - fixed_param_count));
-        ConstantInstr* constant = new ConstantInstr(object);
+        ConstantInstr* constant = new(isolate()) ConstantInstr(object);
         arguments->Add(NULL);
         param_stubs->Add(constant);
       }
@@ -1174,11 +1191,17 @@
       inlined_variants_(num_variants_),
       non_inlined_variants_(num_variants_),
       inlined_entries_(num_variants_),
-      exit_collector_(new InlineExitCollector(owner->caller_graph(), call)),
+      exit_collector_(new(isolate())
+          InlineExitCollector(owner->caller_graph(), call)),
       caller_function_(caller_function) {
 }
 
 
+Isolate* PolymorphicInliner::isolate() const {
+  return owner_->caller_graph()->isolate();
+}
+
+
 // Inlined bodies are shared if two different class ids have the same
 // inlined target.  This sharing is represented by using three different
 // types of entries in the inlined_entries_ array:
@@ -1206,7 +1229,8 @@
         // the graph anymore. A new target be created instead.
         inlined_entries_[i]->AsGraphEntry()->UnuseAllInputs();
 
-        JoinEntryInstr* new_join = BranchSimplifier::ToJoinEntry(old_target);
+        JoinEntryInstr* new_join =
+            BranchSimplifier::ToJoinEntry(isolate(), old_target);
         old_target->ReplaceAsPredecessorWith(new_join);
         for (intptr_t j = 0; j < old_target->dominated_blocks().length(); ++j) {
           BlockEntryInstr* block = old_target->dominated_blocks()[j];
@@ -1216,9 +1240,9 @@
         TargetEntryInstr* new_target =
             new TargetEntryInstr(owner_->caller_graph()->allocate_block_id(),
                                  old_target->try_index());
-        new_target->InheritDeoptTarget(new_join);
-        GotoInstr* new_goto = new GotoInstr(new_join);
-        new_goto->InheritDeoptTarget(new_join);
+        new_target->InheritDeoptTarget(isolate(), new_join);
+        GotoInstr* new_goto = new(isolate()) GotoInstr(new_join);
+        new_goto->InheritDeoptTarget(isolate(), new_join);
         new_target->LinkTo(new_goto);
         new_target->set_last_instruction(new_goto);
         new_join->predecessors_.Add(new_target);
@@ -1282,7 +1306,8 @@
   // hoisted above the inlined entry.
   ASSERT(arguments.length() > 0);
   Value* actual = arguments[0];
-  RedefinitionInstr* redefinition = new RedefinitionInstr(actual->Copy());
+  RedefinitionInstr* redefinition = new(isolate())
+      RedefinitionInstr(actual->Copy(isolate()));
   redefinition->set_ssa_temp_index(
       owner_->caller_graph()->alloc_ssa_temp_index());
   redefinition->InsertAfter(callee_graph->graph_entry()->normal_entry());
@@ -1330,7 +1355,7 @@
   GrowableArray<Definition*> arguments(call_->ArgumentCount());
   Definition* receiver = call_->ArgumentAt(0);
     RedefinitionInstr* redefinition =
-        new RedefinitionInstr(new Value(receiver));
+        new(isolate()) RedefinitionInstr(new(isolate()) Value(receiver));
     redefinition->set_ssa_temp_index(
         owner_->caller_graph()->alloc_ssa_temp_index());
   if (optimizer.TryInlineRecognizedMethod(receiver_cid,
@@ -1343,11 +1368,11 @@
     // Create a graph fragment.
     redefinition->InsertAfter(entry);
     InlineExitCollector* exit_collector =
-        new InlineExitCollector(owner_->caller_graph(), call_);
+        new(isolate()) InlineExitCollector(owner_->caller_graph(), call_);
 
     ReturnInstr* result =
-        new ReturnInstr(call_->instance_call()->token_pos(),
-                        new Value(last));
+        new(isolate()) ReturnInstr(call_->instance_call()->token_pos(),
+            new(isolate()) Value(last));
     owner_->caller_graph()->AppendTo(
         last,
         result,
@@ -1356,9 +1381,9 @@
     entry->set_last_instruction(result);
     exit_collector->AddExit(result);
     GraphEntryInstr* graph_entry =
-        new GraphEntryInstr(NULL,  // No parsed function.
-                            entry,
-                            Isolate::kNoDeoptId);  // No OSR id.
+        new(isolate()) GraphEntryInstr(NULL,  // No parsed function.
+                                       entry,
+                                       Isolate::kNoDeoptId);  // No OSR id.
     // Update polymorphic inliner state.
     inlined_entries_.Add(graph_entry);
     exit_collector_->Union(exit_collector);
@@ -1377,9 +1402,10 @@
 TargetEntryInstr* PolymorphicInliner::BuildDecisionGraph() {
   // Start with a fresh target entry.
   TargetEntryInstr* entry =
-      new TargetEntryInstr(owner_->caller_graph()->allocate_block_id(),
-                           call_->GetBlock()->try_index());
-  entry->InheritDeoptTarget(call_);
+      new(isolate()) TargetEntryInstr(
+          owner_->caller_graph()->allocate_block_id(),
+          call_->GetBlock()->try_index());
+  entry->InheritDeoptTarget(isolate(), call_);
 
   // This function uses a cursor (a pointer to the 'current' instruction) to
   // build the graph.  The next instruction will be inserted after the
@@ -1390,7 +1416,8 @@
   Definition* receiver = call_->ArgumentAt(0);
   // There are at least two variants including non-inlined ones, so we have
   // at least one branch on the class id.
-  LoadClassIdInstr* load_cid = new LoadClassIdInstr(new Value(receiver));
+  LoadClassIdInstr* load_cid =
+      new(isolate()) LoadClassIdInstr(new(isolate()) Value(receiver));
   load_cid->set_ssa_temp_index(owner_->caller_graph()->alloc_ssa_temp_index());
   cursor = AppendInstruction(cursor, load_cid);
   for (intptr_t i = 0; i < inlined_variants_.length(); ++i) {
@@ -1402,7 +1429,7 @@
       // body.  Check a redefinition of the receiver, to prevent the check
       // from being hoisted.
       RedefinitionInstr* redefinition =
-          new RedefinitionInstr(new Value(receiver));
+          new(isolate()) RedefinitionInstr(new(isolate()) Value(receiver));
       redefinition->set_ssa_temp_index(
           owner_->caller_graph()->alloc_ssa_temp_index());
       cursor = AppendInstruction(cursor, redefinition);
@@ -1411,7 +1438,7 @@
             new CheckSmiInstr(new Value(redefinition),
                               call_->deopt_id(),
                               call_->token_pos());
-        check_smi->InheritDeoptTarget(call_);
+        check_smi->InheritDeoptTarget(isolate(), call_);
         cursor = AppendInstruction(cursor, check_smi);
       } else {
         const ICData& old_checks = call_->ic_data();
@@ -1428,7 +1455,7 @@
                                 call_->deopt_id(),
                                 new_checks,
                                 call_->token_pos());
-        check_class->InheritDeoptTarget(call_);
+        check_class->InheritDeoptTarget(isolate(), call_);
         cursor = AppendInstruction(cursor, check_class);
       }
       // The next instruction is the first instruction of the inlined body.
@@ -1461,7 +1488,7 @@
         JoinEntryInstr* join = callee_entry->AsJoinEntry();
         ASSERT(join->dominator() != NULL);
         GotoInstr* goto_join = new GotoInstr(join);
-        goto_join->InheritDeoptTarget(join);
+        goto_join->InheritDeoptTarget(isolate(), join);
         cursor->LinkTo(goto_join);
         current_block->set_last_instruction(goto_join);
       } else {
@@ -1484,7 +1511,7 @@
                                  new Value(cid_constant),
                                  false);  // No number check.
       BranchInstr* branch = new BranchInstr(compare);
-      branch->InheritDeoptTarget(call_);
+      branch->InheritDeoptTarget(isolate(), call_);
       AppendInstruction(AppendInstruction(cursor, cid_constant), branch);
       current_block->set_last_instruction(branch);
       cursor = NULL;
@@ -1516,9 +1543,9 @@
         true_target =
             new TargetEntryInstr(owner_->caller_graph()->allocate_block_id(),
                                  call_->GetBlock()->try_index());
-        true_target->InheritDeoptTarget(join);
+        true_target->InheritDeoptTarget(isolate(), join);
         GotoInstr* goto_join = new GotoInstr(join);
-        goto_join->InheritDeoptTarget(join);
+        goto_join->InheritDeoptTarget(isolate(), join);
         true_target->LinkTo(goto_join);
         true_target->set_last_instruction(goto_join);
       }
@@ -1530,7 +1557,7 @@
       TargetEntryInstr* false_target =
           new TargetEntryInstr(owner_->caller_graph()->allocate_block_id(),
                                call_->GetBlock()->try_index());
-      false_target->InheritDeoptTarget(call_);
+      false_target->InheritDeoptTarget(isolate(), call_);
       *branch->false_successor_address() = false_target;
       current_block->AddDominatedBlock(false_target);
       cursor = current_block = false_target;
@@ -1565,11 +1592,11 @@
                                          true);  // With checks.
     fallback_call->set_ssa_temp_index(
         owner_->caller_graph()->alloc_ssa_temp_index());
-    fallback_call->InheritDeoptTarget(call_);
+    fallback_call->InheritDeoptTarget(isolate(), call_);
     ReturnInstr* fallback_return =
         new ReturnInstr(call_->instance_call()->token_pos(),
                         new Value(fallback_call));
-    fallback_return->InheritDeoptTargetAfter(call_);
+    fallback_return->InheritDeoptTargetAfter(isolate(), call_);
     AppendInstruction(AppendInstruction(cursor, fallback_call),
                       fallback_return);
     exit_collector_->AddExit(fallback_return);
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 6ef9ef6..bd6fea2 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -158,12 +158,12 @@
     }
   }
 
-  const Array& args_desc_array = Array::Handle(
+  const Array& args_desc_array = Array::Handle(isolate(),
       ArgumentsDescriptor::New(call->ArgumentCount(), call->argument_names()));
   ArgumentsDescriptor args_desc(args_desc_array);
-  const Class& receiver_class = Class::Handle(
-      Isolate::Current()->class_table()->At(class_ids[0]));
-  const Function& function = Function::Handle(
+  const Class& receiver_class = Class::Handle(isolate(),
+      isolate()->class_table()->At(class_ids[0]));
+  const Function& function = Function::Handle(isolate(),
       Resolver::ResolveDynamicForReceiverClass(
           receiver_class,
           call->function_name(),
@@ -175,7 +175,7 @@
   // since it is attached to the assembly instruction itself.
   // TODO(srdjan): Prevent modification of ICData object that is
   // referenced in assembly code.
-  ICData& ic_data = ICData::ZoneHandle(ICData::New(
+  ICData& ic_data = ICData::ZoneHandle(isolate(), ICData::New(
       flow_graph_->parsed_function().function(),
       call->function_name(),
       args_desc_array,
@@ -192,7 +192,8 @@
 }
 
 
-static const ICData& TrySpecializeICData(const ICData& ic_data, intptr_t cid) {
+const ICData& FlowGraphOptimizer::TrySpecializeICData(const ICData& ic_data,
+                                                      intptr_t cid) {
   ASSERT(ic_data.NumArgsTested() == 1);
 
   if ((ic_data.NumberOfChecks() == 1) &&
@@ -201,13 +202,13 @@
   }
 
   const Function& function =
-      Function::Handle(ic_data.GetTargetForReceiverClassId(cid));
+      Function::Handle(isolate(), ic_data.GetTargetForReceiverClassId(cid));
   // TODO(fschneider): Try looking up the function on the class if it is
   // not found in the ICData.
   if (!function.IsNull()) {
-    const ICData& new_ic_data = ICData::ZoneHandle(ICData::New(
-        Function::Handle(ic_data.owner()),
-        String::Handle(ic_data.target_name()),
+    const ICData& new_ic_data = ICData::ZoneHandle(isolate(), ICData::New(
+        Function::Handle(isolate(), ic_data.owner()),
+        String::Handle(isolate(), ic_data.target_name()),
         Object::empty_array(),  // Dummy argument descriptor.
         ic_data.deopt_id(),
         ic_data.NumArgsTested()));
@@ -240,9 +241,9 @@
 
   const bool with_checks = false;
   PolymorphicInstanceCallInstr* specialized =
-      new PolymorphicInstanceCallInstr(call->instance_call(),
-                                       ic_data,
-                                       with_checks);
+      new(isolate()) PolymorphicInstanceCallInstr(call->instance_call(),
+                                                  ic_data,
+                                                  with_checks);
   call->ReplaceWith(specialized, current_iterator());
 }
 
@@ -293,10 +294,10 @@
   ASSERT(bit_and_instr->IsBinarySmiOp() || bit_and_instr->IsBinaryMintOp());
   if (bit_and_instr->IsBinaryMintOp()) {
     // Replace Mint op with Smi op.
-    BinarySmiOpInstr* smi_op = new BinarySmiOpInstr(
+    BinarySmiOpInstr* smi_op = new(isolate()) BinarySmiOpInstr(
         Token::kBIT_AND,
-        new Value(left_instr),
-        new Value(right_instr),
+        new(isolate()) Value(left_instr),
+        new(isolate()) Value(right_instr),
         Isolate::kNoDeoptId,  // BIT_AND cannot deoptimize.
         Scanner::kNoSourcePos);
     bit_and_instr->ReplaceWith(smi_op, current_iterator());
@@ -311,15 +312,16 @@
 void FlowGraphOptimizer::AppendLoadIndexedForMerged(Definition* instr,
                                                     intptr_t ix,
                                                     intptr_t cid) {
-  const intptr_t index_scale = FlowGraphCompiler::ElementSizeFor(cid);
+  const intptr_t index_scale = Instance::ElementSizeFor(cid);
   ConstantInstr* index_instr =
-      flow_graph()->GetConstant(Smi::Handle(Smi::New(ix)));
-  LoadIndexedInstr* load = new LoadIndexedInstr(new Value(instr),
-                                                new Value(index_instr),
-                                                index_scale,
-                                                cid,
-                                                Isolate::kNoDeoptId,
-                                                instr->token_pos());
+      flow_graph()->GetConstant(Smi::Handle(isolate(), Smi::New(ix)));
+  LoadIndexedInstr* load =
+      new(isolate()) LoadIndexedInstr(new(isolate()) Value(instr),
+                                      new(isolate()) Value(index_instr),
+                                      index_scale,
+                                      cid,
+                                      Isolate::kNoDeoptId,
+                                      instr->token_pos());
   instr->ReplaceUsesWith(load);
   flow_graph()->InsertAfter(instr, load, NULL, FlowGraph::kValue);
 }
@@ -329,10 +331,11 @@
                                                          intptr_t index,
                                                          Representation rep,
                                                          intptr_t cid) {
-  ExtractNthOutputInstr* extract = new ExtractNthOutputInstr(new Value(instr),
-                                                             index,
-                                                             rep,
-                                                             cid);
+  ExtractNthOutputInstr* extract =
+      new(isolate()) ExtractNthOutputInstr(new(isolate()) Value(instr),
+                                           index,
+                                           rep,
+                                           cid);
   instr->ReplaceUsesWith(extract);
   flow_graph()->InsertAfter(instr, extract, NULL, FlowGraph::kValue);
 }
@@ -393,12 +396,13 @@
             MergedMathInstr::OutputIndexOf(other_binop->op_kind()),
             kTagged, kSmiCid);
 
-        ZoneGrowableArray<Value*>* args = new ZoneGrowableArray<Value*>(2);
-        args->Add(new Value(curr_instr->left()->definition()));
-        args->Add(new Value(curr_instr->right()->definition()));
+        ZoneGrowableArray<Value*>* args =
+            new(isolate()) ZoneGrowableArray<Value*>(2);
+        args->Add(new(isolate()) Value(curr_instr->left()->definition()));
+        args->Add(new(isolate()) Value(curr_instr->right()->definition()));
 
         // Replace with TruncDivMod.
-        MergedMathInstr* div_mod = new MergedMathInstr(
+        MergedMathInstr* div_mod = new(isolate()) MergedMathInstr(
             args,
             curr_instr->deopt_id(),
             MergedMathInstr::kTruncDivMod);
@@ -453,12 +457,14 @@
             other_op,
             MergedMathInstr::OutputIndexOf(other_kind),
             kUnboxedDouble, kDoubleCid);
-        ZoneGrowableArray<Value*>* args = new ZoneGrowableArray<Value*>(1);
-        args->Add(new Value(curr_instr->value()->definition()));
+        ZoneGrowableArray<Value*>* args =
+            new(isolate()) ZoneGrowableArray<Value*>(1);
+        args->Add(new(isolate()) Value(curr_instr->value()->definition()));
         // Replace with SinCos.
         MergedMathInstr* sin_cos =
-            new MergedMathInstr(args, curr_instr->DeoptimizationTarget(),
-                                MergedMathInstr::kSinCos);
+            new(isolate()) MergedMathInstr(args,
+                                           curr_instr->DeoptimizationTarget(),
+                                           MergedMathInstr::kSinCos);
         curr_instr->ReplaceWith(sin_cos, current_iterator());
         other_op->ReplaceUsesWith(sin_cos);
         other_op->RemoveFromGraph();
@@ -605,26 +611,28 @@
            (use->Type()->ToCid() == kUnboxedMint));
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new UnboxIntegerInstr(use->CopyWithType(), deopt_id);
+    converted = new(isolate()) UnboxIntegerInstr(use->CopyWithType(), deopt_id);
 
   } else if ((from == kUnboxedMint) && (to == kTagged)) {
-    converted = new BoxIntegerInstr(use->CopyWithType());
+    converted = new(isolate()) BoxIntegerInstr(use->CopyWithType());
 
   } else if (from == kUnboxedMint && to == kUnboxedDouble) {
     ASSERT(CanUnboxDouble());
     // Convert by boxing/unboxing.
     // TODO(fschneider): Implement direct unboxed mint-to-double conversion.
-    BoxIntegerInstr* boxed = new BoxIntegerInstr(use->CopyWithType());
+    BoxIntegerInstr* boxed =
+        new(isolate()) BoxIntegerInstr(use->CopyWithType());
     use->BindTo(boxed);
     InsertBefore(insert_before, boxed, NULL, FlowGraph::kValue);
 
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new UnboxDoubleInstr(new Value(boxed), deopt_id);
+    converted = new(isolate()) UnboxDoubleInstr(
+        new(isolate()) Value(boxed), deopt_id);
 
   } else if ((from == kUnboxedDouble) && (to == kTagged)) {
     ASSERT(CanUnboxDouble());
-    converted = new BoxDoubleInstr(use->CopyWithType());
+    converted = new(isolate()) BoxDoubleInstr(use->CopyWithType());
 
   } else if ((from == kTagged) && (to == kUnboxedDouble)) {
     ASSERT(CanUnboxDouble());
@@ -636,34 +644,38 @@
     if ((constant != NULL) && constant->value().IsSmi()) {
       const double dbl_val = Smi::Cast(constant->value()).AsDoubleValue();
       const Double& dbl_obj =
-          Double::ZoneHandle(Double::New(dbl_val, Heap::kOld));
+          Double::ZoneHandle(isolate(), Double::New(dbl_val, Heap::kOld));
       ConstantInstr* double_const = flow_graph()->GetConstant(dbl_obj);
-      converted = new UnboxDoubleInstr(new Value(double_const), deopt_id);
+      converted = new(isolate()) UnboxDoubleInstr(
+          new(isolate()) Value(double_const), deopt_id);
     } else {
-      converted = new UnboxDoubleInstr(use->CopyWithType(), deopt_id);
+      converted = new(isolate()) UnboxDoubleInstr(
+          use->CopyWithType(), deopt_id);
     }
   } else if ((from == kTagged) && (to == kUnboxedFloat32x4)) {
     ASSERT((deopt_target != NULL) ||
            (use->Type()->ToCid() == kFloat32x4Cid));
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new UnboxFloat32x4Instr(use->CopyWithType(), deopt_id);
+    converted = new(isolate()) UnboxFloat32x4Instr(
+        use->CopyWithType(), deopt_id);
   } else if ((from == kUnboxedFloat32x4) && (to == kTagged)) {
-    converted = new BoxFloat32x4Instr(use->CopyWithType());
+    converted = new(isolate()) BoxFloat32x4Instr(use->CopyWithType());
   } else if ((from == kTagged) && (to == kUnboxedInt32x4)) {
     ASSERT((deopt_target != NULL) || (use->Type()->ToCid() == kInt32x4Cid));
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new UnboxInt32x4Instr(use->CopyWithType(), deopt_id);
+    converted = new(isolate()) UnboxInt32x4Instr(use->CopyWithType(), deopt_id);
   } else if ((from == kUnboxedInt32x4) && (to == kTagged)) {
-    converted = new BoxInt32x4Instr(use->CopyWithType());
+    converted = new(isolate()) BoxInt32x4Instr(use->CopyWithType());
   } else if ((from == kTagged) && (to == kUnboxedFloat64x2)) {
     ASSERT((deopt_target != NULL) || (use->Type()->ToCid() == kFloat64x2Cid));
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new UnboxFloat64x2Instr(use->CopyWithType(), deopt_id);
+    converted = new(isolate()) UnboxFloat64x2Instr(
+        use->CopyWithType(), deopt_id);
   } else if ((from == kUnboxedFloat64x2) && (to == kTagged)) {
-    converted = new BoxFloat64x2Instr(use->CopyWithType());
+    converted = new(isolate()) BoxFloat64x2Instr(use->CopyWithType());
   } else {
     // We have failed to find a suitable conversion instruction.
     // Insert two "dummy" conversion instructions with the correct
@@ -675,31 +687,31 @@
     ASSERT(to != kTagged);
     Definition* boxed = NULL;
     if (from == kUnboxedDouble) {
-      boxed = new BoxDoubleInstr(use->CopyWithType());
+      boxed = new(isolate()) BoxDoubleInstr(use->CopyWithType());
     } else if (from == kUnboxedInt32x4) {
-      boxed = new BoxInt32x4Instr(use->CopyWithType());
+      boxed = new(isolate()) BoxInt32x4Instr(use->CopyWithType());
     } else if (from == kUnboxedFloat32x4) {
-      boxed = new BoxFloat32x4Instr(use->CopyWithType());
+      boxed = new(isolate()) BoxFloat32x4Instr(use->CopyWithType());
     } else if (from == kUnboxedMint) {
-      boxed = new BoxIntegerInstr(use->CopyWithType());
+      boxed = new(isolate()) BoxIntegerInstr(use->CopyWithType());
     } else if (from == kUnboxedFloat64x2) {
-      boxed = new BoxFloat64x2Instr(use->CopyWithType());
+      boxed = new(isolate()) BoxFloat64x2Instr(use->CopyWithType());
     } else {
       UNIMPLEMENTED();
     }
     use->BindTo(boxed);
     InsertBefore(insert_before, boxed, NULL, FlowGraph::kValue);
-    Value* to_value = new Value(boxed);
+    Value* to_value = new(isolate()) Value(boxed);
     if (to == kUnboxedDouble) {
-      converted = new UnboxDoubleInstr(to_value, deopt_id);
+      converted = new(isolate()) UnboxDoubleInstr(to_value, deopt_id);
     } else if (to == kUnboxedInt32x4) {
-      converted = new UnboxInt32x4Instr(to_value, deopt_id);
+      converted = new(isolate()) UnboxInt32x4Instr(to_value, deopt_id);
     } else if (to == kUnboxedFloat32x4) {
-      converted = new UnboxFloat32x4Instr(to_value, deopt_id);
+      converted = new(isolate()) UnboxFloat32x4Instr(to_value, deopt_id);
     } else if (to == kUnboxedMint) {
-      converted = new UnboxIntegerInstr(to_value, deopt_id);
+      converted = new(isolate()) UnboxIntegerInstr(to_value, deopt_id);
     } else if (to == kUnboxedFloat64x2) {
-      converted = new UnboxFloat64x2Instr(to_value, deopt_id);
+      converted = new(isolate()) UnboxFloat64x2Instr(to_value, deopt_id);
     } else {
       UNIMPLEMENTED();
     }
@@ -980,9 +992,9 @@
                                      Instruction* insert_before) {
   if (to_check->Type()->ToCid() != kSmiCid) {
     InsertBefore(insert_before,
-                 new CheckSmiInstr(new Value(to_check),
-                                   deopt_id,
-                                   insert_before->token_pos()),
+                 new(isolate()) CheckSmiInstr(new(isolate()) Value(to_check),
+                                              deopt_id,
+                                              insert_before->token_pos()),
                  deopt_environment,
                  FlowGraph::kEffect);
   }
@@ -995,12 +1007,12 @@
                                                intptr_t token_pos) {
   if ((unary_checks.NumberOfChecks() == 1) &&
       (unary_checks.GetReceiverClassIdAt(0) == kSmiCid)) {
-    return new CheckSmiInstr(new Value(to_check),
-                             deopt_id,
-                             token_pos);
+    return new(isolate()) CheckSmiInstr(new(isolate()) Value(to_check),
+                                        deopt_id,
+                                        token_pos);
   }
-  return new CheckClassInstr(
-      new Value(to_check), deopt_id, unary_checks, token_pos);
+  return new(isolate()) CheckClassInstr(
+      new(isolate()) Value(to_check), deopt_id, unary_checks, token_pos);
 }
 
 
@@ -1018,7 +1030,8 @@
 
 void FlowGraphOptimizer::AddReceiverCheck(InstanceCallInstr* call) {
   AddCheckClass(call->ArgumentAt(0),
-                ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecks()),
+                ICData::ZoneHandle(isolate(),
+                                   call->ic_data()->AsUnaryClassChecks()),
                 call->deopt_id(),
                 call->env(),
                 call);
@@ -1124,11 +1137,12 @@
 bool FlowGraphOptimizer::TryReplaceWithStoreIndexed(InstanceCallInstr* call) {
   // Check for monomorphic IC data.
   if (!call->HasICData()) return false;
-  const ICData& ic_data = ICData::Handle(call->ic_data()->AsUnaryClassChecks());
+  const ICData& ic_data = ICData::Handle(isolate(),
+                                         call->ic_data()->AsUnaryClassChecks());
   if (ic_data.NumberOfChecks() != 1) return false;
   ASSERT(ic_data.HasOneTarget());
 
-  const Function& target = Function::Handle(ic_data.GetTargetAt(0));
+  const Function& target = Function::Handle(isolate(), ic_data.GetTargetAt(0));
   TargetEntryInstr* entry;
   Definition* last;
   if (!TryInlineRecognizedMethod(ic_data.GetReceiverClassIdAt(0),
@@ -1181,29 +1195,31 @@
   Definition* index = call->ArgumentAt(1);
   Definition* stored_value = call->ArgumentAt(2);
 
-  *entry = new TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(call);
+  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                           call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(isolate(), call);
   Instruction* cursor = *entry;
   if (FLAG_enable_type_checks) {
     // Only type check for the value. A type check for the index is not
     // needed here because we insert a deoptimizing smi-check for the case
     // the index is not a smi.
     const AbstractType& value_type =
-        AbstractType::ZoneHandle(target.ParameterTypeAt(2));
+        AbstractType::ZoneHandle(isolate(), target.ParameterTypeAt(2));
     Definition* instantiator = NULL;
     Definition* type_args = NULL;
     switch (array_cid) {
       case kArrayCid:
       case kGrowableObjectArrayCid: {
-        const Class& instantiator_class = Class::Handle(target.Owner());
+        const Class& instantiator_class =
+            Class::Handle(isolate(), target.Owner());
         intptr_t type_arguments_field_offset =
             instantiator_class.type_arguments_field_offset();
         LoadFieldInstr* load_type_args =
-            new LoadFieldInstr(new Value(array),
-                               type_arguments_field_offset,
-                               Type::ZoneHandle(),  // No type.
-                               call->token_pos());
+            new(isolate()) LoadFieldInstr(
+                new(isolate()) Value(array),
+                type_arguments_field_offset,
+                Type::ZoneHandle(isolate(), Type::null()),  // No type.
+                call->token_pos());
         cursor = flow_graph()->AppendTo(cursor,
                                         load_type_args,
                                         NULL,
@@ -1252,12 +1268,12 @@
         UNREACHABLE();
     }
     AssertAssignableInstr* assert_value =
-        new AssertAssignableInstr(token_pos,
-                                  new Value(stored_value),
-                                  new Value(instantiator),
-                                  new Value(type_args),
-                                  value_type,
-                                  Symbols::Value());
+        new(isolate()) AssertAssignableInstr(token_pos,
+                                             new(isolate()) Value(stored_value),
+                                             new(isolate()) Value(instantiator),
+                                             new(isolate()) Value(type_args),
+                                             value_type,
+                                             Symbols::Value());
     // Newly inserted instructions that can deoptimize or throw an exception
     // must have a deoptimization id that is valid for lookup in the unoptimized
     // code.
@@ -1294,22 +1310,23 @@
 
   if (array_cid == kTypedDataFloat32ArrayCid) {
     stored_value =
-        new DoubleToFloatInstr(new Value(stored_value), call->deopt_id());
+        new(isolate()) DoubleToFloatInstr(
+            new(isolate()) Value(stored_value), call->deopt_id());
     cursor = flow_graph()->AppendTo(cursor,
                                     stored_value,
                                     NULL,
                                     FlowGraph::kValue);
   }
 
-  intptr_t index_scale = FlowGraphCompiler::ElementSizeFor(array_cid);
-  *last = new StoreIndexedInstr(new Value(array),
-                                new Value(index),
-                                new Value(stored_value),
-                                needs_store_barrier,
-                                index_scale,
-                                array_cid,
-                                call->deopt_id(),
-                                call->token_pos());
+  const intptr_t index_scale = Instance::ElementSizeFor(array_cid);
+  *last = new(isolate()) StoreIndexedInstr(new(isolate()) Value(array),
+                                           new(isolate()) Value(index),
+                                           new(isolate()) Value(stored_value),
+                                           needs_store_barrier,
+                                           index_scale,
+                                           array_cid,
+                                           call->deopt_id(),
+                                           call->token_pos());
   flow_graph()->AppendTo(cursor,
                          *last,
                          call->env(),
@@ -1326,7 +1343,7 @@
                                                    const ICData& ic_data,
                                                    TargetEntryInstr** entry,
                                                    Definition** last) {
-  ICData& value_check = ICData::ZoneHandle();
+  ICData& value_check = ICData::ZoneHandle(isolate(), ICData::null());
   MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(target);
   switch (kind) {
     // Recognized [] operators.
@@ -1562,19 +1579,21 @@
                                                     Definition* index,
                                                     Instruction** cursor) {
   // Insert index smi check.
-  *cursor = flow_graph()->AppendTo(*cursor,
-                                   new CheckSmiInstr(new Value(index),
-                                                     call->deopt_id(),
-                                                     call->token_pos()),
-                                   call->env(),
-                                   FlowGraph::kEffect);
+  *cursor = flow_graph()->AppendTo(
+      *cursor,
+      new(isolate()) CheckSmiInstr(new(isolate()) Value(index),
+                                   call->deopt_id(),
+                                   call->token_pos()),
+      call->env(),
+      FlowGraph::kEffect);
 
   // Insert array length load and bounds check.
   LoadFieldInstr* length =
-      new LoadFieldInstr(new Value(*array),
-                         CheckArrayBoundInstr::LengthOffsetFor(array_cid),
-                         Type::ZoneHandle(Type::SmiType()),
-                         call->token_pos());
+      new(isolate()) LoadFieldInstr(
+          new(isolate()) Value(*array),
+          CheckArrayBoundInstr::LengthOffsetFor(array_cid),
+          Type::ZoneHandle(isolate(), Type::SmiType()),
+          call->token_pos());
   length->set_is_immutable(
       CheckArrayBoundInstr::IsFixedLengthArrayType(array_cid));
   length->set_result_cid(kSmiCid);
@@ -1586,9 +1605,9 @@
                                    FlowGraph::kValue);
 
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new CheckArrayBoundInstr(
-                                       new Value(length),
-                                       new Value(index),
+                                   new(isolate()) CheckArrayBoundInstr(
+                                       new(isolate()) Value(length),
+                                       new(isolate()) Value(index),
                                        call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
@@ -1596,10 +1615,11 @@
   if (array_cid == kGrowableObjectArrayCid) {
     // Insert data elements load.
     LoadFieldInstr* elements =
-        new LoadFieldInstr(new Value(*array),
-                           GrowableObjectArray::data_offset(),
-                           Type::ZoneHandle(Type::DynamicType()),
-                           call->token_pos());
+        new(isolate()) LoadFieldInstr(
+            new(isolate()) Value(*array),
+            GrowableObjectArray::data_offset(),
+            Type::ZoneHandle(isolate(), Type::DynamicType()),
+            call->token_pos());
     elements->set_result_cid(kArrayCid);
     *cursor = flow_graph()->AppendTo(*cursor,
                                      elements,
@@ -1610,8 +1630,8 @@
     array_cid = kArrayCid;
   } else if (RawObject::IsExternalTypedDataClassId(array_cid)) {
     LoadUntaggedInstr* elements =
-        new LoadUntaggedInstr(new Value(*array),
-                              ExternalTypedData::data_offset());
+        new(isolate()) LoadUntaggedInstr(new(isolate()) Value(*array),
+                                         ExternalTypedData::data_offset());
     *cursor = flow_graph()->AppendTo(*cursor,
                                      elements,
                                      NULL,
@@ -1632,9 +1652,9 @@
 
   Definition* array = receiver;
   Definition* index = call->ArgumentAt(1);
-  *entry = new TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(call);
+  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                           call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(isolate(), call);
   Instruction* cursor = *entry;
 
   array_cid = PrepareInlineIndexedOp(call,
@@ -1653,13 +1673,13 @@
   }
 
   // Array load and return.
-  intptr_t index_scale = FlowGraphCompiler::ElementSizeFor(array_cid);
-  *last = new LoadIndexedInstr(new Value(array),
-                               new Value(index),
-                               index_scale,
-                               array_cid,
-                               deopt_id,
-                               call->token_pos());
+  intptr_t index_scale = Instance::ElementSizeFor(array_cid);
+  *last = new(isolate()) LoadIndexedInstr(new(isolate()) Value(array),
+                                          new(isolate()) Value(index),
+                                          index_scale,
+                                          array_cid,
+                                          deopt_id,
+                                          call->token_pos());
   cursor = flow_graph()->AppendTo(
       cursor,
       *last,
@@ -1667,7 +1687,8 @@
       FlowGraph::kValue);
 
   if (array_cid == kTypedDataFloat32ArrayCid) {
-    *last = new FloatToDoubleInstr(new Value(*last), deopt_id);
+    *last = new(isolate()) FloatToDoubleInstr(
+        new(isolate()) Value(*last), deopt_id);
     flow_graph()->AppendTo(cursor,
                            *last,
                            deopt_id != Isolate::kNoDeoptId ? call->env() : NULL,
@@ -1680,11 +1701,12 @@
 bool FlowGraphOptimizer::TryReplaceWithLoadIndexed(InstanceCallInstr* call) {
   // Check for monomorphic IC data.
   if (!call->HasICData()) return false;
-  const ICData& ic_data = ICData::Handle(call->ic_data()->AsUnaryClassChecks());
+  const ICData& ic_data =
+      ICData::Handle(isolate(), call->ic_data()->AsUnaryClassChecks());
   if (ic_data.NumberOfChecks() != 1) return false;
   ASSERT(ic_data.HasOneTarget());
 
-  const Function& target = Function::Handle(ic_data.GetTargetAt(0));
+  const Function& target = Function::Handle(isolate(), ic_data.GetTargetAt(0));
   TargetEntryInstr* entry;
   Definition* last;
   if (!TryInlineRecognizedMethod(ic_data.GetReceiverClassIdAt(0),
@@ -1763,13 +1785,13 @@
       ConstantInstr* left_const = left->AsConstant();
       const String& str = String::Cast(left_const->value());
       ASSERT(str.Length() == 1);
-      ConstantInstr* char_code_left =
-          flow_graph()->GetConstant(Smi::ZoneHandle(Smi::New(str.CharAt(0))));
-      left_val = new Value(char_code_left);
+      ConstantInstr* char_code_left = flow_graph()->GetConstant(
+          Smi::ZoneHandle(isolate(), Smi::New(str.CharAt(0))));
+      left_val = new(isolate()) Value(char_code_left);
     } else if (left->IsStringFromCharCode()) {
       // Use input of string-from-charcode as left value.
       StringFromCharCodeInstr* instr = left->AsStringFromCharCode();
-      left_val = new Value(instr->char_code()->definition());
+      left_val = new(isolate()) Value(instr->char_code()->definition());
       to_remove_left = instr;
     } else {
       // IsLengthOneString(left) should have been false.
@@ -1781,11 +1803,12 @@
     if (right->IsStringFromCharCode()) {
       // Skip string-from-char-code, and use its input as right value.
       StringFromCharCodeInstr* right_instr = right->AsStringFromCharCode();
-      right_val = new Value(right_instr->char_code()->definition());
+      right_val = new(isolate()) Value(right_instr->char_code()->definition());
       to_remove_right = right_instr;
     } else {
       const ICData& unary_checks_1 =
-          ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecksForArgNr(1));
+          ICData::ZoneHandle(isolate(),
+                             call->ic_data()->AsUnaryClassChecksForArgNr(1));
       AddCheckClass(right,
                     unary_checks_1,
                     call->deopt_id(),
@@ -1794,19 +1817,20 @@
       // String-to-char-code instructions returns -1 (illegal charcode) if
       // string is not of length one.
       StringToCharCodeInstr* char_code_right =
-          new StringToCharCodeInstr(new Value(right), kOneByteStringCid);
+          new(isolate()) StringToCharCodeInstr(
+              new(isolate()) Value(right), kOneByteStringCid);
       InsertBefore(call, char_code_right, call->env(), FlowGraph::kValue);
-      right_val = new Value(char_code_right);
+      right_val = new(isolate()) Value(char_code_right);
     }
 
     // Comparing char-codes instead of strings.
     EqualityCompareInstr* comp =
-        new EqualityCompareInstr(call->token_pos(),
-                                 op_kind,
-                                 left_val,
-                                 right_val,
-                                 kSmiCid,
-                                 call->deopt_id());
+        new(isolate()) EqualityCompareInstr(call->token_pos(),
+                                            op_kind,
+                                            left_val,
+                                            right_val,
+                                            kSmiCid,
+                                            call->deopt_id());
     ReplaceCall(call, comp);
 
     // Remove dead instructions.
@@ -1846,15 +1870,15 @@
     }
   } else if (HasOnlyTwoOf(ic_data, kSmiCid)) {
     InsertBefore(call,
-                 new CheckSmiInstr(new Value(left),
-                                   call->deopt_id(),
-                                   call->token_pos()),
+                 new(isolate()) CheckSmiInstr(new(isolate()) Value(left),
+                                              call->deopt_id(),
+                                              call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
     InsertBefore(call,
-                 new CheckSmiInstr(new Value(right),
-                                   call->deopt_id(),
-                                   call->token_pos()),
+                 new(isolate()) CheckSmiInstr(new(isolate()) Value(right),
+                                              call->deopt_id(),
+                                              call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
     cid = kSmiCid;
@@ -1872,9 +1896,10 @@
         return false;
       } else {
         InsertBefore(call,
-                     new CheckEitherNonSmiInstr(new Value(left),
-                                                new Value(right),
-                                                call->deopt_id()),
+                     new(isolate()) CheckEitherNonSmiInstr(
+                         new(isolate()) Value(left),
+                         new(isolate()) Value(right),
+                         call->deopt_id()),
                      call->env(),
                      FlowGraph::kEffect);
         cid = kDoubleCid;
@@ -1891,7 +1916,8 @@
                                               smi_or_null,
                                               smi_or_null)) {
       const ICData& unary_checks_0 =
-          ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecks());
+          ICData::ZoneHandle(isolate(),
+                             call->ic_data()->AsUnaryClassChecks());
       AddCheckClass(left,
                     unary_checks_0,
                     call->deopt_id(),
@@ -1899,7 +1925,8 @@
                     call);
 
       const ICData& unary_checks_1 =
-          ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecksForArgNr(1));
+          ICData::ZoneHandle(isolate(),
+                             call->ic_data()->AsUnaryClassChecksForArgNr(1));
       AddCheckClass(right,
                     unary_checks_1,
                     call->deopt_id(),
@@ -1913,11 +1940,11 @@
       if ((right_const != NULL && right_const->value().IsNull()) ||
           (left_const != NULL && left_const->value().IsNull())) {
         StrictCompareInstr* comp =
-            new StrictCompareInstr(call->token_pos(),
-                                   Token::kEQ_STRICT,
-                                   new Value(left),
-                                   new Value(right),
-                                   false);  // No number check.
+            new(isolate()) StrictCompareInstr(call->token_pos(),
+                                              Token::kEQ_STRICT,
+                                              new(isolate()) Value(left),
+                                              new(isolate()) Value(right),
+                                              false);  // No number check.
         ReplaceCall(call, comp);
         return true;
       }
@@ -1925,12 +1952,13 @@
     }
   }
   ASSERT(cid != kIllegalCid);
-  EqualityCompareInstr* comp = new EqualityCompareInstr(call->token_pos(),
-                                                        op_kind,
-                                                        new Value(left),
-                                                        new Value(right),
-                                                        cid,
-                                                        call->deopt_id());
+  EqualityCompareInstr* comp = new(isolate()) EqualityCompareInstr(
+      call->token_pos(),
+      op_kind,
+      new(isolate()) Value(left),
+      new(isolate()) Value(right),
+      cid,
+      call->deopt_id());
   ReplaceCall(call, comp);
   return true;
 }
@@ -1948,15 +1976,15 @@
   intptr_t cid = kIllegalCid;
   if (HasOnlyTwoOf(ic_data, kSmiCid)) {
     InsertBefore(call,
-                 new CheckSmiInstr(new Value(left),
-                                   call->deopt_id(),
-                                   call->token_pos()),
+                 new(isolate()) CheckSmiInstr(new(isolate()) Value(left),
+                                              call->deopt_id(),
+                                              call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
     InsertBefore(call,
-                 new CheckSmiInstr(new Value(right),
-                                   call->deopt_id(),
-                                   call->token_pos()),
+                 new(isolate()) CheckSmiInstr(new(isolate()) Value(right),
+                                              call->deopt_id(),
+                                              call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
     cid = kSmiCid;
@@ -1974,9 +2002,10 @@
         return false;
       } else {
         InsertBefore(call,
-                     new CheckEitherNonSmiInstr(new Value(left),
-                                                new Value(right),
-                                                call->deopt_id()),
+                     new(isolate()) CheckEitherNonSmiInstr(
+                         new(isolate()) Value(left),
+                         new(isolate()) Value(right),
+                         call->deopt_id()),
                      call->env(),
                      FlowGraph::kEffect);
         cid = kDoubleCid;
@@ -1986,12 +2015,13 @@
     return false;
   }
   ASSERT(cid != kIllegalCid);
-  RelationalOpInstr* comp = new RelationalOpInstr(call->token_pos(),
-                                                  op_kind,
-                                                  new Value(left),
-                                                  new Value(right),
-                                                  cid,
-                                                  call->deopt_id());
+  RelationalOpInstr* comp = new(isolate()) RelationalOpInstr(
+      call->token_pos(),
+      op_kind,
+      new(isolate()) Value(left),
+      new(isolate()) Value(right),
+      cid,
+      call->deopt_id());
   ReplaceCall(call, comp);
   return true;
 }
@@ -2084,7 +2114,7 @@
             ? kMintCid
             : kSmiCid;
       } else if (HasTwoMintOrSmi(ic_data) &&
-                 HasOnlyOneSmi(ICData::Handle(
+                 HasOnlyOneSmi(ICData::Handle(isolate(),
                      ic_data.AsUnaryClassChecksForArgNr(1)))) {
         // Don't generate mint code if the IC data is marked because of an
         // overflow.
@@ -2124,28 +2154,33 @@
     // returns a double for two smis.
     if (op_kind != Token::kDIV) {
       InsertBefore(call,
-                   new CheckEitherNonSmiInstr(new Value(left),
-                                              new Value(right),
-                                              call->deopt_id()),
+                   new(isolate()) CheckEitherNonSmiInstr(
+                       new(isolate()) Value(left),
+                       new(isolate()) Value(right),
+                       call->deopt_id()),
                    call->env(),
                    FlowGraph::kEffect);
     }
 
     BinaryDoubleOpInstr* double_bin_op =
-        new BinaryDoubleOpInstr(op_kind, new Value(left), new Value(right),
-                                call->deopt_id(), call->token_pos());
+        new(isolate()) BinaryDoubleOpInstr(op_kind,
+                                           new(isolate()) Value(left),
+                                           new(isolate()) Value(right),
+                                           call->deopt_id(), call->token_pos());
     ReplaceCall(call, double_bin_op);
   } else if (operands_type == kMintCid) {
     if (!FlowGraphCompiler::SupportsUnboxedMints()) return false;
     if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
       ShiftMintOpInstr* shift_op =
-          new ShiftMintOpInstr(op_kind, new Value(left), new Value(right),
-                               call->deopt_id());
+          new(isolate()) ShiftMintOpInstr(
+              op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+              call->deopt_id());
       ReplaceCall(call, shift_op);
     } else {
       BinaryMintOpInstr* bin_op =
-          new BinaryMintOpInstr(op_kind, new Value(left), new Value(right),
-                                call->deopt_id());
+          new(isolate()) BinaryMintOpInstr(
+              op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+              call->deopt_id());
       ReplaceCall(call, bin_op);
     }
   } else if (operands_type == kFloat32x4Cid) {
@@ -2162,18 +2197,18 @@
         // Insert smi check and attach a copy of the original environment
         // because the smi operation can still deoptimize.
         InsertBefore(call,
-                     new CheckSmiInstr(new Value(left),
-                                       call->deopt_id(),
-                                       call->token_pos()),
+                     new(isolate()) CheckSmiInstr(new(isolate()) Value(left),
+                                                  call->deopt_id(),
+                                                  call->token_pos()),
                      call->env(),
                      FlowGraph::kEffect);
         ConstantInstr* constant =
-            flow_graph()->GetConstant(Smi::Handle(
+            flow_graph()->GetConstant(Smi::Handle(isolate(),
                 Smi::New(Smi::Cast(obj).Value() - 1)));
         BinarySmiOpInstr* bin_op =
-            new BinarySmiOpInstr(Token::kBIT_AND,
-                                 new Value(left),
-                                 new Value(constant),
+            new(isolate()) BinarySmiOpInstr(Token::kBIT_AND,
+                                 new(isolate()) Value(left),
+                                 new(isolate()) Value(constant),
                                  call->deopt_id(),
                                  call->token_pos());
         ReplaceCall(call, bin_op);
@@ -2185,8 +2220,10 @@
     AddCheckSmi(left, call->deopt_id(), call->env(), call);
     AddCheckSmi(right, call->deopt_id(), call->env(), call);
     BinarySmiOpInstr* bin_op =
-        new BinarySmiOpInstr(op_kind, new Value(left), new Value(right),
-                             call->deopt_id(), call->token_pos());
+        new(isolate()) BinarySmiOpInstr(op_kind,
+                                        new(isolate()) Value(left),
+                                        new(isolate()) Value(right),
+                                        call->deopt_id(), call->token_pos());
     ReplaceCall(call, bin_op);
   } else {
     ASSERT(operands_type == kSmiCid);
@@ -2202,8 +2239,9 @@
       right = temp;
     }
     BinarySmiOpInstr* bin_op =
-        new BinarySmiOpInstr(op_kind, new Value(left), new Value(right),
-                             call->deopt_id(), call->token_pos());
+        new(isolate()) BinarySmiOpInstr(
+            op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+            call->deopt_id(), call->token_pos());
     ReplaceCall(call, bin_op);
   }
   return true;
@@ -2217,23 +2255,24 @@
   Definition* unary_op = NULL;
   if (HasOnlyOneSmi(*call->ic_data())) {
     InsertBefore(call,
-                 new CheckSmiInstr(new Value(input),
-                                   call->deopt_id(),
-                                   call->token_pos()),
+                 new(isolate()) CheckSmiInstr(new(isolate()) Value(input),
+                                              call->deopt_id(),
+                                              call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
-    unary_op = new UnarySmiOpInstr(op_kind, new Value(input), call->deopt_id());
+    unary_op = new(isolate()) UnarySmiOpInstr(
+        op_kind, new(isolate()) Value(input), call->deopt_id());
   } else if ((op_kind == Token::kBIT_NOT) &&
              HasOnlySmiOrMint(*call->ic_data()) &&
              FlowGraphCompiler::SupportsUnboxedMints()) {
-    unary_op = new UnaryMintOpInstr(
-        op_kind, new Value(input), call->deopt_id());
+    unary_op = new(isolate()) UnaryMintOpInstr(
+        op_kind, new(isolate()) Value(input), call->deopt_id());
   } else if (HasOnlyOneDouble(*call->ic_data()) &&
              (op_kind == Token::kNEGATE) &&
              CanUnboxDouble()) {
     AddReceiverCheck(call);
-    unary_op = new UnaryDoubleOpInstr(
-        Token::kNEGATE, new Value(input), call->deopt_id());
+    unary_op = new(isolate()) UnaryDoubleOpInstr(
+        Token::kNEGATE, new(isolate()) Value(input), call->deopt_id());
   } else {
     return false;
   }
@@ -2270,7 +2309,7 @@
   if (function.IsDynamicFunction() &&
       callee_receiver->IsParameter() &&
       (callee_receiver->AsParameter()->index() == 0)) {
-    return CHA::HasOverride(Class::Handle(function.Owner()),
+    return CHA::HasOverride(Class::Handle(isolate(), function.Owner()),
                             call->function_name());
   }
   return true;
@@ -2287,8 +2326,9 @@
       callee_receiver->IsParameter() &&
       (callee_receiver->AsParameter()->index() == 0)) {
     const String& field_name =
-      String::Handle(Field::NameFromGetter(call->function_name()));
-    return CHA::HasOverride(Class::Handle(function.Owner()), field_name);
+      String::Handle(isolate(), Field::NameFromGetter(call->function_name()));
+    return CHA::HasOverride(Class::Handle(isolate(), function.Owner()),
+                            field_name);
   }
   return true;
 }
@@ -2298,23 +2338,24 @@
   ASSERT(call->HasICData());
   const ICData& ic_data = *call->ic_data();
   ASSERT(ic_data.HasOneTarget());
-  Function& target = Function::Handle();
+  Function& target = Function::Handle(isolate(), Function::null());
   GrowableArray<intptr_t> class_ids;
   ic_data.GetCheckAt(0, &class_ids, &target);
   ASSERT(class_ids.length() == 1);
   // Inline implicit instance getter.
   const String& field_name =
-      String::Handle(Field::NameFromGetter(call->function_name()));
-  const Field& field = Field::ZoneHandle(GetField(class_ids[0], field_name));
+      String::Handle(isolate(), Field::NameFromGetter(call->function_name()));
+  const Field& field =
+      Field::ZoneHandle(isolate(), GetField(class_ids[0], field_name));
   ASSERT(!field.IsNull());
 
   if (InstanceCallNeedsClassCheck(call)) {
     AddReceiverCheck(call);
   }
-  LoadFieldInstr* load = new LoadFieldInstr(
-      new Value(call->ArgumentAt(0)),
+  LoadFieldInstr* load = new(isolate()) LoadFieldInstr(
+      new(isolate()) Value(call->ArgumentAt(0)),
       &field,
-      AbstractType::ZoneHandle(field.type()),
+      AbstractType::ZoneHandle(isolate(), field.type()),
       call->token_pos());
   load->set_is_immutable(field.is_final());
   if (field.guarded_cid() != kIllegalCid) {
@@ -2340,14 +2381,14 @@
 }
 
 
-static LoadFieldInstr* BuildLoadStringLength(Definition* str) {
+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 LoadFieldInstr(
-      new Value(str),
+  LoadFieldInstr* load = new(isolate()) LoadFieldInstr(
+      new(isolate()) Value(str),
       String::length_offset(),
-      Type::ZoneHandle(Type::SmiType()),
+      Type::ZoneHandle(isolate(), Type::SmiType()),
       str->token_pos());
   load->set_result_cid(kSmiCid);
   load->set_recognized_kind(MethodRecognizer::kStringBaseLength);
@@ -2362,7 +2403,7 @@
   }
   AddCheckClass(call->ArgumentAt(0),
                 ICData::ZoneHandle(
-                    call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
@@ -2396,17 +2437,17 @@
     }
   }
   if (getter == MethodRecognizer::kFloat32x4GetSignMask) {
-    Simd32x4GetSignMaskInstr* instr = new Simd32x4GetSignMaskInstr(
+    Simd32x4GetSignMaskInstr* instr = new(isolate()) Simd32x4GetSignMaskInstr(
         getter,
-        new Value(call->ArgumentAt(0)),
+        new(isolate()) Value(call->ArgumentAt(0)),
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else if (getter == MethodRecognizer::kFloat32x4ShuffleMix) {
-    Simd32x4ShuffleMixInstr* instr = new Simd32x4ShuffleMixInstr(
+    Simd32x4ShuffleMixInstr* instr = new(isolate()) Simd32x4ShuffleMixInstr(
         getter,
-        new Value(call->ArgumentAt(0)),
-        new Value(call->ArgumentAt(1)),
+        new(isolate()) Value(call->ArgumentAt(0)),
+        new(isolate()) Value(call->ArgumentAt(1)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
@@ -2417,9 +2458,9 @@
            (getter == MethodRecognizer::kFloat32x4ShuffleY) ||
            (getter == MethodRecognizer::kFloat32x4ShuffleZ) ||
            (getter == MethodRecognizer::kFloat32x4ShuffleW));
-    Simd32x4ShuffleInstr* instr = new Simd32x4ShuffleInstr(
+    Simd32x4ShuffleInstr* instr = new(isolate()) Simd32x4ShuffleInstr(
         getter,
-        new Value(call->ArgumentAt(0)),
+        new(isolate()) Value(call->ArgumentAt(0)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
@@ -2437,15 +2478,15 @@
   }
   AddCheckClass(call->ArgumentAt(0),
                 ICData::ZoneHandle(
-                    call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
   if ((getter == MethodRecognizer::kFloat64x2GetX) ||
       (getter == MethodRecognizer::kFloat64x2GetY)) {
-    Simd64x2ShuffleInstr* instr = new Simd64x2ShuffleInstr(
+    Simd64x2ShuffleInstr* instr = new(isolate()) Simd64x2ShuffleInstr(
         getter,
-        new Value(call->ArgumentAt(0)),
+        new(isolate()) Value(call->ArgumentAt(0)),
         0,
         call->deopt_id());
     ReplaceCall(call, instr);
@@ -2463,7 +2504,7 @@
   }
   AddCheckClass(call->ArgumentAt(0),
                 ICData::ZoneHandle(
-                    call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
@@ -2497,33 +2538,33 @@
     }
   }
   if (getter == MethodRecognizer::kInt32x4GetSignMask) {
-    Simd32x4GetSignMaskInstr* instr = new Simd32x4GetSignMaskInstr(
+    Simd32x4GetSignMaskInstr* instr = new(isolate()) Simd32x4GetSignMaskInstr(
         getter,
-        new Value(call->ArgumentAt(0)),
+        new(isolate()) Value(call->ArgumentAt(0)),
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else if (getter == MethodRecognizer::kInt32x4ShuffleMix) {
-    Simd32x4ShuffleMixInstr* instr = new Simd32x4ShuffleMixInstr(
+    Simd32x4ShuffleMixInstr* instr = new(isolate()) Simd32x4ShuffleMixInstr(
         getter,
-        new Value(call->ArgumentAt(0)),
-        new Value(call->ArgumentAt(1)),
+        new(isolate()) Value(call->ArgumentAt(0)),
+        new(isolate()) Value(call->ArgumentAt(1)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else if (getter == MethodRecognizer::kInt32x4Shuffle) {
-    Simd32x4ShuffleInstr* instr = new Simd32x4ShuffleInstr(
+    Simd32x4ShuffleInstr* instr = new(isolate()) Simd32x4ShuffleInstr(
         getter,
-        new Value(call->ArgumentAt(0)),
+        new(isolate()) Value(call->ArgumentAt(0)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else {
-    Int32x4GetFlagInstr* instr = new Int32x4GetFlagInstr(
+    Int32x4GetFlagInstr* instr = new(isolate()) Int32x4GetFlagInstr(
         getter,
-        new Value(call->ArgumentAt(0)),
+        new(isolate()) Value(call->ArgumentAt(0)),
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
@@ -2542,21 +2583,22 @@
   // Type check left.
   AddCheckClass(left,
                 ICData::ZoneHandle(
-                    call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Type check right.
   AddCheckClass(right,
                 ICData::ZoneHandle(
-                    call->ic_data()->AsUnaryClassChecksForArgNr(1)),
+                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(1)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Replace call.
   BinaryFloat32x4OpInstr* float32x4_bin_op =
-      new BinaryFloat32x4OpInstr(op_kind, new Value(left), new Value(right),
-                                 call->deopt_id());
+      new(isolate()) BinaryFloat32x4OpInstr(
+          op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+          call->deopt_id());
   ReplaceCall(call, float32x4_bin_op);
 
   return true;
@@ -2574,21 +2616,22 @@
   // Type check left.
   AddCheckClass(left,
                 ICData::ZoneHandle(
-                    call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Type check right.
   AddCheckClass(right,
-                ICData::ZoneHandle(
+                ICData::ZoneHandle(isolate(),
                     call->ic_data()->AsUnaryClassChecksForArgNr(1)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Replace call.
   BinaryInt32x4OpInstr* int32x4_bin_op =
-      new BinaryInt32x4OpInstr(op_kind, new Value(left), new Value(right),
-                                call->deopt_id());
+      new(isolate()) BinaryInt32x4OpInstr(
+          op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+          call->deopt_id());
   ReplaceCall(call, int32x4_bin_op);
   return true;
 }
@@ -2618,8 +2661,9 @@
                 call);
   // Replace call.
   BinaryFloat64x2OpInstr* float64x2_bin_op =
-      new BinaryFloat64x2OpInstr(op_kind, new Value(left), new Value(right),
-                                 call->deopt_id());
+      new(isolate()) BinaryFloat64x2OpInstr(
+          op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+          call->deopt_id());
   ReplaceCall(call, float64x2_bin_op);
   return true;
 }
@@ -2640,7 +2684,7 @@
     return false;
   }
 
-  const Function& target = Function::Handle(ic_data.GetTargetAt(0));
+  const Function& target = Function::Handle(isolate(), ic_data.GetTargetAt(0));
   if (target.kind() != RawFunction::kImplicitGetter) {
     // Non-implicit getters are inlined like normal methods by conventional
     // inlining in FlowGraphInliner.
@@ -2654,7 +2698,7 @@
 bool FlowGraphOptimizer::TryReplaceInstanceCallWithInline(
     InstanceCallInstr* call) {
   ASSERT(call->HasICData());
-  Function& target = Function::Handle();
+  Function& target = Function::Handle(isolate(), Function::null());
   GrowableArray<intptr_t> class_ids;
   call->ic_data()->GetCheckAt(0, &class_ids, &target);
   const intptr_t receiver_cid = class_ids[0];
@@ -2704,9 +2748,10 @@
     Instruction* cursor) {
 
   cursor = flow_graph()->AppendTo(cursor,
-                                  new CheckSmiInstr(new Value(index),
-                                                    call->deopt_id(),
-                                                    call->token_pos()),
+                                  new(isolate()) CheckSmiInstr(
+                                      new(isolate()) Value(index),
+                                      call->deopt_id(),
+                                      call->token_pos()),
                                   call->env(),
                                   FlowGraph::kEffect);
 
@@ -2715,16 +2760,17 @@
   cursor = flow_graph()->AppendTo(cursor, length, NULL, FlowGraph::kValue);
   // Bounds check.
   cursor = flow_graph()->AppendTo(cursor,
-                                   new CheckArrayBoundInstr(new Value(length),
-                                                            new Value(index),
-                                                            call->deopt_id()),
+                                   new(isolate()) CheckArrayBoundInstr(
+                                       new(isolate()) Value(length),
+                                       new(isolate()) Value(index),
+                                       call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
 
-  LoadIndexedInstr* load_indexed = new LoadIndexedInstr(
-      new Value(str),
-      new Value(index),
-      FlowGraphCompiler::ElementSizeFor(cid),
+  LoadIndexedInstr* load_indexed = new(isolate()) LoadIndexedInstr(
+      new(isolate()) Value(str),
+      new(isolate()) Value(index),
+      Instance::ElementSizeFor(cid),
       cid,
       Isolate::kNoDeoptId,
       call->token_pos());
@@ -2751,9 +2797,9 @@
   Definition* str = call->ArgumentAt(0);
   Definition* index = call->ArgumentAt(1);
 
-  *entry = new TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(call);
+  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                           call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(isolate(), call);
 
   *last = PrepareInlineStringIndexOp(call, cid, str, index, *entry);
 
@@ -2773,14 +2819,14 @@
   Definition* str = call->ArgumentAt(0);
   Definition* index = call->ArgumentAt(1);
 
-  *entry = new TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(call);
+  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                           call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(isolate(), call);
 
   *last = PrepareInlineStringIndexOp(call, cid, str, index, *entry);
 
-  StringFromCharCodeInstr* char_at =
-          new StringFromCharCodeInstr(new Value(*last), cid);
+  StringFromCharCodeInstr* char_at = new(isolate()) StringFromCharCodeInstr(
+      new(isolate()) Value(*last), cid);
 
   flow_graph()->AppendTo(*last, char_at, NULL, FlowGraph::kValue);
   *last = char_at;
@@ -2794,15 +2840,15 @@
     MethodRecognizer::Kind recognized_kind) {
   AddReceiverCheck(call);
   ZoneGrowableArray<Value*>* args =
-      new ZoneGrowableArray<Value*>(call->ArgumentCount());
+      new(isolate()) ZoneGrowableArray<Value*>(call->ArgumentCount());
   for (intptr_t i = 0; i < call->ArgumentCount(); i++) {
-    args->Add(new Value(call->ArgumentAt(i)));
+    args->Add(new(isolate()) Value(call->ArgumentAt(i)));
   }
   InvokeMathCFunctionInstr* invoke =
-      new InvokeMathCFunctionInstr(args,
-                                   call->deopt_id(),
-                                   recognized_kind,
-                                   call->token_pos());
+      new(isolate()) InvokeMathCFunctionInstr(args,
+                                              call->deopt_id(),
+                                              recognized_kind,
+                                              call->token_pos());
   ReplaceCall(call, invoke);
 }
 
@@ -2838,7 +2884,7 @@
     return false;
   }
 
-  Function& target = Function::Handle();
+  Function& target = Function::Handle(isolate(), Function::null());
   GrowableArray<intptr_t> class_ids;
   ic_data.GetCheckAt(0, &class_ids, &target);
   MethodRecognizer::Kind recognized_kind =
@@ -2850,10 +2896,10 @@
     // This is an internal method, no need to check argument types.
     Definition* array = call->ArgumentAt(0);
     Definition* value = call->ArgumentAt(1);
-    StoreInstanceFieldInstr* store = new StoreInstanceFieldInstr(
+    StoreInstanceFieldInstr* store = new(isolate()) StoreInstanceFieldInstr(
         GrowableObjectArray::data_offset(),
-        new Value(array),
-        new Value(value),
+        new(isolate()) Value(array),
+        new(isolate()) Value(value),
         kEmitStoreBarrier,
         call->token_pos());
     ReplaceCall(call, store);
@@ -2867,10 +2913,10 @@
     // range.
     Definition* array = call->ArgumentAt(0);
     Definition* value = call->ArgumentAt(1);
-    StoreInstanceFieldInstr* store = new StoreInstanceFieldInstr(
+    StoreInstanceFieldInstr* store = new(isolate()) StoreInstanceFieldInstr(
         GrowableObjectArray::length_offset(),
-        new Value(array),
-        new Value(value),
+        new(isolate()) Value(array),
+        new(isolate()) Value(value),
         kEmitStoreBarrier,
         call->token_pos());
     ReplaceCall(call, store);
@@ -2892,10 +2938,10 @@
       Definition* str = call->ArgumentAt(0);
       Definition* index = call->ArgumentAt(1);
       Definition* value = call->ArgumentAt(2);
-      StoreIndexedInstr* store_op = new StoreIndexedInstr(
-          new Value(str),
-          new Value(index),
-          new Value(value),
+      StoreIndexedInstr* store_op = new(isolate()) StoreIndexedInstr(
+          new(isolate()) Value(str),
+          new(isolate()) Value(index),
+          new(isolate()) Value(value),
           kNoStoreBarrier,
           1,  // Index scale
           kOneByteStringCid,
@@ -2913,8 +2959,9 @@
       (class_ids[0] == kSmiCid)) {
     AddReceiverCheck(call);
     ReplaceCall(call,
-                new SmiToDoubleInstr(new Value(call->ArgumentAt(0)),
-                                     call->token_pos()));
+                new(isolate()) SmiToDoubleInstr(
+                    new(isolate()) Value(call->ArgumentAt(0)),
+                    call->token_pos()));
     return true;
   }
 
@@ -2931,10 +2978,12 @@
         Definition* d2i_instr = NULL;
         if (ic_data.HasDeoptReason(ICData::kDeoptDoubleToSmi)) {
           // Do not repeatedly deoptimize because result didn't fit into Smi.
-          d2i_instr = new DoubleToIntegerInstr(new Value(input), call);
+          d2i_instr =  new(isolate()) DoubleToIntegerInstr(
+              new(isolate()) Value(input), call);
         } else {
           // Optimistically assume result fits into Smi.
-          d2i_instr = new DoubleToSmiInstr(new Value(input), call->deopt_id());
+          d2i_instr = new(isolate()) DoubleToSmiInstr(
+              new(isolate()) Value(input), call->deopt_id());
         }
         ReplaceCall(call, d2i_instr);
         return true;
@@ -2951,8 +3000,9 @@
         } else {
           AddReceiverCheck(call);
           DoubleToDoubleInstr* d2d_instr =
-              new DoubleToDoubleInstr(new Value(call->ArgumentAt(0)),
-                                      recognized_kind, call->deopt_id());
+              new(isolate()) DoubleToDoubleInstr(
+                  new(isolate()) Value(call->ArgumentAt(0)),
+                  recognized_kind, call->deopt_id());
           ReplaceCall(call, d2d_instr);
         }
         return true;
@@ -3069,9 +3119,10 @@
         return false;
       }
       BinarySmiOpInstr* left_shift =
-          new BinarySmiOpInstr(Token::kSHL,
-                               new Value(value), new Value(count),
-                               call->deopt_id(), call->token_pos());
+          new(isolate()) BinarySmiOpInstr(Token::kSHL,
+                                          new(isolate()) Value(value),
+                                          new(isolate()) Value(count),
+                                          call->deopt_id(), call->token_pos());
       left_shift->set_is_truncating(true);
       if ((kBitsPerWord == 32) && (mask_value == 0xffffffffLL)) {
         // No BIT_AND operation needed.
@@ -3079,29 +3130,34 @@
       } else {
         InsertBefore(call, left_shift, call->env(), FlowGraph::kValue);
         BinarySmiOpInstr* bit_and =
-            new BinarySmiOpInstr(Token::kBIT_AND,
-                                 new Value(left_shift), new Value(int32_mask),
-                                 call->deopt_id(), call->token_pos());
+            new(isolate()) BinarySmiOpInstr(Token::kBIT_AND,
+                                            new(isolate()) Value(left_shift),
+                                            new(isolate()) Value(int32_mask),
+                                            call->deopt_id(),
+                                            call->token_pos());
         ReplaceCall(call, bit_and);
       }
       return true;
     }
 
     if (HasTwoMintOrSmi(ic_data) &&
-        HasOnlyOneSmi(ICData::Handle(ic_data.AsUnaryClassChecksForArgNr(1)))) {
+        HasOnlyOneSmi(ICData::Handle(isolate(),
+                                     ic_data.AsUnaryClassChecksForArgNr(1)))) {
       if (!FlowGraphCompiler::SupportsUnboxedMints() ||
           ic_data.HasDeoptReason(ICData::kDeoptShiftMintOp)) {
         return false;
       }
       ShiftMintOpInstr* left_shift =
-          new ShiftMintOpInstr(Token::kSHL,
-                               new Value(value), new Value(count),
-                               call->deopt_id());
+          new(isolate()) ShiftMintOpInstr(Token::kSHL,
+                                          new(isolate()) Value(value),
+                                          new(isolate()) Value(count),
+                                          call->deopt_id());
       InsertBefore(call, left_shift, call->env(), FlowGraph::kValue);
       BinaryMintOpInstr* bit_and =
-          new BinaryMintOpInstr(Token::kBIT_AND,
-                                new Value(left_shift), new Value(int32_mask),
-                                call->deopt_id());
+          new(isolate()) BinaryMintOpInstr(Token::kBIT_AND,
+                                           new(isolate()) Value(left_shift),
+                                           new(isolate()) Value(int32_mask),
+                                           call->deopt_id());
       ReplaceCall(call, bit_and);
       return true;
     }
@@ -3117,34 +3173,36 @@
     return false;
   }
   if (recognized_kind == MethodRecognizer::kFloat32x4Zero) {
-    Float32x4ZeroInstr* zero = new Float32x4ZeroInstr(call->deopt_id());
+    Float32x4ZeroInstr* zero =
+        new(isolate()) Float32x4ZeroInstr(call->deopt_id());
     ReplaceCall(call, zero);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4Splat) {
     Float32x4SplatInstr* splat =
-        new Float32x4SplatInstr(new Value(call->ArgumentAt(1)),
-                                call->deopt_id());
+        new(isolate()) Float32x4SplatInstr(
+            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, splat);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4Constructor) {
     Float32x4ConstructorInstr* con =
-        new Float32x4ConstructorInstr(new Value(call->ArgumentAt(1)),
-                                      new Value(call->ArgumentAt(2)),
-                                      new Value(call->ArgumentAt(3)),
-                                      new Value(call->ArgumentAt(4)),
-                                      call->deopt_id());
+        new(isolate()) Float32x4ConstructorInstr(
+            new(isolate()) Value(call->ArgumentAt(1)),
+            new(isolate()) Value(call->ArgumentAt(2)),
+            new(isolate()) Value(call->ArgumentAt(3)),
+            new(isolate()) Value(call->ArgumentAt(4)),
+            call->deopt_id());
     ReplaceCall(call, con);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4FromInt32x4Bits) {
     Int32x4ToFloat32x4Instr* cast =
-        new Int32x4ToFloat32x4Instr(new Value(call->ArgumentAt(1)),
-                                    call->deopt_id());
+        new(isolate()) Int32x4ToFloat32x4Instr(
+            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4FromFloat64x2) {
     Float64x2ToFloat32x4Instr* cast =
-        new Float64x2ToFloat32x4Instr(new Value(call->ArgumentAt(1)),
-                                      call->deopt_id());
+        new(isolate()) Float64x2ToFloat32x4Instr(
+            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   }
@@ -3159,26 +3217,28 @@
     return false;
   }
   if (recognized_kind == MethodRecognizer::kFloat64x2Zero) {
-    Float64x2ZeroInstr* zero = new Float64x2ZeroInstr(call->deopt_id());
+    Float64x2ZeroInstr* zero =
+        new(isolate()) Float64x2ZeroInstr(call->deopt_id());
     ReplaceCall(call, zero);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat64x2Splat) {
     Float64x2SplatInstr* splat =
-        new Float64x2SplatInstr(new Value(call->ArgumentAt(1)),
-                                call->deopt_id());
+        new(isolate()) Float64x2SplatInstr(
+            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, splat);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat64x2Constructor) {
     Float64x2ConstructorInstr* con =
-        new Float64x2ConstructorInstr(new Value(call->ArgumentAt(1)),
-                                      new Value(call->ArgumentAt(2)),
-                                      call->deopt_id());
+        new(isolate()) Float64x2ConstructorInstr(
+            new(isolate()) Value(call->ArgumentAt(1)),
+            new(isolate()) Value(call->ArgumentAt(2)),
+            call->deopt_id());
     ReplaceCall(call, con);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat64x2FromFloat32x4) {
     Float32x4ToFloat64x2Instr* cast =
-        new Float32x4ToFloat64x2Instr(new Value(call->ArgumentAt(1)),
-                                    call->deopt_id());
+        new(isolate()) Float32x4ToFloat64x2Instr(
+            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   }
@@ -3193,18 +3253,19 @@
     return false;
   }
   if (recognized_kind == MethodRecognizer::kInt32x4BoolConstructor) {
-    Int32x4BoolConstructorInstr* con = new Int32x4BoolConstructorInstr(
-        new Value(call->ArgumentAt(1)),
-        new Value(call->ArgumentAt(2)),
-        new Value(call->ArgumentAt(3)),
-        new Value(call->ArgumentAt(4)),
-        call->deopt_id());
+    Int32x4BoolConstructorInstr* con =
+        new(isolate()) Int32x4BoolConstructorInstr(
+            new(isolate()) Value(call->ArgumentAt(1)),
+            new(isolate()) Value(call->ArgumentAt(2)),
+            new(isolate()) Value(call->ArgumentAt(3)),
+            new(isolate()) Value(call->ArgumentAt(4)),
+            call->deopt_id());
     ReplaceCall(call, con);
     return true;
   } else if (recognized_kind == MethodRecognizer::kInt32x4FromFloat32x4Bits) {
     Float32x4ToInt32x4Instr* cast =
-        new Float32x4ToInt32x4Instr(new Value(call->ArgumentAt(1)),
-                                     call->deopt_id());
+        new(isolate()) Float32x4ToInt32x4Instr(
+            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   }
@@ -3240,14 +3301,18 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
+                        isolate(),
                         call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       // Replace call.
       Float32x4ComparisonInstr* cmp =
-          new Float32x4ComparisonInstr(recognized_kind, new Value(left),
-                                       new Value(right), call->deopt_id());
+          new(isolate()) Float32x4ComparisonInstr(
+              recognized_kind,
+              new(isolate()) Value(left),
+              new(isolate()) Value(right),
+              call->deopt_id());
       ReplaceCall(call, cmp);
       return true;
     }
@@ -3258,13 +3323,17 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
+                        isolate(),
                         call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float32x4MinMaxInstr* minmax =
-          new Float32x4MinMaxInstr(recognized_kind, new Value(left),
-                                   new Value(right), call->deopt_id());
+          new(isolate()) Float32x4MinMaxInstr(
+              recognized_kind,
+              new(isolate()) Value(left),
+              new(isolate()) Value(right),
+              call->deopt_id());
       ReplaceCall(call, minmax);
       return true;
     }
@@ -3274,6 +3343,7 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
+                        isolate(),
                         call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
@@ -3282,8 +3352,11 @@
       // this is done so that the double value is loaded into the output
       // register and can be destroyed.
       Float32x4ScaleInstr* scale =
-          new Float32x4ScaleInstr(recognized_kind, new Value(right),
-                                  new Value(left), call->deopt_id());
+          new(isolate()) Float32x4ScaleInstr(
+              recognized_kind,
+              new(isolate()) Value(right),
+              new(isolate()) Value(left),
+              call->deopt_id());
       ReplaceCall(call, scale);
       return true;
     }
@@ -3293,13 +3366,16 @@
       Definition* left = call->ArgumentAt(0);
       AddCheckClass(left,
                     ICData::ZoneHandle(
+                        isolate(),
                         call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float32x4SqrtInstr* sqrt =
-          new Float32x4SqrtInstr(recognized_kind, new Value(left),
-                                 call->deopt_id());
+          new(isolate()) Float32x4SqrtInstr(
+              recognized_kind,
+              new(isolate()) Value(left),
+              call->deopt_id());
       ReplaceCall(call, sqrt);
       return true;
     }
@@ -3312,14 +3388,16 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
+                        isolate(),
                         call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Float32x4WithInstr* with = new Float32x4WithInstr(recognized_kind,
-                                                        new Value(left),
-                                                        new Value(right),
-                                                        call->deopt_id());
+      Float32x4WithInstr* with = new(isolate()) Float32x4WithInstr(
+          recognized_kind,
+          new(isolate()) Value(left),
+          new(isolate()) Value(right),
+          call->deopt_id());
       ReplaceCall(call, with);
       return true;
     }
@@ -3329,13 +3407,14 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
+                        isolate(),
                         call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float32x4ZeroArgInstr* zeroArg =
-          new Float32x4ZeroArgInstr(recognized_kind, new Value(left),
-                                    call->deopt_id());
+          new(isolate()) Float32x4ZeroArgInstr(
+              recognized_kind, new(isolate()) Value(left), call->deopt_id());
       ReplaceCall(call, zeroArg);
       return true;
     }
@@ -3346,14 +3425,16 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
+                        isolate(),
                         call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Float32x4ClampInstr* clamp = new Float32x4ClampInstr(new Value(left),
-                                                           new Value(lower),
-                                                           new Value(upper),
-                                                           call->deopt_id());
+      Float32x4ClampInstr* clamp = new(isolate()) Float32x4ClampInstr(
+          new(isolate()) Value(left),
+          new(isolate()) Value(lower),
+          new(isolate()) Value(upper),
+          call->deopt_id());
       ReplaceCall(call, clamp);
       return true;
     }
@@ -3388,13 +3469,14 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
+                        isolate(),
                         call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float64x2ZeroArgInstr* zeroArg =
-          new Float64x2ZeroArgInstr(recognized_kind, new Value(left),
-                                    call->deopt_id());
+          new(isolate()) Float64x2ZeroArgInstr(
+              recognized_kind, new(isolate()) Value(left), call->deopt_id());
       ReplaceCall(call, zeroArg);
       return true;
     }
@@ -3408,13 +3490,17 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
+                        isolate(),
                         call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float64x2OneArgInstr* zeroArg =
-          new Float64x2OneArgInstr(recognized_kind, new Value(left),
-                                   new Value(right), call->deopt_id());
+          new(isolate()) Float64x2OneArgInstr(
+              recognized_kind,
+              new(isolate()) Value(left),
+              new(isolate()) Value(right),
+              call->deopt_id());
       ReplaceCall(call, zeroArg);
       return true;
     }
@@ -3450,14 +3536,15 @@
       // Type check left.
       AddCheckClass(mask,
                     ICData::ZoneHandle(
+                        isolate(),
                         call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Int32x4SelectInstr* select = new Int32x4SelectInstr(
-          new Value(mask),
-          new Value(trueValue),
-          new Value(falseValue),
+      Int32x4SelectInstr* select = new(isolate()) Int32x4SelectInstr(
+          new(isolate()) Value(mask),
+          new(isolate()) Value(trueValue),
+          new(isolate()) Value(falseValue),
           call->deopt_id());
       ReplaceCall(call, select);
       return true;
@@ -3471,14 +3558,15 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
+                        isolate(),
                         call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Int32x4SetFlagInstr* setFlag = new Int32x4SetFlagInstr(
+      Int32x4SetFlagInstr* setFlag = new(isolate()) Int32x4SetFlagInstr(
           recognized_kind,
-          new Value(left),
-          new Value(flag),
+          new(isolate()) Value(left),
+          new(isolate()) Value(flag),
           call->deopt_id());
       ReplaceCall(call, setFlag);
       return true;
@@ -3499,9 +3587,9 @@
   ASSERT(array_cid != kIllegalCid);
   Definition* array = receiver;
   Definition* index = call->ArgumentAt(1);
-  *entry = new TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(call);
+  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                           call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(isolate(), call);
   Instruction* cursor = *entry;
 
   array_cid = PrepareInlineByteArrayViewOp(call,
@@ -3520,12 +3608,12 @@
         Isolate::kNoDeoptId : call->deopt_id();
   }
 
-  *last = new LoadIndexedInstr(new Value(array),
-                               new Value(index),
-                               1,
-                               view_cid,
-                               deopt_id,
-                               call->token_pos());
+  *last = new(isolate()) LoadIndexedInstr(new(isolate()) Value(array),
+                                          new(isolate()) Value(index),
+                                          1,
+                                          view_cid,
+                                          deopt_id,
+                                          call->token_pos());
   cursor = flow_graph()->AppendTo(
       cursor,
       *last,
@@ -3533,7 +3621,8 @@
       FlowGraph::kValue);
 
   if (view_cid == kTypedDataFloat32ArrayCid) {
-    *last = new FloatToDoubleInstr(new Value(*last), deopt_id);
+    *last = new(isolate()) FloatToDoubleInstr(
+        new(isolate()) Value(*last), deopt_id);
     flow_graph()->AppendTo(cursor,
                            *last,
                            deopt_id != Isolate::kNoDeoptId ? call->env() : NULL,
@@ -3554,9 +3643,9 @@
   ASSERT(array_cid != kIllegalCid);
   Definition* array = receiver;
   Definition* index = call->ArgumentAt(1);
-  *entry = new TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(call);
+  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                           call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(isolate(), call);
   Instruction* cursor = *entry;
 
   array_cid = PrepareInlineByteArrayViewOp(call,
@@ -3576,7 +3665,7 @@
     i_call = call->AsInstanceCall();
   }
   ASSERT(i_call != NULL);
-  ICData& value_check = ICData::ZoneHandle();
+  ICData& value_check = ICData::ZoneHandle(isolate(), ICData::null());
   switch (view_cid) {
     case kTypedDataInt8ArrayCid:
     case kTypedDataUint8ArrayCid:
@@ -3651,8 +3740,8 @@
   }
 
   if (view_cid == kTypedDataFloat32ArrayCid) {
-    stored_value =
-        new DoubleToFloatInstr(new Value(stored_value), call->deopt_id());
+    stored_value = new(isolate()) DoubleToFloatInstr(
+        new(isolate()) Value(stored_value), call->deopt_id());
     cursor = flow_graph()->AppendTo(cursor,
                                     stored_value,
                                     NULL,
@@ -3660,14 +3749,14 @@
   }
 
   StoreBarrierType needs_store_barrier = kNoStoreBarrier;
-  *last = new StoreIndexedInstr(new Value(array),
-                                new Value(index),
-                                new Value(stored_value),
-                                needs_store_barrier,
-                                1,  // Index scale
-                                view_cid,
-                                call->deopt_id(),
-                                call->token_pos());
+  *last = new(isolate()) StoreIndexedInstr(new(isolate()) Value(array),
+                                           new(isolate()) Value(index),
+                                           new(isolate()) Value(stored_value),
+                                           needs_store_barrier,
+                                           1,  // Index scale
+                                           view_cid,
+                                           call->deopt_id(),
+                                           call->token_pos());
 
   flow_graph()->AppendTo(cursor,
                          *last,
@@ -3688,17 +3777,19 @@
     Instruction** cursor) {
   // Insert byte_index smi check.
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new CheckSmiInstr(new Value(byte_index),
-                                                     call->deopt_id(),
-                                                     call->token_pos()),
+                                   new(isolate()) CheckSmiInstr(
+                                       new(isolate()) Value(byte_index),
+                                       call->deopt_id(),
+                                       call->token_pos()),
                                    call->env(),
                                    FlowGraph::kEffect);
 
   LoadFieldInstr* length =
-      new LoadFieldInstr(new Value(*array),
-                         CheckArrayBoundInstr::LengthOffsetFor(array_cid),
-                         Type::ZoneHandle(Type::SmiType()),
-                         call->token_pos());
+      new(isolate()) LoadFieldInstr(
+          new(isolate()) Value(*array),
+          CheckArrayBoundInstr::LengthOffsetFor(array_cid),
+          Type::ZoneHandle(isolate(), Type::SmiType()),
+          call->token_pos());
   length->set_is_immutable(true);
   length->set_result_cid(kSmiCid);
   length->set_recognized_kind(
@@ -3708,51 +3799,52 @@
                                    NULL,
                                    FlowGraph::kValue);
 
-  intptr_t element_size = FlowGraphCompiler::ElementSizeFor(array_cid);
+  intptr_t element_size = Instance::ElementSizeFor(array_cid);
   ConstantInstr* bytes_per_element =
-      flow_graph()->GetConstant(Smi::Handle(Smi::New(element_size)));
+      flow_graph()->GetConstant(Smi::Handle(isolate(), Smi::New(element_size)));
   BinarySmiOpInstr* len_in_bytes =
-      new BinarySmiOpInstr(Token::kMUL,
-                           new Value(length),
-                           new Value(bytes_per_element),
-                           call->deopt_id(), call->token_pos());
+      new(isolate()) BinarySmiOpInstr(Token::kMUL,
+                                      new(isolate()) Value(length),
+                                      new(isolate()) Value(bytes_per_element),
+                                      call->deopt_id(), call->token_pos());
   *cursor = flow_graph()->AppendTo(*cursor, len_in_bytes, call->env(),
                                    FlowGraph::kValue);
 
   ConstantInstr* length_adjustment =
-      flow_graph()->GetConstant(Smi::Handle(Smi::New(
-          FlowGraphCompiler::ElementSizeFor(view_cid) - 1)));
+      flow_graph()->GetConstant(Smi::Handle(isolate(), Smi::New(
+          Instance::ElementSizeFor(view_cid) - 1)));
   // adjusted_length = len_in_bytes - (element_size - 1).
   BinarySmiOpInstr* adjusted_length =
-      new BinarySmiOpInstr(Token::kSUB,
-                           new Value(len_in_bytes),
-                           new Value(length_adjustment),
-                           call->deopt_id(), call->token_pos());
+      new(isolate()) BinarySmiOpInstr(Token::kSUB,
+                                      new(isolate()) Value(len_in_bytes),
+                                      new(isolate()) 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 = flow_graph()->GetConstant(Smi::Handle(Smi::New(0)));
+  ConstantInstr* zero =
+      flow_graph()->GetConstant(Smi::Handle(isolate(), Smi::New(0)));
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new CheckArrayBoundInstr(
-                                       new Value(adjusted_length),
-                                       new Value(zero),
+                                   new(isolate()) CheckArrayBoundInstr(
+                                       new(isolate()) Value(adjusted_length),
+                                       new(isolate()) Value(zero),
                                        call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
   // Check 0 <= byte_index < adjusted_length.
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new CheckArrayBoundInstr(
-                                       new Value(adjusted_length),
-                                       new Value(byte_index),
+                                   new(isolate()) CheckArrayBoundInstr(
+                                       new(isolate()) Value(adjusted_length),
+                                       new(isolate()) Value(byte_index),
                                        call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
 
   if (RawObject::IsExternalTypedDataClassId(array_cid)) {
     LoadUntaggedInstr* elements =
-        new LoadUntaggedInstr(new Value(*array),
-                              ExternalTypedData::data_offset());
+        new(isolate()) LoadUntaggedInstr(new(isolate()) Value(*array),
+                                         ExternalTypedData::data_offset());
     *cursor = flow_graph()->AppendTo(*cursor,
                                      elements,
                                      NULL,
@@ -3810,7 +3902,7 @@
   if (!type.IsInstantiated() || type.IsMalformedOrMalbounded()) {
     return Bool::null();
   }
-  const Class& type_class = Class::Handle(type.type_class());
+  const Class& type_class = Class::Handle(isolate(), type.type_class());
   const intptr_t num_type_args = type_class.NumTypeArguments();
   if (num_type_args > 0) {
     // Only raw types can be directly compared, thus disregarding type
@@ -3818,7 +3910,7 @@
     const intptr_t num_type_params = type_class.NumTypeParameters();
     const intptr_t from_index = num_type_args - num_type_params;
     const TypeArguments& type_arguments =
-        TypeArguments::Handle(type.arguments());
+        TypeArguments::Handle(isolate(), type.arguments());
     const bool is_raw_type = type_arguments.IsNull() ||
         type_arguments.IsRaw(from_index, num_type_params);
     if (!is_raw_type) {
@@ -3827,9 +3919,9 @@
     }
   }
 
-  const ClassTable& class_table = *Isolate::Current()->class_table();
-  Bool& prev = Bool::Handle();
-  Class& cls = Class::Handle();
+  const ClassTable& class_table = *isolate()->class_table();
+  Bool& prev = Bool::Handle(isolate(), Bool::null());
+  Class& cls = Class::Handle(isolate(), Class::null());
 
   bool results_differ = false;
   for (int i = 0; i < ic_data.NumberOfChecks(); i++) {
@@ -3837,10 +3929,11 @@
     if (cls.NumTypeArguments() > 0) {
       return Bool::null();
     }
-    const bool is_subtype = cls.IsSubtypeOf(TypeArguments::Handle(),
-                                            type_class,
-                                            TypeArguments::Handle(),
-                                            NULL);
+    const bool is_subtype = cls.IsSubtypeOf(
+        TypeArguments::Handle(isolate(), TypeArguments::null()),
+        type_class,
+        TypeArguments::Handle(isolate(), TypeArguments::null()),
+        NULL);
     results->Add(cls.id());
     results->Add(is_subtype);
     if (prev.IsNull()) {
@@ -3951,7 +4044,7 @@
   const bool negate = Bool::Cast(
       call->ArgumentAt(4)->OriginalDefinition()->AsConstant()->value()).value();
   const ICData& unary_checks =
-      ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecks());
+      ICData::ZoneHandle(isolate(), call->ic_data()->AsUnaryClassChecks());
   if (FLAG_warn_on_javascript_compatibility &&
       !unary_checks.IssuedJSWarning() &&
       (type.IsIntType() || type.IsDoubleType() || !type.IsInstantiated())) {
@@ -3963,16 +4056,18 @@
   }
   if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
     ZoneGrowableArray<intptr_t>* results =
-        new ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
+        new(isolate()) ZoneGrowableArray<intptr_t>(
+            unary_checks.NumberOfChecks() * 2);
     Bool& as_bool =
-        Bool::ZoneHandle(InstanceOfAsBool(unary_checks, type, results));
+        Bool::ZoneHandle(isolate(),
+                         InstanceOfAsBool(unary_checks, type, results));
     if (as_bool.IsNull()) {
       if (results->length() == unary_checks.NumberOfChecks() * 2) {
         const bool can_deopt = TryExpandTestCidsResult(results, type);
-        TestCidsInstr* test_cids = new TestCidsInstr(
+        TestCidsInstr* test_cids = new(isolate()) TestCidsInstr(
             call->token_pos(),
             negate ? Token::kISNOT : Token::kIS,
-            new Value(left),
+            new(isolate()) Value(left),
             *results,
             can_deopt ? call->deopt_id() : Isolate::kNoDeoptId);
         // Remove type.
@@ -4000,33 +4095,35 @@
   }
 
   if (TypeCheckAsClassEquality(type)) {
-    LoadClassIdInstr* left_cid = new LoadClassIdInstr(new Value(left));
+    LoadClassIdInstr* left_cid =
+        new(isolate()) LoadClassIdInstr(new(isolate()) Value(left));
     InsertBefore(call,
                  left_cid,
                  NULL,
                  FlowGraph::kValue);
-    const intptr_t type_cid = Class::Handle(type.type_class()).id();
+    const intptr_t type_cid = Class::Handle(isolate(), type.type_class()).id();
     ConstantInstr* cid =
-        flow_graph()->GetConstant(Smi::Handle(Smi::New(type_cid)));
+        flow_graph()->GetConstant(Smi::Handle(isolate(), Smi::New(type_cid)));
 
     StrictCompareInstr* check_cid =
-        new StrictCompareInstr(call->token_pos(),
-                               negate ? Token::kNE_STRICT : Token::kEQ_STRICT,
-                               new Value(left_cid),
-                               new Value(cid),
-                               false);  // No number check.
+        new(isolate()) StrictCompareInstr(
+            call->token_pos(),
+            negate ? Token::kNE_STRICT : Token::kEQ_STRICT,
+            new(isolate()) Value(left_cid),
+            new(isolate()) Value(cid),
+            false);  // No number check.
     ReplaceCall(call, check_cid);
     return;
   }
 
   InstanceOfInstr* instance_of =
-      new InstanceOfInstr(call->token_pos(),
-                          new Value(left),
-                          new Value(instantiator),
-                          new Value(type_args),
-                          type,
-                          negate,
-                          call->deopt_id());
+      new(isolate()) InstanceOfInstr(call->token_pos(),
+                                     new(isolate()) Value(left),
+                                     new(isolate()) Value(instantiator),
+                                     new(isolate()) Value(type_args),
+                                     type,
+                                     negate,
+                                     call->deopt_id());
   ReplaceCall(call, instance_of);
 }
 
@@ -4041,7 +4138,7 @@
       AbstractType::Cast(call->ArgumentAt(3)->AsConstant()->value());
   ASSERT(!type.IsMalformedOrMalbounded());
   const ICData& unary_checks =
-      ICData::ZoneHandle(call->ic_data()->AsUnaryClassChecks());
+      ICData::ZoneHandle(isolate(), call->ic_data()->AsUnaryClassChecks());
   if (FLAG_warn_on_javascript_compatibility &&
       !unary_checks.IssuedJSWarning() &&
       (type.IsIntType() || type.IsDoubleType() || !type.IsInstantiated())) {
@@ -4053,9 +4150,10 @@
   }
   if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
     ZoneGrowableArray<intptr_t>* results =
-        new ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
-    const Bool& as_bool =
-        Bool::ZoneHandle(InstanceOfAsBool(unary_checks, type, results));
+        new(isolate()) ZoneGrowableArray<intptr_t>(
+            unary_checks.NumberOfChecks() * 2);
+    const Bool& as_bool = Bool::ZoneHandle(isolate(),
+        InstanceOfAsBool(unary_checks, type, results));
     if (as_bool.raw() == Bool::True().raw()) {
       AddReceiverCheck(call);
       // Remove the original push arguments.
@@ -4071,15 +4169,15 @@
       return;
     }
   }
-  const String& dst_name = String::ZoneHandle(
+  const String& dst_name = String::ZoneHandle(isolate(),
       Symbols::New(Exceptions::kCastErrorDstName));
   AssertAssignableInstr* assert_as =
-      new AssertAssignableInstr(call->token_pos(),
-                                new Value(left),
-                                new Value(instantiator),
-                                new Value(type_args),
-                                type,
-                                dst_name);
+      new(isolate()) AssertAssignableInstr(call->token_pos(),
+                                           new(isolate()) Value(left),
+                                           new(isolate()) Value(instantiator),
+                                           new(isolate()) Value(type_args),
+                                           type,
+                                           dst_name);
   // Newly inserted instructions that can deoptimize or throw an exception
   // must have a deoptimization id that is valid for lookup in the unoptimized
   // code.
@@ -4108,7 +4206,7 @@
   }
 
   const ICData& unary_checks =
-      ICData::ZoneHandle(instr->ic_data()->AsUnaryClassChecks());
+      ICData::ZoneHandle(isolate(), instr->ic_data()->AsUnaryClassChecks());
 
   intptr_t max_checks = (op_kind == Token::kEQ)
       ? FLAG_max_equality_polymorphic_checks
@@ -4160,21 +4258,23 @@
   if (has_one_target) {
     // Check if the single target is a polymorphic target, if it is,
     // we don't have one target.
-    const Function& target = Function::Handle(unary_checks.GetTargetAt(0));
+    const Function& target =
+        Function::Handle(isolate(), unary_checks.GetTargetAt(0));
     const bool polymorphic_target = MethodRecognizer::PolymorphicTarget(target);
     has_one_target = !polymorphic_target;
   }
 
   if (has_one_target) {
     const bool is_method_extraction =
-        Function::Handle(unary_checks.GetTargetAt(0)).IsMethodExtractor();
+        Function::Handle(isolate(),
+                         unary_checks.GetTargetAt(0)).IsMethodExtractor();
 
     if ((is_method_extraction && !MethodExtractorNeedsClassCheck(instr)) ||
         (!is_method_extraction && !InstanceCallNeedsClassCheck(instr))) {
       const bool call_with_checks = false;
       PolymorphicInstanceCallInstr* call =
-          new PolymorphicInstanceCallInstr(instr, unary_checks,
-                                           call_with_checks);
+          new(isolate()) PolymorphicInstanceCallInstr(instr, unary_checks,
+                                                      call_with_checks);
       instr->ReplaceWith(call, current_iterator());
       return;
     }
@@ -4191,8 +4291,8 @@
       call_with_checks = true;
     }
     PolymorphicInstanceCallInstr* call =
-        new PolymorphicInstanceCallInstr(instr, unary_checks,
-                                         call_with_checks);
+        new(isolate()) PolymorphicInstanceCallInstr(instr, unary_checks,
+                                                    call_with_checks);
     instr->ReplaceWith(call, current_iterator());
   }
 }
@@ -4221,9 +4321,9 @@
   }
   if (unary_kind != MathUnaryInstr::kIllegal) {
     MathUnaryInstr* math_unary =
-        new MathUnaryInstr(unary_kind,
-                           new Value(call->ArgumentAt(0)),
-                           call->deopt_id());
+        new(isolate()) MathUnaryInstr(unary_kind,
+                                      new(isolate()) Value(call->ArgumentAt(0)),
+                                      call->deopt_id());
     ReplaceCall(call, math_unary);
   } else if ((recognized_kind == MethodRecognizer::kFloat32x4Zero) ||
              (recognized_kind == MethodRecognizer::kFloat32x4Splat) ||
@@ -4262,14 +4362,14 @@
         result_cid = kSmiCid;
       }
       if (result_cid != kIllegalCid) {
-        MathMinMaxInstr* min_max = new MathMinMaxInstr(
+        MathMinMaxInstr* min_max = new(isolate()) MathMinMaxInstr(
             recognized_kind,
-            new Value(call->ArgumentAt(0)),
-            new Value(call->ArgumentAt(1)),
+            new(isolate()) Value(call->ArgumentAt(0)),
+            new(isolate()) Value(call->ArgumentAt(1)),
             call->deopt_id(),
             result_cid);
         const ICData& unary_checks =
-            ICData::ZoneHandle(ic_data.AsUnaryClassChecks());
+            ICData::ZoneHandle(isolate(), ic_data.AsUnaryClassChecks());
         AddCheckClass(min_max->left()->definition(),
                       unary_checks,
                       call->deopt_id(),
@@ -4288,48 +4388,51 @@
     // InvokeMathCFunctionInstr requires unboxed doubles. UnboxDouble
     // instructions contain type checks and conversions to double.
     ZoneGrowableArray<Value*>* args =
-        new ZoneGrowableArray<Value*>(call->ArgumentCount());
+        new(isolate()) ZoneGrowableArray<Value*>(call->ArgumentCount());
     for (intptr_t i = 0; i < call->ArgumentCount(); i++) {
-      args->Add(new Value(call->ArgumentAt(i)));
+      args->Add(new(isolate()) Value(call->ArgumentAt(i)));
     }
     InvokeMathCFunctionInstr* invoke =
-        new InvokeMathCFunctionInstr(args,
-                                     call->deopt_id(),
-                                     recognized_kind,
-                                     call->token_pos());
+        new(isolate()) InvokeMathCFunctionInstr(args,
+                                                call->deopt_id(),
+                                                recognized_kind,
+                                                call->token_pos());
     ReplaceCall(call, invoke);
   } else if (recognized_kind == MethodRecognizer::kObjectArrayConstructor) {
-    Value* type = new Value(call->ArgumentAt(0));
-    Value* num_elements = new Value(call->ArgumentAt(1));
+    Value* type = new(isolate()) Value(call->ArgumentAt(0));
+    Value* num_elements = new(isolate()) Value(call->ArgumentAt(1));
     CreateArrayInstr* create_array =
-        new CreateArrayInstr(call->token_pos(), type, num_elements);
+        new(isolate()) CreateArrayInstr(call->token_pos(), type, num_elements);
     ReplaceCall(call, create_array);
   } else if (Library::PrivateCoreLibName(Symbols::ClassId()).Equals(
-      String::Handle(call->function().name()))) {
+      String::Handle(isolate(), call->function().name()))) {
     // Check for core library get:_classId.
-    intptr_t cid = Class::Handle(call->function().Owner()).id();
+    intptr_t cid = Class::Handle(isolate(), call->function().Owner()).id();
     // Currently only implemented for a subset of classes.
     ASSERT((cid == kOneByteStringCid) || (cid == kTwoByteStringCid) ||
            (cid == kExternalOneByteStringCid) ||
            (cid == kGrowableObjectArrayCid) ||
            (cid == kImmutableArrayCid) || (cid == kArrayCid));
-    ConstantInstr* cid_instr = new ConstantInstr(Smi::Handle(Smi::New(cid)));
+    ConstantInstr* cid_instr =
+        new(isolate()) ConstantInstr(Smi::Handle(isolate(), Smi::New(cid)));
     ReplaceCall(call, cid_instr);
   } else if (call->function().IsFactory()) {
-    const Class& function_class = Class::Handle(call->function().Owner());
+    const Class& function_class =
+        Class::Handle(isolate(), call->function().Owner());
     if ((function_class.library() == Library::CoreLibrary()) ||
         (function_class.library() == Library::TypedDataLibrary())) {
       intptr_t cid = FactoryRecognizer::ResultCid(call->function());
       switch (cid) {
         case kArrayCid: {
-          Value* type = new Value(call->ArgumentAt(0));
-          Value* num_elements = new Value(call->ArgumentAt(1));
+          Value* type = new(isolate()) Value(call->ArgumentAt(0));
+          Value* num_elements = new(isolate()) Value(call->ArgumentAt(1));
           if (num_elements->BindsToConstant() &&
               num_elements->BoundConstant().IsSmi()) {
             intptr_t length = Smi::Cast(num_elements->BoundConstant()).Value();
             if (length >= 0 && length <= Array::kMaxElements) {
               CreateArrayInstr* create_array =
-                  new CreateArrayInstr(call->token_pos(), type, num_elements);
+                  new(isolate()) CreateArrayInstr(
+                      call->token_pos(), type, num_elements);
               ReplaceCall(call, create_array);
             }
           }
@@ -4351,13 +4454,13 @@
     // usage count of at least 1/kGetterSetterRatio of the getter usage count.
     // This is to avoid unboxing fields where the setter is never or rarely
     // executed.
-    const Field& field = Field::ZoneHandle(instr->field().raw());
-    const String& field_name = String::Handle(field.name());
-    class Class& owner = Class::Handle(field.owner());
+    const Field& field = Field::ZoneHandle(isolate(), instr->field().raw());
+    const String& field_name = String::Handle(isolate(), field.name());
+    class Class& owner = Class::Handle(isolate(), field.owner());
     const Function& getter =
-        Function::Handle(owner.LookupGetterFunction(field_name));
+        Function::Handle(isolate(), owner.LookupGetterFunction(field_name));
     const Function& setter =
-        Function::Handle(owner.LookupSetterFunction(field_name));
+        Function::Handle(isolate(), owner.LookupSetterFunction(field_name));
     bool result = !getter.IsNull()
                && !setter.IsNull()
                && (setter.usage_counter() > 0)
@@ -4396,7 +4499,7 @@
     // inlining.
     return false;
   }
-  Function& target = Function::Handle();
+  Function& target = Function::Handle(isolate(), Function::null());
   intptr_t class_id;
   unary_ic_data.GetOneClassCheckAt(0, &class_id, &target);
   if (target.kind() != RawFunction::kImplicitSetter) {
@@ -4405,8 +4508,9 @@
   }
   // Inline implicit instance setter.
   const String& field_name =
-      String::Handle(Field::NameFromSetter(instr->function_name()));
-  const Field& field = Field::ZoneHandle(GetField(class_id, field_name));
+      String::Handle(isolate(), Field::NameFromSetter(instr->function_name()));
+  const Field& field =
+      Field::ZoneHandle(isolate(), GetField(class_id, field_name));
   ASSERT(!field.IsNull());
 
   if (InstanceCallNeedsClassCheck(instr)) {
@@ -4415,9 +4519,10 @@
   StoreBarrierType needs_store_barrier = kEmitStoreBarrier;
   if (ArgIsAlways(kSmiCid, *instr->ic_data(), 1)) {
     InsertBefore(instr,
-                 new CheckSmiInstr(new Value(instr->ArgumentAt(1)),
-                                   instr->deopt_id(),
-                                   instr->token_pos()),
+                 new(isolate()) CheckSmiInstr(
+                     new(isolate()) Value(instr->ArgumentAt(1)),
+                     instr->deopt_id(),
+                     instr->token_pos()),
                  instr->env(),
                  FlowGraph::kEffect);
     needs_store_barrier = kNoStoreBarrier;
@@ -4425,18 +4530,19 @@
 
   if (field.guarded_cid() != kDynamicCid) {
     InsertBefore(instr,
-                 new GuardFieldInstr(new Value(instr->ArgumentAt(1)),
-                                     field,
-                                     instr->deopt_id()),
+                 new(isolate()) GuardFieldInstr(
+                     new(isolate()) Value(instr->ArgumentAt(1)),
+                      field,
+                      instr->deopt_id()),
                  instr->env(),
                  FlowGraph::kEffect);
   }
 
   // Field guard was detached.
-  StoreInstanceFieldInstr* store = new StoreInstanceFieldInstr(
+  StoreInstanceFieldInstr* store = new(isolate()) StoreInstanceFieldInstr(
       field,
-      new Value(instr->ArgumentAt(0)),
-      new Value(instr->ArgumentAt(1)),
+      new(isolate()) Value(instr->ArgumentAt(0)),
+      new(isolate()) Value(instr->ArgumentAt(1)),
       needs_store_barrier,
       instr->token_pos());
 
@@ -4531,6 +4637,10 @@
   // unconstrained definitions.
   void RemoveConstraints();
 
+  Range* ConstraintRange(Token::Kind op, Definition* boundary);
+
+  Isolate* isolate() const { return flow_graph_->isolate(); }
+
   FlowGraph* flow_graph_;
 
   GrowableArray<Definition*> smi_values_;  // Value that are known to be smi.
@@ -4683,25 +4793,25 @@
 // that it evaluated to true.
 // For example for the comparison a < b symbol a is constrained with range
 // [Smi::kMinValue, b - 1].
-static Range* ConstraintRange(Token::Kind op, Definition* boundary) {
+Range* RangeAnalysis::ConstraintRange(Token::Kind op, Definition* boundary) {
   switch (op) {
     case Token::kEQ:
-      return new Range(RangeBoundary::FromDefinition(boundary),
-                       RangeBoundary::FromDefinition(boundary));
+      return new(isolate()) Range(RangeBoundary::FromDefinition(boundary),
+                                  RangeBoundary::FromDefinition(boundary));
     case Token::kNE:
       return Range::Unknown();
     case Token::kLT:
-      return new Range(RangeBoundary::MinSmi(),
-                       RangeBoundary::FromDefinition(boundary, -1));
+      return new(isolate()) Range(RangeBoundary::MinSmi(),
+                                  RangeBoundary::FromDefinition(boundary, -1));
     case Token::kGT:
-      return new Range(RangeBoundary::FromDefinition(boundary, 1),
-                       RangeBoundary::MaxSmi());
+      return new(isolate()) Range(RangeBoundary::FromDefinition(boundary, 1),
+                                  RangeBoundary::MaxSmi());
     case Token::kLTE:
-      return new Range(RangeBoundary::MinSmi(),
-                       RangeBoundary::FromDefinition(boundary));
+      return new(isolate()) Range(RangeBoundary::MinSmi(),
+                                  RangeBoundary::FromDefinition(boundary));
     case Token::kGTE:
-      return new Range(RangeBoundary::FromDefinition(boundary),
-                       RangeBoundary::MaxSmi());
+      return new(isolate()) Range(RangeBoundary::FromDefinition(boundary),
+                                  RangeBoundary::MaxSmi());
     default:
       UNREACHABLE();
       return Range::Unknown();
@@ -4715,8 +4825,8 @@
   // No need to constrain constants.
   if (defn->IsConstant()) return NULL;
 
-  ConstraintInstr* constraint =
-      new ConstraintInstr(new Value(defn), constraint_range);
+  ConstraintInstr* constraint = new(isolate()) ConstraintInstr(
+      new(isolate()) Value(defn), constraint_range);
   flow_graph_->InsertAfter(after, constraint, NULL, FlowGraph::kValue);
   RenameDominatedUses(defn, constraint, constraint);
   constraints_.Add(constraint);
@@ -4791,13 +4901,13 @@
   Range* constraint_range = NULL;
   if (use_index == CheckArrayBoundInstr::kIndexPos) {
     Definition* length = check->length()->definition();
-    constraint_range = new Range(
+    constraint_range = new(isolate()) Range(
         RangeBoundary::FromConstant(0),
         RangeBoundary::FromDefinition(length, -1));
   } else {
     ASSERT(use_index == CheckArrayBoundInstr::kLengthPos);
     Definition* index = check->index()->definition();
-    constraint_range = new Range(
+    constraint_range = new(isolate()) Range(
         RangeBoundary::FromDefinition(index, 1),
         RangeBoundary::MaxSmi());
   }
@@ -4823,7 +4933,8 @@
 
 void RangeAnalysis::ResetWorklist() {
   if (marked_defns_ == NULL) {
-    marked_defns_ = new BitVector(flow_graph_->current_ssa_temp_index());
+    marked_defns_ = new(isolate()) BitVector(
+        flow_graph_->current_ssa_temp_index());
   } else {
     marked_defns_->Clear();
   }
@@ -4941,12 +5052,12 @@
   // Compute the range based on initial value and the direction of the growth.
   switch (direction) {
     case kPositive:
-      return new Range(RangeBoundary::FromDefinition(initial_value),
-                       RangeBoundary::MaxSmi());
+      return new(isolate()) Range(RangeBoundary::FromDefinition(initial_value),
+                                  RangeBoundary::MaxSmi());
 
     case kNegative:
-      return new Range(RangeBoundary::MinSmi(),
-                       RangeBoundary::FromDefinition(initial_value));
+      return new(isolate()) Range(RangeBoundary::MinSmi(),
+                                  RangeBoundary::FromDefinition(initial_value));
 
     case kUnknown:
     case kBoth:
@@ -5006,7 +5117,8 @@
 
 void RangeAnalysis::InferRanges() {
   // Initialize bitvector for quick filtering of smi values.
-  smi_definitions_ = new BitVector(flow_graph_->current_ssa_temp_index());
+  smi_definitions_ =
+      new(isolate()) BitVector(flow_graph_->current_ssa_temp_index());
   for (intptr_t i = 0; i < smi_values_.length(); i++) {
     smi_definitions_->Add(smi_values_[i]->ssa_temp_index());
   }
@@ -5110,7 +5222,8 @@
         // TODO(fschneider): Use constants from the constant pool.
         Definition* old = (*idefs)[j];
         ConstantInstr* orig = cdefs[j]->AsConstant();
-        ConstantInstr* copy = new ConstantInstr(orig->value());
+        ConstantInstr* copy =
+            new(flow_graph->isolate()) ConstantInstr(orig->value());
         copy->set_ssa_temp_index(flow_graph->alloc_ssa_temp_index());
         old->ReplaceUsesWith(copy);
         (*idefs)[j] = copy;
@@ -5593,7 +5706,7 @@
   }
 
   // Create a zone allocated copy of this place.
-  static Place* Wrap(const Place& place);
+  static Place* Wrap(Isolate* isolate, const Place& place);
 
  private:
   bool SameField(Place* other) const {
@@ -5631,8 +5744,8 @@
 };
 
 
-Place* Place::Wrap(const Place& place) {
-  return (new ZonePlace(place))->place();
+Place* Place::Wrap(Isolate* isolate, const Place& place) {
+  return (new(isolate) ZonePlace(place))->place();
 }
 
 
@@ -5642,14 +5755,15 @@
  public:
   // Record a move from the place with id |from| to the place with id |to| at
   // the given block.
-  void CreateOutgoingMove(BlockEntryInstr* block, intptr_t from, intptr_t to) {
+  void CreateOutgoingMove(Isolate* isolate,
+                          BlockEntryInstr* block, intptr_t from, intptr_t to) {
     const intptr_t block_num = block->preorder_number();
     while (moves_.length() <= block_num) {
       moves_.Add(NULL);
     }
 
     if (moves_[block_num] == NULL) {
-      moves_[block_num] = new ZoneGrowableArray<Move>(5);
+      moves_[block_num] = new(isolate) ZoneGrowableArray<Move>(5);
     }
 
     moves_[block_num]->Add(Move(from, to));
@@ -5685,12 +5799,14 @@
 // those that are affected by calls.
 class AliasedSet : public ZoneAllocated {
  public:
-  explicit AliasedSet(ZoneGrowableArray<Place*>* places,
-                      PhiPlaceMoves* phi_moves)
-      : places_(*places),
+  AliasedSet(Isolate* isolate,
+             ZoneGrowableArray<Place*>* places,
+             PhiPlaceMoves* phi_moves)
+      : isolate_(isolate),
+        places_(*places),
         phi_moves_(phi_moves),
         sets_(),
-        aliased_by_effects_(new BitVector(places->length())),
+        aliased_by_effects_(new(isolate) BitVector(places->length())),
         max_field_id_(0),
         field_ids_(),
         max_index_id_(0),
@@ -5820,7 +5936,7 @@
     }
 
     if (sets_[idx] == NULL) {
-      sets_[idx] = new BitVector(max_place_id());
+      sets_[idx] = new(isolate_) BitVector(max_place_id());
     }
 
     sets_[idx]->Add(place_id);
@@ -6173,6 +6289,8 @@
     Value value_;
   };
 
+  Isolate* isolate_;
+
   const ZoneGrowableArray<Place*>& places_;
 
   const PhiPlaceMoves* phi_moves_;
@@ -6237,7 +6355,8 @@
 static PhiPlaceMoves* ComputePhiMoves(
     DirectChainedHashMap<PointerKeyValueTrait<Place> >* map,
     ZoneGrowableArray<Place*>* places) {
-  PhiPlaceMoves* phi_moves = new PhiPlaceMoves();
+  Isolate* isolate = Isolate::Current();
+  PhiPlaceMoves* phi_moves = new(isolate) PhiPlaceMoves();
 
   for (intptr_t i = 0; i < places->length(); i++) {
     Place* place = (*places)[i];
@@ -6257,7 +6376,7 @@
         Place* result = map->Lookup(&input_place);
         if (result == NULL) {
           input_place.set_id(places->length());
-          result = Place::Wrap(input_place);
+          result = Place::Wrap(isolate, input_place);
           map->Insert(result);
           places->Add(result);
           if (FLAG_trace_optimization) {
@@ -6266,7 +6385,8 @@
                       result->id());
           }
         }
-        phi_moves->CreateOutgoingMove(block->PredecessorAt(j),
+        phi_moves->CreateOutgoingMove(isolate,
+                                      block->PredecessorAt(j),
                                       result->id(),
                                       place->id());
       }
@@ -6289,7 +6409,9 @@
     CSEMode mode) {
   // Loads representing different expression ids will be collected and
   // used to build per offset kill sets.
-  ZoneGrowableArray<Place*>* places = new ZoneGrowableArray<Place*>(10);
+  Isolate* isolate = graph->isolate();
+  ZoneGrowableArray<Place*>* places =
+      new(isolate) ZoneGrowableArray<Place*>(10);
 
   bool has_loads = false;
   bool has_stores = false;
@@ -6309,7 +6431,7 @@
       Place* result = map->Lookup(&place);
       if (result == NULL) {
         place.set_id(places->length());
-        result = Place::Wrap(place);
+        result = Place::Wrap(isolate, place);
         map->Insert(result);
         places->Add(result);
 
@@ -6334,7 +6456,7 @@
   PhiPlaceMoves* phi_moves = ComputePhiMoves(map, places);
 
   // Build aliasing sets mapping aliases to loads.
-  AliasedSet* aliased_set = new AliasedSet(places, phi_moves);
+  AliasedSet* aliased_set = new(isolate) AliasedSet(isolate, places, phi_moves);
   for (intptr_t i = 0; i < places->length(); i++) {
     Place* place = (*places)[i];
     aliased_set->AddRepresentative(place);
@@ -6367,15 +6489,17 @@
     const intptr_t num_blocks = graph_->preorder().length();
     for (intptr_t i = 0; i < num_blocks; i++) {
       out_.Add(NULL);
-      gen_.Add(new BitVector(aliased_set_->max_place_id()));
-      kill_.Add(new BitVector(aliased_set_->max_place_id()));
-      in_.Add(new BitVector(aliased_set_->max_place_id()));
+      gen_.Add(new(isolate()) BitVector(aliased_set_->max_place_id()));
+      kill_.Add(new(isolate()) BitVector(aliased_set_->max_place_id()));
+      in_.Add(new(isolate()) BitVector(aliased_set_->max_place_id()));
 
       exposed_values_.Add(NULL);
       out_values_.Add(NULL);
     }
   }
 
+  Isolate* isolate() const { return graph_->isolate(); }
+
   static bool OptimizeGraph(FlowGraph* graph) {
     ASSERT(FLAG_load_cse);
     if (FLAG_trace_load_optimization) {
@@ -6566,7 +6690,7 @@
           // the block entry.
           if (exposed_values == NULL) {
             static const intptr_t kMaxExposedValuesInitialSize = 5;
-            exposed_values = new ZoneGrowableArray<Definition*>(
+            exposed_values = new(isolate()) ZoneGrowableArray<Definition*>(
                 Utils::Minimum(kMaxExposedValuesInitialSize,
                                aliased_set_->max_place_id()));
           }
@@ -6614,9 +6738,11 @@
   // Compute OUT sets by propagating them iteratively until fix point
   // is reached.
   void ComputeOutSets() {
-    BitVector* temp = new BitVector(aliased_set_->max_place_id());
-    BitVector* forwarded_loads = new BitVector(aliased_set_->max_place_id());
-    BitVector* temp_out = new BitVector(aliased_set_->max_place_id());
+    BitVector* temp = new(isolate()) BitVector(aliased_set_->max_place_id());
+    BitVector* forwarded_loads =
+        new(isolate()) BitVector(aliased_set_->max_place_id());
+    BitVector* temp_out =
+        new(isolate()) BitVector(aliased_set_->max_place_id());
 
     bool changed = true;
     while (changed) {
@@ -6668,7 +6794,7 @@
           if ((block_out == NULL) || !block_out->Equals(*temp)) {
             if (block_out == NULL) {
               block_out = out_[preorder_number] =
-                  new BitVector(aliased_set_->max_place_id());
+                  new(isolate()) BitVector(aliased_set_->max_place_id());
             }
             block_out->CopyFrom(temp);
             changed = true;
@@ -6721,8 +6847,8 @@
               MergeIncomingValues(block, place_id) : NULL;
           if ((in_value == NULL) &&
               (in_[preorder_number]->Contains(place_id))) {
-            PhiInstr* phi = new PhiInstr(block->AsJoinEntry(),
-                                         block->PredecessorCount());
+            PhiInstr* phi = new(isolate()) PhiInstr(block->AsJoinEntry(),
+                                                    block->PredecessorCount());
             phi->set_place_id(place_id);
             pending_phis.Add(phi);
             in_value = phi;
@@ -6795,7 +6921,7 @@
         graph_->loop_headers();
 
     ZoneGrowableArray<BitVector*>* invariant_loads =
-        new ZoneGrowableArray<BitVector*>(loop_headers.length());
+        new(isolate()) ZoneGrowableArray<BitVector*>(loop_headers.length());
 
     for (intptr_t i = 0; i < loop_headers.length(); i++) {
       BlockEntryInstr* header = loop_headers[i];
@@ -6805,7 +6931,8 @@
         continue;
       }
 
-      BitVector* loop_gen = new BitVector(aliased_set_->max_place_id());
+      BitVector* loop_gen =
+          new(isolate()) BitVector(aliased_set_->max_place_id());
       for (BitVector::Iterator loop_it(header->loop_info());
            !loop_it.Done();
            loop_it.Advance()) {
@@ -6861,7 +6988,7 @@
     }
 
     // Incoming values are different. Phi is required to merge.
-    PhiInstr* phi = new PhiInstr(
+    PhiInstr* phi = new(isolate()) PhiInstr(
         block->AsJoinEntry(), block->PredecessorCount());
     phi->set_place_id(place_id);
     FillPhiInputs(phi);
@@ -6884,7 +7011,7 @@
       // To prevent using them we additionally mark definitions themselves
       // as replaced and store a pointer to the replacement.
       Definition* replacement = (*pred_out_values)[place_id]->Replacement();
-      Value* input = new Value(replacement);
+      Value* input = new(isolate()) Value(replacement);
       phi->SetInputAt(i, input);
       replacement->AddInputUse(input);
     }
@@ -6957,7 +7084,7 @@
 
     worklist_.Clear();
     if (in_worklist_ == NULL) {
-      in_worklist_ = new BitVector(graph_->current_ssa_temp_index());
+      in_worklist_ = new(isolate()) BitVector(graph_->current_ssa_temp_index());
     } else {
       in_worklist_->Clear();
     }
@@ -7030,7 +7157,7 @@
 
     worklist_.Clear();
     if (in_worklist_ == NULL) {
-      in_worklist_ = new BitVector(graph_->current_ssa_temp_index());
+      in_worklist_ = new(isolate()) BitVector(graph_->current_ssa_temp_index());
     } else {
       in_worklist_->Clear();
     }
@@ -7119,7 +7246,8 @@
 
   ZoneGrowableArray<Definition*>* CreateBlockOutValues() {
     ZoneGrowableArray<Definition*>* out =
-        new ZoneGrowableArray<Definition*>(aliased_set_->max_place_id());
+        new(isolate()) ZoneGrowableArray<Definition*>(
+            aliased_set_->max_place_id());
     for (intptr_t i = 0; i < aliased_set_->max_place_id(); i++) {
       out->Add(NULL);
     }
@@ -7223,7 +7351,9 @@
   }
 
   virtual void ComputeInitialSets() {
-    BitVector* all_places = new BitVector(aliased_set_->max_place_id());
+    Isolate* isolate = graph_->isolate();
+    BitVector* all_places = new(isolate) BitVector(
+        aliased_set_->max_place_id());
     all_places->SetAll();
     for (BlockIterator block_it = graph_->postorder_iterator();
          !block_it.Done();
@@ -7268,7 +7398,7 @@
             // candidates for the global store elimination.
             if (exposed_stores == NULL) {
               const intptr_t kMaxExposedStoresInitialSize = 5;
-              exposed_stores = new ZoneGrowableArray<Instruction*>(
+              exposed_stores = new(isolate) ZoneGrowableArray<Instruction*>(
                   Utils::Minimum(kMaxExposedStoresInitialSize,
                                  aliased_set_->max_place_id()));
             }
@@ -7564,8 +7694,9 @@
       graph_(graph),
       unknown_(Object::unknown_constant()),
       non_constant_(Object::non_constant()),
-      reachable_(new BitVector(graph->preorder().length())),
-      definition_marks_(new BitVector(graph->max_virtual_register_number())),
+      reachable_(new(graph->isolate()) BitVector(graph->preorder().length())),
+      definition_marks_(new(graph->isolate()) BitVector(
+          graph->max_virtual_register_number())),
       block_worklist_(),
       definition_worklist_() {}
 
@@ -7771,7 +7902,7 @@
 void ConstantPropagator::VisitPhi(PhiInstr* instr) {
   // Compute the join over all the reachable predecessor values.
   JoinEntryInstr* block = instr->block();
-  Object& value = Object::ZoneHandle(Unknown());
+  Object& value = Object::ZoneHandle(isolate(), Unknown());
   for (intptr_t pred_idx = 0; pred_idx < instr->InputCount(); ++pred_idx) {
     if (reachable_->Contains(
             block->PredecessorAt(pred_idx)->preorder_number())) {
@@ -7888,7 +8019,7 @@
     ASSERT(value.IsBool());
     bool result = Bool::Cast(value).value();
     SetValue(instr,
-             Smi::Handle(Smi::New(
+             Smi::Handle(isolate(), Smi::New(
                  result ? instr->if_true() : instr->if_false())));
   }
 }
@@ -7964,9 +8095,10 @@
     if (left.IsInteger() && right.IsInteger()) {
       const bool result = CompareIntegers(
           instr->kind(),
-          Integer::Handle(Integer::Cast(left).BitOp(Token::kBIT_AND,
+          Integer::Handle(isolate(),
+                          Integer::Cast(left).BitOp(Token::kBIT_AND,
                                                     Integer::Cast(right))),
-          Smi::Handle(Smi::New(0)));
+          Smi::Handle(isolate(), Smi::New(0)));
       SetValue(instr, result ? Bool::True() : Bool::False());
     } else {
       SetValue(instr, non_constant_);
@@ -8050,7 +8182,7 @@
     ASSERT(ch_code >= 0);
     if (ch_code < Symbols::kMaxOneCharCodeSymbol) {
       RawString** table = Symbols::PredefinedAddress();
-      SetValue(instr, String::ZoneHandle(table[ch_code]));
+      SetValue(instr, String::ZoneHandle(isolate(), table[ch_code]));
     } else {
       SetValue(instr, non_constant_);
     }
@@ -8065,7 +8197,7 @@
   } else if (IsConstant(o)) {
     const String& str = String::Cast(o);
     const intptr_t result = (str.Length() == 1) ? str.CharAt(0) : -1;
-    SetValue(instr, Smi::ZoneHandle(Smi::New(result)));
+    SetValue(instr, Smi::ZoneHandle(isolate(), Smi::New(result)));
   }
 }
 
@@ -8095,13 +8227,13 @@
       if (array_obj.IsString()) {
         const String& str = String::Cast(array_obj);
         if (str.Length() > index) {
-          SetValue(instr, Smi::Handle(Smi::New(str.CharAt(index))));
+          SetValue(instr, Smi::Handle(isolate(), Smi::New(str.CharAt(index))));
           return;
         }
       } else if (array_obj.IsArray()) {
         const Array& a = Array::Cast(array_obj);
         if ((a.Length() > index) && a.IsImmutable()) {
-          Instance& result = Instance::Handle();
+          Instance& result = Instance::Handle(isolate(), Instance::null());
           result ^= a.At(index);
           SetValue(instr, result);
           return;
@@ -8128,7 +8260,7 @@
   const Field& field = instr->StaticField();
   ASSERT(field.is_static());
   if (field.is_final()) {
-    Instance& obj = Instance::Handle(field.value());
+    Instance& obj = Instance::Handle(isolate(), field.value());
     ASSERT(obj.raw() != Object::sentinel().raw());
     ASSERT(obj.raw() != Object::transition_sentinel().raw());
     if (obj.IsSmi() || obj.IsOld()) {
@@ -8203,12 +8335,12 @@
 void ConstantPropagator::VisitLoadClassId(LoadClassIdInstr* instr) {
   intptr_t cid = instr->object()->Type()->ToCid();
   if (cid != kDynamicCid) {
-    SetValue(instr, Smi::ZoneHandle(Smi::New(cid)));
+    SetValue(instr, Smi::ZoneHandle(isolate(), Smi::New(cid)));
     return;
   }
   const Object& object = instr->object()->definition()->constant_value();
   if (IsConstant(object)) {
-    SetValue(instr, Smi::ZoneHandle(Smi::New(object.GetClassId())));
+    SetValue(instr, Smi::ZoneHandle(isolate(), Smi::New(object.GetClassId())));
     return;
   }
   SetValue(instr, non_constant_);
@@ -8223,7 +8355,7 @@
     if (num_elements->BindsToConstant() &&
         num_elements->BoundConstant().IsSmi()) {
       intptr_t length = Smi::Cast(num_elements->BoundConstant()).Value();
-      const Object& result = Smi::ZoneHandle(Smi::New(length));
+      const Object& result = Smi::ZoneHandle(isolate(), Smi::New(length));
       SetValue(instr, result);
       return;
     }
@@ -8233,12 +8365,12 @@
     ConstantInstr* constant = instr->instance()->definition()->AsConstant();
     if (constant != NULL) {
       if (constant->value().IsString()) {
-        SetValue(instr, Smi::ZoneHandle(
+        SetValue(instr, Smi::ZoneHandle(isolate(),
             Smi::New(String::Cast(constant->value()).Length())));
         return;
       }
       if (constant->value().IsArray()) {
-        SetValue(instr, Smi::ZoneHandle(
+        SetValue(instr, Smi::ZoneHandle(isolate(),
             Smi::New(Array::Cast(constant->value()).Length())));
         return;
       }
@@ -8258,7 +8390,7 @@
   if (IsConstant(object)) {
     if (instr->type().IsTypeParameter()) {
       if (object.IsNull()) {
-        SetValue(instr, Type::ZoneHandle(Type::DynamicType()));
+        SetValue(instr, Type::ZoneHandle(isolate(), Type::DynamicType()));
         return;
       }
       // We could try to instantiate the type parameter and return it if no
@@ -8330,7 +8462,7 @@
         case Token::kADD:
         case Token::kSUB:
         case Token::kMUL: {
-          Instance& result = Integer::ZoneHandle(
+          Instance& result = Integer::ZoneHandle(isolate(),
               left_int.ArithmeticOp(op_kind, right_int));
           result = result.CheckAndCanonicalize(NULL);
           ASSERT(!result.IsNull());
@@ -8340,7 +8472,7 @@
         case Token::kSHL:
         case Token::kSHR:
           if (left.IsSmi() && right.IsSmi()) {
-            Instance& result = Integer::ZoneHandle(
+            Instance& result = Integer::ZoneHandle(isolate(),
                 Smi::Cast(left_int).ShiftOp(op_kind, Smi::Cast(right_int)));
             result = result.CheckAndCanonicalize(NULL);
             ASSERT(!result.IsNull());
@@ -8352,7 +8484,7 @@
         case Token::kBIT_AND:
         case Token::kBIT_OR:
         case Token::kBIT_XOR: {
-          Instance& result = Integer::ZoneHandle(
+          Instance& result = Integer::ZoneHandle(isolate(),
               left_int.BitOp(op_kind, right_int));
           result = result.CheckAndCanonicalize(NULL);
           ASSERT(!result.IsNull());
@@ -8431,7 +8563,7 @@
 void ConstantPropagator::VisitSmiToDouble(SmiToDoubleInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
   if (IsConstant(value) && value.IsInteger()) {
-    SetValue(instr, Double::Handle(
+    SetValue(instr, Double::Handle(isolate(),
         Double::New(Integer::Cast(value).AsDoubleValue(), Heap::kOld)));
   } else if (IsNonConstant(value)) {
     SetValue(instr, non_constant_);
@@ -8894,7 +9026,8 @@
   // Canonicalize branches that have no side-effects and where true- and
   // false-targets are the same.
   bool changed = false;
-  BitVector* empty_blocks = new BitVector(graph_->preorder().length());
+  BitVector* empty_blocks =
+      new(graph_->isolate()) BitVector(graph_->preorder().length());
   for (BlockIterator b = graph_->postorder_iterator();
        !b.Done();
        b.Advance()) {
@@ -8912,8 +9045,9 @@
         // Drop the comparison, which does not have side effects
         JoinEntryInstr* join = if_true->AsJoinEntry();
         if (join->phis() == NULL) {
-          GotoInstr* jump = new GotoInstr(if_true->AsJoinEntry());
-          jump->InheritDeoptTarget(branch);
+          GotoInstr* jump =
+              new(graph_->isolate()) GotoInstr(if_true->AsJoinEntry());
+          jump->InheritDeoptTarget(isolate(), branch);
 
           Instruction* previous = branch->previous();
           branch->set_previous(NULL);
@@ -9058,15 +9192,17 @@
         ASSERT(reachable_->Contains(if_false->preorder_number()));
         ASSERT(if_false->parallel_move() == NULL);
         ASSERT(if_false->loop_info() == NULL);
-        join = new JoinEntryInstr(if_false->block_id(), if_false->try_index());
-        join->InheritDeoptTarget(if_false);
+        join = new(isolate()) JoinEntryInstr(if_false->block_id(),
+                                             if_false->try_index());
+        join->InheritDeoptTarget(isolate(), if_false);
         if_false->UnuseAllInputs();
         next = if_false->next();
       } else if (!reachable_->Contains(if_false->preorder_number())) {
         ASSERT(if_true->parallel_move() == NULL);
         ASSERT(if_true->loop_info() == NULL);
-        join = new JoinEntryInstr(if_true->block_id(), if_true->try_index());
-        join->InheritDeoptTarget(if_true);
+        join = new(isolate()) JoinEntryInstr(if_true->block_id(),
+                                             if_true->try_index());
+        join->InheritDeoptTarget(isolate(), if_true);
         if_true->UnuseAllInputs();
         next = if_true->next();
       }
@@ -9076,8 +9212,8 @@
         // Drop the comparison, which does not have side effects as long
         // as it is a strict compare (the only one we can determine is
         // constant with the current analysis).
-        GotoInstr* jump = new GotoInstr(join);
-        jump->InheritDeoptTarget(branch);
+        GotoInstr* jump = new(isolate()) GotoInstr(join);
+        jump->InheritDeoptTarget(isolate(), branch);
 
         Instruction* previous = branch->previous();
         branch->set_previous(NULL);
@@ -9152,13 +9288,14 @@
 }
 
 
-JoinEntryInstr* BranchSimplifier::ToJoinEntry(TargetEntryInstr* target) {
+JoinEntryInstr* BranchSimplifier::ToJoinEntry(Isolate* isolate,
+                                              TargetEntryInstr* target) {
   // Convert a target block into a join block.  Branches will be duplicated
   // so the former true and false targets become joins of the control flows
   // from all the duplicated branches.
   JoinEntryInstr* join =
-      new JoinEntryInstr(target->block_id(), target->try_index());
-  join->InheritDeoptTarget(target);
+      new(isolate) JoinEntryInstr(target->block_id(), target->try_index());
+  join->InheritDeoptTarget(isolate, target);
   join->LinkTo(target->next());
   join->set_last_instruction(target->last_instruction());
   target->UnuseAllInputs();
@@ -9166,13 +9303,14 @@
 }
 
 
-BranchInstr* BranchSimplifier::CloneBranch(BranchInstr* branch,
+BranchInstr* BranchSimplifier::CloneBranch(Isolate* isolate,
+                                           BranchInstr* branch,
                                            Value* new_left,
                                            Value* new_right) {
   ComparisonInstr* comparison = branch->comparison();
   ComparisonInstr* new_comparison =
       comparison->CopyWithNewOperands(new_left, new_right);
-  BranchInstr* new_branch = new BranchInstr(new_comparison);
+  BranchInstr* new_branch = new(isolate) BranchInstr(new_comparison);
   new_branch->set_is_checked(branch->is_checked());
   return new_branch;
 }
@@ -9190,6 +9328,7 @@
 
   // Begin with a worklist of join blocks ending in branches.  They are
   // candidates for the pattern below.
+  Isolate* isolate = flow_graph->isolate();
   const GrowableArray<BlockEntryInstr*>& postorder = flow_graph->postorder();
   GrowableArray<BlockEntryInstr*> worklist(postorder.length());
   for (BlockIterator it(postorder); !it.Done(); it.Advance()) {
@@ -9219,8 +9358,10 @@
       // worklist.
       BranchInstr* branch = block->last_instruction()->AsBranch();
       ASSERT(branch != NULL);
-      JoinEntryInstr* join_true = ToJoinEntry(branch->true_successor());
-      JoinEntryInstr* join_false = ToJoinEntry(branch->false_successor());
+      JoinEntryInstr* join_true =
+          ToJoinEntry(isolate, branch->true_successor());
+      JoinEntryInstr* join_false =
+          ToJoinEntry(isolate, branch->false_successor());
 
       ComparisonInstr* comparison = branch->comparison();
       PhiInstr* phi = comparison->left()->definition()->AsPhi();
@@ -9234,14 +9375,15 @@
 
         // Replace the goto in each predecessor with a rewritten branch,
         // rewritten to use the corresponding phi input instead of the phi.
-        Value* new_left = phi->InputAt(i)->Copy();
-        Value* new_right = new Value(constant);
-        BranchInstr* new_branch = CloneBranch(branch, new_left, new_right);
+        Value* new_left = phi->InputAt(i)->Copy(isolate);
+        Value* new_right = new(isolate) Value(constant);
+        BranchInstr* new_branch =
+            CloneBranch(isolate, branch, new_left, new_right);
         if (branch->env() == NULL) {
-          new_branch->InheritDeoptTarget(old_goto);
+          new_branch->InheritDeoptTarget(isolate, old_goto);
         } else {
           // Take the environment from the branch if it has one.
-          new_branch->InheritDeoptTarget(branch);
+          new_branch->InheritDeoptTarget(isolate, branch);
           // InheritDeoptTarget gave the new branch's comparison the same
           // deopt id that it gave the new branch.  The id should be the
           // deopt id of the original comparison.
@@ -9274,22 +9416,22 @@
         // Connect the branch to the true and false joins, via empty target
         // blocks.
         TargetEntryInstr* true_target =
-            new TargetEntryInstr(flow_graph->max_block_id() + 1,
-                                 block->try_index());
-        true_target->InheritDeoptTarget(join_true);
+            new(isolate) TargetEntryInstr(flow_graph->max_block_id() + 1,
+                                          block->try_index());
+        true_target->InheritDeoptTarget(isolate, join_true);
         TargetEntryInstr* false_target =
-            new TargetEntryInstr(flow_graph->max_block_id() + 2,
-                                 block->try_index());
-        false_target->InheritDeoptTarget(join_false);
+            new(isolate) TargetEntryInstr(flow_graph->max_block_id() + 2,
+                                          block->try_index());
+        false_target->InheritDeoptTarget(isolate, join_false);
         flow_graph->set_max_block_id(flow_graph->max_block_id() + 2);
         *new_branch->true_successor_address() = true_target;
         *new_branch->false_successor_address() = false_target;
-        GotoInstr* goto_true = new GotoInstr(join_true);
-        goto_true->InheritDeoptTarget(join_true);
+        GotoInstr* goto_true = new(isolate) GotoInstr(join_true);
+        goto_true->InheritDeoptTarget(isolate, join_true);
         true_target->LinkTo(goto_true);
         true_target->set_last_instruction(goto_true);
-        GotoInstr* goto_false = new GotoInstr(join_false);
-        goto_false->InheritDeoptTarget(join_false);
+        GotoInstr* goto_false = new(isolate) GotoInstr(join_false);
+        goto_false->InheritDeoptTarget(isolate, join_false);
         false_target->LinkTo(goto_false);
         false_target->set_last_instruction(goto_false);
       }
@@ -9333,6 +9475,7 @@
 
 
 void IfConverter::Simplify(FlowGraph* flow_graph) {
+  Isolate* isolate = flow_graph->isolate();
   bool changed = false;
 
   const GrowableArray<BlockEntryInstr*>& postorder = flow_graph->postorder();
@@ -9386,12 +9529,13 @@
           Value* if_false = (pred2 == branch->true_successor()) ? v1 : v2;
 
           ComparisonInstr* new_comparison =
-              comparison->CopyWithNewOperands(comparison->left()->Copy(),
-                                              comparison->right()->Copy());
-          IfThenElseInstr* if_then_else = new IfThenElseInstr(
+              comparison->CopyWithNewOperands(
+                  comparison->left()->Copy(isolate),
+                  comparison->right()->Copy(isolate));
+          IfThenElseInstr* if_then_else = new(isolate) IfThenElseInstr(
               new_comparison,
-              if_true->Copy(),
-              if_false->Copy());
+              if_true->Copy(isolate),
+              if_false->Copy(isolate));
           flow_graph->InsertBefore(branch,
                                    if_then_else,
                                    NULL,
@@ -9626,25 +9770,28 @@
     const Class& cls,
     const ZoneGrowableArray<const Object*>& slots) {
   ZoneGrowableArray<Value*>* values =
-      new ZoneGrowableArray<Value*>(slots.length());
+      new(isolate()) ZoneGrowableArray<Value*>(slots.length());
 
   // Insert load instruction for every field.
   for (intptr_t i = 0; i < slots.length(); i++) {
     LoadFieldInstr* load = slots[i]->IsField()
-        ? new LoadFieldInstr(new Value(alloc),
-                             &Field::Cast(*slots[i]),
-                             AbstractType::ZoneHandle(),
-                             alloc->token_pos())
-        : new LoadFieldInstr(new Value(alloc),
-                             Smi::Cast(*slots[i]).Value(),
-                             AbstractType::ZoneHandle(),
-                             alloc->token_pos());
+        ? new(isolate()) LoadFieldInstr(
+            new(isolate()) Value(alloc),
+            &Field::Cast(*slots[i]),
+            AbstractType::ZoneHandle(isolate(), AbstractType::null()),
+            alloc->token_pos())
+        : new(isolate()) LoadFieldInstr(
+            new(isolate()) Value(alloc),
+            Smi::Cast(*slots[i]).Value(),
+            AbstractType::ZoneHandle(isolate(), AbstractType::null()),
+            alloc->token_pos());
     flow_graph_->InsertBefore(
         exit, load, NULL, FlowGraph::kValue);
-    values->Add(new Value(load));
+    values->Add(new(isolate()) Value(load));
   }
 
-  MaterializeObjectInstr* mat = new MaterializeObjectInstr(cls, slots, values);
+  MaterializeObjectInstr* mat =
+      new(isolate()) MaterializeObjectInstr(cls, slots, values);
   flow_graph_->InsertBefore(exit, mat, NULL, FlowGraph::kValue);
 
   // Replace all mentions of this allocation with a newly inserted
@@ -9670,7 +9817,7 @@
 void AllocationSinking::InsertMaterializations(AllocateObjectInstr* alloc) {
   // Collect all fields that are written for this instance.
   ZoneGrowableArray<const Object*>* slots =
-      new ZoneGrowableArray<const Object*>(5);
+      new(isolate()) ZoneGrowableArray<const Object*>(5);
 
   for (Value* use = alloc->input_use_list();
        use != NULL;
@@ -9679,14 +9826,15 @@
     if (!store->field().IsNull()) {
       AddSlot(slots, store->field());
     } else {
-      AddSlot(slots, Smi::ZoneHandle(Smi::New(store->offset_in_bytes())));
+      AddSlot(slots, Smi::ZoneHandle(isolate(),
+                                     Smi::New(store->offset_in_bytes())));
     }
   }
 
   if (alloc->ArgumentCount() > 0) {
     ASSERT(alloc->ArgumentCount() == 1);
     intptr_t type_args_offset = alloc->cls().type_arguments_field_offset();
-    AddSlot(slots, Smi::ZoneHandle(Smi::New(type_args_offset)));
+    AddSlot(slots, Smi::ZoneHandle(isolate(), Smi::New(type_args_offset)));
   }
 
   // Collect all instructions that mention this object in the environment.
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index ae814e0..b1fd7d8 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -71,6 +71,7 @@
  private:
   // Attempt to build ICData for call using propagated class-ids.
   bool TryCreateICData(InstanceCallInstr* call);
+  const ICData& TrySpecializeICData(const ICData& ic_data, intptr_t cid);
 
   void SpecializePolymorphicInstanceCall(PolymorphicInstanceCallInstr* call);
 
@@ -126,6 +127,8 @@
 
   bool TryReplaceInstanceCallWithInline(InstanceCallInstr* call);
 
+  LoadFieldInstr* BuildLoadStringLength(Definition* str);
+
   Definition* PrepareInlineStringIndexOp(Instruction* call,
                                          intptr_t cid,
                                          Definition* str,
@@ -243,6 +246,8 @@
                                        Representation rep, intptr_t cid);
   bool TryStringLengthOneEquality(InstanceCallInstr* call, Token::Kind op_kind);
 
+  Isolate* isolate() const { return flow_graph_->isolate(); }
+
   FlowGraph* flow_graph_;
 
   DISALLOW_COPY_AND_ASSIGN(FlowGraphOptimizer);
@@ -358,6 +363,8 @@
   FOR_EACH_INSTRUCTION(DECLARE_VISIT)
 #undef DECLARE_VISIT
 
+  Isolate* isolate() const { return graph_->isolate(); }
+
   FlowGraph* graph_;
 
   // Sentinels for unknown constant and non-constant values.
@@ -389,7 +396,8 @@
   // Replace a target entry instruction with a join entry instruction.  Does
   // not update the original target's predecessors to point to the new block
   // and does not replace the target in already computed block order lists.
-  static JoinEntryInstr* ToJoinEntry(TargetEntryInstr* target);
+  static JoinEntryInstr* ToJoinEntry(Isolate* isolate,
+                                     TargetEntryInstr* target);
 
  private:
   // Match an instance of the pattern to rewrite.  See the implementation
@@ -398,7 +406,8 @@
 
   // Duplicate a branch while replacing its comparison's left and right
   // inputs.
-  static BranchInstr* CloneBranch(BranchInstr* branch,
+  static BranchInstr* CloneBranch(Isolate* isolate,
+                                  BranchInstr* branch,
                                   Value* new_left,
                                   Value* new_right);
 };
@@ -432,6 +441,8 @@
       const Class& cls,
       const ZoneGrowableArray<const Object*>& fields);
 
+  Isolate* isolate() const { return flow_graph_->isolate(); }
+
   FlowGraph* flow_graph_;
 
   GrowableArray<MaterializeObjectInstr*> materializations_;
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index d2c72bd..0442439 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -372,13 +372,13 @@
   Instruction* check_clone = NULL;
   if (check->IsCheckSmi()) {
     check_clone =
-        new CheckSmiInstr(assert->value()->Copy(),
+        new CheckSmiInstr(assert->value()->Copy(isolate()),
                           assert->env()->deopt_id(),
                           check->token_pos());
   } else {
     ASSERT(check->IsCheckClass());
     check_clone =
-        new CheckClassInstr(assert->value()->Copy(),
+        new CheckClassInstr(assert->value()->Copy(isolate()),
                             assert->env()->deopt_id(),
                             check->AsCheckClass()->unary_checks(),
                             check->token_pos());
@@ -386,7 +386,7 @@
   ASSERT(check_clone != NULL);
   ASSERT(assert->deopt_id() == assert->env()->deopt_id());
   check_clone->InsertBefore(assert);
-  assert->env()->DeepCopyTo(check_clone);
+  assert->env()->DeepCopyTo(isolate(), check_clone);
 
   (*asserts_)[defn->ssa_temp_index()] = kStrengthenedAssertMarker;
 }
diff --git a/runtime/vm/flow_graph_type_propagator.h b/runtime/vm/flow_graph_type_propagator.h
index 4569295..f445868 100644
--- a/runtime/vm/flow_graph_type_propagator.h
+++ b/runtime/vm/flow_graph_type_propagator.h
@@ -50,6 +50,8 @@
   void StrengthenAsserts(BlockEntryInstr* block);
   void StrengthenAssertWith(Instruction* check);
 
+  Isolate* isolate() const { return flow_graph_->isolate(); }
+
   FlowGraph* flow_graph_;
 
   BitVector* visited_blocks_;
diff --git a/runtime/vm/growable_array.h b/runtime/vm/growable_array.h
index cfc4e17..a94158e 100644
--- a/runtime/vm/growable_array.h
+++ b/runtime/vm/growable_array.h
@@ -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.
 // Defines growable array classes, that differ where they are allocated:
-// - GrowableArray: allocate on stack.
+// - GrowableArray: allocated on stack.
 // - ZoneGrowableArray: allocated in the zone.
 
 #ifndef VM_GROWABLE_ARRAY_H_
@@ -122,10 +122,12 @@
 template<typename T>
 class GrowableArray : public BaseGrowableArray<T, ValueObject> {
  public:
+  GrowableArray(Isolate* isolate, intptr_t initial_capacity)
+      : BaseGrowableArray<T, ValueObject>(
+          initial_capacity, isolate->current_zone()) {}
   explicit GrowableArray(intptr_t initial_capacity)
       : BaseGrowableArray<T, ValueObject>(
-          initial_capacity,
-          Isolate::Current()->current_zone()) {}
+          initial_capacity, Isolate::Current()->current_zone()) {}
   GrowableArray()
       : BaseGrowableArray<T, ValueObject>(
           Isolate::Current()->current_zone()) {}
@@ -135,6 +137,9 @@
 template<typename T>
 class ZoneGrowableArray : public BaseGrowableArray<T, ZoneAllocated> {
  public:
+  ZoneGrowableArray(Isolate* isolate, intptr_t initial_capacity)
+      : BaseGrowableArray<T, ZoneAllocated>(
+          initial_capacity, isolate->current_zone()) {}
   explicit ZoneGrowableArray(intptr_t initial_capacity)
       : BaseGrowableArray<T, ZoneAllocated>(
           initial_capacity,
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index 3584bec..acdca49 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -103,7 +103,7 @@
     ASSERT(space == kOld);
     old_space_->AllocateExternal(size);
     if (old_space_->NeedsGarbageCollection()) {
-      CollectGarbage(kOld);
+      CollectAllGarbage();
     }
   }
 }
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index c1bcf36..4ef69fa 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -804,25 +804,26 @@
 }
 
 
-void Instruction::InheritDeoptTargetAfter(Instruction* other) {
+void Instruction::InheritDeoptTargetAfter(Isolate* isolate,
+                                          Instruction* other) {
   ASSERT(other->env() != NULL);
   deopt_id_ = Isolate::ToDeoptAfter(other->deopt_id_);
-  other->env()->DeepCopyTo(this);
+  other->env()->DeepCopyTo(isolate, this);
   env()->set_deopt_id(deopt_id_);
 }
 
 
-void Instruction::InheritDeoptTarget(Instruction* other) {
+void Instruction::InheritDeoptTarget(Isolate* isolate, Instruction* other) {
   ASSERT(other->env() != NULL);
   deopt_id_ = other->deopt_id_;
-  other->env()->DeepCopyTo(this);
+  other->env()->DeepCopyTo(isolate, this);
   env()->set_deopt_id(deopt_id_);
 }
 
 
-void BranchInstr::InheritDeoptTarget(Instruction* other) {
+void BranchInstr::InheritDeoptTarget(Isolate* isolate, Instruction* other) {
   ASSERT(env() == NULL);
-  Instruction::InheritDeoptTarget(other);
+  Instruction::InheritDeoptTarget(isolate, other);
   comparison()->SetDeoptId(GetDeoptId());
 }
 
@@ -1611,11 +1612,12 @@
 }
 
 
-LocationSummary* DebugStepCheckInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DebugStepCheckInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   return locs;
 }
 
@@ -1633,8 +1635,20 @@
 }
 
 
+static bool HasTryBlockUse(Value* use_list) {
+  for (Value::Iterator it(use_list); !it.Done(); it.Advance()) {
+    Value* use = it.Current();
+    if (use->instruction()->MayThrow() &&
+        use->instruction()->GetBlock()->InsideTryBlock()) {
+      return true;
+    }
+  }
+  return false;
+}
+
+
 Definition* BoxDoubleInstr::Canonicalize(FlowGraph* flow_graph) {
-  if (input_use_list() == NULL) {
+  if ((input_use_list() == NULL) && !HasTryBlockUse(env_use_list())) {
     // Environments can accomodate any representation. No need to box.
     return value()->definition();
   }
@@ -1669,7 +1683,7 @@
 
 
 Definition* BoxFloat32x4Instr::Canonicalize(FlowGraph* flow_graph) {
-  if (input_use_list() == NULL) {
+  if ((input_use_list() == NULL) && !HasTryBlockUse(env_use_list())) {
     // Environments can accomodate any representation. No need to box.
     return value()->definition();
   }
@@ -1692,7 +1706,7 @@
 
 
 Definition* BoxFloat64x2Instr::Canonicalize(FlowGraph* flow_graph) {
-  if (input_use_list() == NULL) {
+  if ((input_use_list() == NULL) && !HasTryBlockUse(env_use_list())) {
     // Environments can accomodate any representation. No need to box.
     return value()->definition();
   }
@@ -1716,7 +1730,7 @@
 
 
 Definition* BoxInt32x4Instr::Canonicalize(FlowGraph* flow_graph) {
-  if (input_use_list() == NULL) {
+  if ((input_use_list() == NULL) && !HasTryBlockUse(env_use_list())) {
     // Environments can accomodate any representation. No need to box.
     return value()->definition();
   }
@@ -1853,6 +1867,7 @@
 
 
 Instruction* BranchInstr::Canonicalize(FlowGraph* flow_graph) {
+  Isolate* isolate = flow_graph->isolate();
   // Only handle strict-compares.
   if (comparison()->IsStrictCompare()) {
     bool negated = false;
@@ -1912,10 +1927,11 @@
       if (FLAG_trace_optimization) {
         OS::Print("Merging test smi v%" Pd "\n", bit_and->ssa_temp_index());
       }
-      TestSmiInstr* test = new TestSmiInstr(comparison()->token_pos(),
-                                            comparison()->kind(),
-                                            bit_and->left()->Copy(),
-                                            bit_and->right()->Copy());
+      TestSmiInstr* test = new TestSmiInstr(
+          comparison()->token_pos(),
+          comparison()->kind(),
+          bit_and->left()->Copy(isolate),
+          bit_and->right()->Copy(isolate));
       ASSERT(!CanDeoptimize());
       RemoveEnvironment();
       flow_graph->CopyDeoptTarget(this, bit_and);
@@ -2012,13 +2028,15 @@
 
 #define __ compiler->assembler()->
 
-LocationSummary* GraphEntryInstr::MakeLocationSummary(bool optimizing) const {
+LocationSummary* GraphEntryInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool optimizing) const {
   UNREACHABLE();
   return NULL;
 }
 
 
-LocationSummary* JoinEntryInstr::MakeLocationSummary(bool optimizing) const {
+LocationSummary* JoinEntryInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool optimizing) const {
   UNREACHABLE();
   return NULL;
 }
@@ -2037,7 +2055,8 @@
 }
 
 
-LocationSummary* TargetEntryInstr::MakeLocationSummary(bool optimizing) const {
+LocationSummary* TargetEntryInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool optimizing) const {
   // FlowGraphCompiler::EmitInstructionPrologue is not called for block
   // entry instructions, so this function is unused.  If it becomes
   // reachable, note that the deoptimization descriptor in unoptimized code
@@ -2049,7 +2068,8 @@
 }
 
 
-LocationSummary* PhiInstr::MakeLocationSummary(bool optimizing) const {
+LocationSummary* PhiInstr::MakeLocationSummary(Isolate* isolate,
+                                               bool optimizing) const {
   UNREACHABLE();
   return NULL;
 }
@@ -2060,7 +2080,8 @@
 }
 
 
-LocationSummary* RedefinitionInstr::MakeLocationSummary(bool optimizing) const {
+LocationSummary* RedefinitionInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool optimizing) const {
   UNREACHABLE();
   return NULL;
 }
@@ -2071,7 +2092,8 @@
 }
 
 
-LocationSummary* ParameterInstr::MakeLocationSummary(bool optimizing) const {
+LocationSummary* ParameterInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool optimizing) const {
   UNREACHABLE();
   return NULL;
 }
@@ -2082,7 +2104,8 @@
 }
 
 
-LocationSummary* ParallelMoveInstr::MakeLocationSummary(bool optimizing) const {
+LocationSummary* ParallelMoveInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool optimizing) const {
   return NULL;
 }
 
@@ -2092,7 +2115,8 @@
 }
 
 
-LocationSummary* ConstraintInstr::MakeLocationSummary(bool optimizing) const {
+LocationSummary* ConstraintInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool optimizing) const {
   UNREACHABLE();
   return NULL;
 }
@@ -2104,7 +2128,7 @@
 
 
 LocationSummary* MaterializeObjectInstr::MakeLocationSummary(
-    bool optimizing) const {
+    Isolate* isolate, bool optimizing) const {
   UNREACHABLE();
   return NULL;
 }
@@ -2153,17 +2177,19 @@
 }
 
 
-LocationSummary* StoreContextInstr::MakeLocationSummary(bool optimizing) const {
+LocationSummary* StoreContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool optimizing) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterLocation(CTX));
   return summary;
 }
 
 
-LocationSummary* PushTempInstr::MakeLocationSummary(bool optimizing) const {
+LocationSummary* PushTempInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool optimizing) const {
   return LocationSummary::Make(1,
                                Location::NoLocation(),
                                LocationSummary::kNoCall);
@@ -2176,7 +2202,8 @@
 }
 
 
-LocationSummary* DropTempsInstr::MakeLocationSummary(bool optimizing) const {
+LocationSummary* DropTempsInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool optimizing) const {
   return (InputCount() == 1)
       ? LocationSummary::Make(1,
                               Location::SameAsFirstInput(),
@@ -2212,7 +2239,8 @@
 }
 
 
-LocationSummary* InstanceCallInstr::MakeLocationSummary(bool optimizing) const {
+LocationSummary* InstanceCallInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool optimizing) const {
   return MakeCallSummary();
 }
 
@@ -2285,7 +2313,8 @@
 }
 
 
-LocationSummary* StaticCallInstr::MakeLocationSummary(bool optimizing) const {
+LocationSummary* StaticCallInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool optimizing) const {
   return MakeCallSummary();
 }
 
@@ -2317,37 +2346,38 @@
 }
 
 
-Environment* Environment::From(const GrowableArray<Definition*>& definitions,
+Environment* Environment::From(Isolate* isolate,
+                               const GrowableArray<Definition*>& definitions,
                                intptr_t fixed_parameter_count,
                                const Code& code) {
   Environment* env =
-      new Environment(definitions.length(),
-                      fixed_parameter_count,
-                      Isolate::kNoDeoptId,
-                      code,
-                      NULL);
+      new(isolate) Environment(definitions.length(),
+                               fixed_parameter_count,
+                               Isolate::kNoDeoptId,
+                               code,
+                               NULL);
   for (intptr_t i = 0; i < definitions.length(); ++i) {
-    env->values_.Add(new Value(definitions[i]));
+    env->values_.Add(new(isolate) Value(definitions[i]));
   }
   return env;
 }
 
 
-Environment* Environment::DeepCopy(intptr_t length) const {
+Environment* Environment::DeepCopy(Isolate* isolate, intptr_t length) const {
   ASSERT(length <= values_.length());
   Environment* copy =
-      new Environment(length,
-                      fixed_parameter_count_,
-                      deopt_id_,
-                      code_,
-                      (outer_ == NULL) ? NULL : outer_->DeepCopy());
+      new(isolate) Environment(
+          length,
+          fixed_parameter_count_,
+          deopt_id_,
+          code_,
+          (outer_ == NULL) ? NULL : outer_->DeepCopy(isolate));
   if (locations_ != NULL) {
-    Location* new_locations =
-        Isolate::Current()->current_zone()->Alloc<Location>(length);
+    Location* new_locations = isolate->current_zone()->Alloc<Location>(length);
     copy->set_locations(new_locations);
   }
   for (intptr_t i = 0; i < length; ++i) {
-    copy->values_.Add(values_[i]->Copy());
+    copy->values_.Add(values_[i]->Copy(isolate));
     if (locations_ != NULL) {
       copy->locations_[i] = locations_[i].Copy();
     }
@@ -2357,12 +2387,12 @@
 
 
 // Copies the environment and updates the environment use lists.
-void Environment::DeepCopyTo(Instruction* instr) const {
+void Environment::DeepCopyTo(Isolate* isolate, Instruction* instr) const {
   for (Environment::DeepIterator it(instr->env()); !it.Done(); it.Advance()) {
     it.CurrentValue()->RemoveFromUseList();
   }
 
-  Environment* copy = DeepCopy();
+  Environment* copy = DeepCopy(isolate);
   instr->SetEnvironment(copy);
   for (Environment::DeepIterator it(copy); !it.Done(); it.Advance()) {
     Value* value = it.CurrentValue();
@@ -2373,12 +2403,12 @@
 
 // Copies the environment as outer on an inlined instruction and updates the
 // environment use lists.
-void Environment::DeepCopyToOuter(Instruction* instr) const {
+void Environment::DeepCopyToOuter(Isolate* isolate, Instruction* instr) const {
   // Create a deep copy removing caller arguments from the environment.
   ASSERT(this != NULL);
   ASSERT(instr->env()->outer() == NULL);
   intptr_t argument_count = instr->env()->fixed_parameter_count();
-  Environment* copy = DeepCopy(values_.length() - argument_count);
+  Environment* copy = DeepCopy(isolate, values_.length() - argument_count);
   instr->env()->outer_ = copy;
   intptr_t use_index = instr->env()->Length();  // Start index after inner.
   for (Environment::DeepIterator it(copy); !it.Done(); it.Advance()) {
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index b1b982c..7c329a6 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -556,7 +556,7 @@
   inline void BindTo(Definition* definition);
   inline void BindToEnvironment(Definition* definition);
 
-  Value* Copy() { return new Value(definition_); }
+  Value* Copy(Isolate* isolate) { return new(isolate) Value(definition_); }
 
   // This function must only be used when the new Value is dominated by
   // the original Value.
@@ -797,7 +797,8 @@
   virtual void Accept(FlowGraphVisitor* visitor);                              \
   virtual type##Instr* As##type() { return this; }                             \
   virtual const char* DebugName() const { return #type; }                      \
-  virtual LocationSummary* MakeLocationSummary(bool optimizing) const;         \
+  virtual LocationSummary* MakeLocationSummary(Isolate* isolate,               \
+                                               bool optimizing) const;         \
   virtual void EmitNativeCode(FlowGraphCompiler* compiler);                    \
 
 
@@ -923,11 +924,12 @@
     return locs_;
   }
 
-  virtual LocationSummary* MakeLocationSummary(bool is_optimizing) const = 0;
+  virtual LocationSummary* MakeLocationSummary(Isolate* isolate,
+                                               bool is_optimizing) const = 0;
 
-  void InitializeLocationSummary(bool optimizing) {
+  void InitializeLocationSummary(Isolate* isolate, bool optimizing) {
     ASSERT(locs_ == NULL);
-    locs_ = MakeLocationSummary(optimizing);
+    locs_ = MakeLocationSummary(isolate, optimizing);
   }
 
   static LocationSummary* MakeCallSummary();
@@ -1024,7 +1026,7 @@
     return false;
   }
 
-  virtual void InheritDeoptTarget(Instruction* other);
+  virtual void InheritDeoptTarget(Isolate* isolate, Instruction* other);
 
   bool NeedsEnvironment() const {
     return CanDeoptimize() || CanBecomeDeoptimizationTarget();
@@ -1034,7 +1036,7 @@
     return false;
   }
 
-  void InheritDeoptTargetAfter(Instruction* other);
+  void InheritDeoptTargetAfter(Isolate* isolate, Instruction* other);
 
   virtual bool MayThrow() const = 0;
 
@@ -2414,7 +2416,7 @@
     return constant_target_;
   }
 
-  virtual void InheritDeoptTarget(Instruction* other);
+  virtual void InheritDeoptTarget(Isolate* isolate, Instruction* other);
 
   virtual bool MayThrow() const {
     return comparison()->MayThrow();
@@ -7846,7 +7848,8 @@
   };
 
   // Construct an environment by constructing uses from an array of definitions.
-  static Environment* From(const GrowableArray<Definition*>& definitions,
+  static Environment* From(Isolate* isolate,
+                           const GrowableArray<Definition*>& definitions,
                            intptr_t fixed_parameter_count,
                            const Code& code);
 
@@ -7890,10 +7893,12 @@
 
   const Code& code() const { return code_; }
 
-  Environment* DeepCopy() const { return DeepCopy(Length()); }
+  Environment* DeepCopy(Isolate* isolate) const {
+    return DeepCopy(isolate, Length());
+  }
 
-  void DeepCopyTo(Instruction* instr) const;
-  void DeepCopyToOuter(Instruction* instr) const;
+  void DeepCopyTo(Isolate* isolate, Instruction* instr) const;
+  void DeepCopyToOuter(Isolate* isolate, Instruction* instr) const;
 
   void PrintTo(BufferFormatter* f) const;
   const char* ToCString() const;
@@ -7901,7 +7906,7 @@
   // Deep copy an environment.  The 'length' parameter may be less than the
   // environment's length in order to drop values (e.g., passed arguments)
   // from the copy.
-  Environment* DeepCopy(intptr_t length) const;
+  Environment* DeepCopy(Isolate* isolate, intptr_t length) const;
 
  private:
   friend class ShallowIterator;
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index fd12d67..056a8e9 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -22,6 +22,7 @@
 
 namespace dart {
 
+DECLARE_FLAG(bool, emit_edge_counters);
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, propagate_ic_data);
 DECLARE_FLAG(bool, use_osr);
@@ -29,17 +30,20 @@
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register R0.
 LocationSummary* Instruction::MakeCallSummary() {
-  LocationSummary* result = new LocationSummary(0, 0, LocationSummary::kCall);
+  Isolate* isolate = Isolate::Current();
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(R0));
   return result;
 }
 
 
-LocationSummary* PushArgumentInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps= 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
   return locs;
 }
@@ -64,11 +68,12 @@
 }
 
 
-LocationSummary* ReturnInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ReturnInstr::MakeLocationSummary(Isolate* isolate,
+                                                  bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   return locs;
 }
@@ -123,8 +128,9 @@
 }
 
 
-LocationSummary* IfThenElseInstr::MakeLocationSummary(bool opt) const {
-  comparison()->InitializeLocationSummary(opt);
+LocationSummary* IfThenElseInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
+  comparison()->InitializeLocationSummary(isolate, opt);
   return comparison()->locs();
 }
 
@@ -182,11 +188,12 @@
 }
 
 
-LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ClosureCallInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // Function.
   summary->set_out(0, Location::RegisterLocation(R0));
   return summary;
@@ -232,7 +239,8 @@
 }
 
 
-LocationSummary* LoadLocalInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   return LocationSummary::Make(0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -245,7 +253,8 @@
 }
 
 
-LocationSummary* StoreLocalInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   return LocationSummary::Make(1,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
@@ -260,7 +269,8 @@
 }
 
 
-LocationSummary* ConstantInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
   return LocationSummary::Make(0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -276,11 +286,12 @@
 }
 
 
-LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_out(0, Location::RequiresFpuRegister());
   locs->set_temp(0, Location::RequiresRegister());
   return locs;
@@ -303,11 +314,12 @@
 }
 
 
-LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AssertAssignableInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // Value.
   summary->set_in(1, Location::RegisterLocation(R2));  // Instantiator.
   summary->set_in(2, Location::RegisterLocation(R1));  // Type arguments.
@@ -316,11 +328,12 @@
 }
 
 
-LocationSummary* AssertBooleanInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AssertBooleanInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -377,12 +390,13 @@
 }
 
 
-LocationSummary* EqualityCompareInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* EqualityCompareInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -392,8 +406,8 @@
   }
   if (operation_cid() == kDoubleCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -401,8 +415,8 @@
   }
   if (operation_cid() == kSmiCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
@@ -660,11 +674,12 @@
 }
 
 
-LocationSummary* TestSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* TestSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -704,11 +719,12 @@
 }
 
 
-LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* TestCidsInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
   locs->set_out(0, Location::RequiresRegister());
@@ -776,13 +792,14 @@
 }
 
 
-LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* RelationalOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -792,16 +809,16 @@
     return locs;
   }
   if (operation_cid() == kDoubleCid) {
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
   ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -874,11 +891,12 @@
 }
 
 
-LocationSummary* NativeCallInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 3;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(R1));
   locs->set_temp(1, Location::RegisterLocation(R2));
   locs->set_temp(2, Location::RegisterLocation(R5));
@@ -935,7 +953,8 @@
 }
 
 
-LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
   return LocationSummary::Make(kNumInputs,
@@ -954,7 +973,8 @@
 }
 
 
-LocationSummary* StringToCharCodeInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -974,11 +994,12 @@
 }
 
 
-LocationSummary* StringInterpolateInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StringInterpolateInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_out(0, Location::RegisterLocation(R0));
   return summary;
@@ -1000,7 +1021,8 @@
 }
 
 
-LocationSummary* LoadUntaggedInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -1015,7 +1037,8 @@
 }
 
 
-LocationSummary* LoadClassIdInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -1115,19 +1138,46 @@
 }
 
 
-LocationSummary* LoadIndexedInstr::MakeLocationSummary(bool opt) const {
+static bool CanBeImmediateIndex(Value* value,
+                                intptr_t cid,
+                                bool is_external,
+                                bool is_load) {
+  ConstantInstr* constant = value->definition()->AsConstant();
+  if ((constant == NULL) || !Assembler::IsSafeSmi(constant->value())) {
+    return false;
+  }
+  const int64_t index = Smi::Cast(constant->value()).AsInt64Value();
+  const intptr_t scale = Instance::ElementSizeFor(cid);
+  const int64_t offset = index * scale +
+      (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
+  if (!Utils::IsAbsoluteUint(12, offset)) {
+    return false;
+  }
+  int32_t offset_mask = 0;
+  if (is_load) {
+    return Address::CanHoldLoadOffset(Address::OperandSizeFor(cid),
+                                      offset,
+                                      &offset_mask);
+  } else {
+    return Address::CanHoldStoreOffset(Address::OperandSizeFor(cid),
+                                       offset,
+                                       &offset_mask);
+  }
+}
+
+
+LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
-  // The smi index is either untagged (element size == 1), or it is left smi
-  // tagged (for all element sizes > 1).
-  // TODO(regis): Revisit and see if the index can be immediate.
-  if (index_scale() == 2 && IsExternal()) {
-    locs->set_in(1, Location::RequiresRegister());
+  if (CanBeImmediateIndex(index(), class_id(), IsExternal(), true /*load*/)) {
+    // CanBeImmediateIndex must return false for unsafe smis.
+    locs->set_in(1, Location::Constant(index()->BoundConstant()));
   } else {
-    locs->set_in(1, Location::WritableRegister());
+    locs->set_in(1, Location::RequiresRegister());
   }
   if ((representation() == kUnboxedDouble)    ||
       (representation() == kUnboxedFloat32x4) ||
@@ -1152,36 +1202,81 @@
 }
 
 
+static Address ElementAddressForIntIndex(bool is_external,
+                                         intptr_t cid,
+                                         intptr_t index_scale,
+                                         Register array,
+                                         intptr_t index) {
+  const int64_t offset = static_cast<int64_t>(index) * index_scale +
+      (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
+  ASSERT(Utils::IsInt(32, offset));
+  return Address(array, static_cast<int32_t>(offset));
+}
+
+
+static Address ElementAddressForRegIndex(Assembler* assembler,
+                                         bool is_load,
+                                         bool is_external,
+                                         intptr_t cid,
+                                         intptr_t index_scale,
+                                         Register array,
+                                         Register index) {
+  // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays.
+  const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift;
+  int32_t offset =
+      is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag);
+  const OperandSize size = Address::OperandSizeFor(cid);
+  ASSERT(array != IP);
+  ASSERT(index != IP);
+  const Register base = is_load ? IP : index;
+  if ((offset != 0) ||
+      (size == kSWord) || (size == kDWord) || (size == kRegList)) {
+    if (shift < 0) {
+      ASSERT(shift == -1);
+      assembler->add(base, array, ShifterOperand(index, ASR, 1));
+    } else {
+      assembler->add(base, array, ShifterOperand(index, LSL, shift));
+    }
+  } else {
+    if (shift < 0) {
+      ASSERT(shift == -1);
+      return Address(array, index, ASR, 1);
+    } else {
+      return Address(array, index, LSL, shift);
+    }
+  }
+  int32_t offset_mask = 0;
+  if ((is_load && !Address::CanHoldLoadOffset(size,
+                                              offset,
+                                              &offset_mask)) ||
+      (!is_load && !Address::CanHoldStoreOffset(size,
+                                                offset,
+                                                &offset_mask))) {
+    assembler->AddImmediate(base, offset & ~offset_mask);
+    offset = offset & offset_mask;
+  }
+  return Address(base, offset);
+}
+
+
 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const Register array = locs()->in(0).reg();
+  const Location index = locs()->in(1);
+
+  Address element_address(kNoRegister, 0);
+  element_address = index.IsRegister()
+      ? ElementAddressForRegIndex(compiler->assembler(),
+                                  true,  // Load.
+                                  IsExternal(), class_id(), index_scale(),
+                                  array, index.reg())
+      : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
+                                  array, Smi::Cast(index.constant()).Value());
+  // Warning: element_address may use register IP as base.
+
   if ((representation() == kUnboxedDouble)    ||
       (representation() == kUnboxedFloat32x4) ||
       (representation() == kUnboxedInt32x4)   ||
       (representation() == kUnboxedFloat64x2)) {
-    const Register array = locs()->in(0).reg();
-    const Register idx = locs()->in(1).reg();
-    switch (index_scale()) {
-      case 1:
-        __ add(idx, array, ShifterOperand(idx, ASR, kSmiTagSize));
-        break;
-      case 4:
-        __ add(idx, array, ShifterOperand(idx, LSL, 1));
-        break;
-      case 8:
-        __ add(idx, array, ShifterOperand(idx, LSL, 2));
-        break;
-      case 16:
-        __ add(idx, array, ShifterOperand(idx, LSL, 3));
-        break;
-      default:
-        // Case 2 is not reachable: We don't have unboxed 16-bit sized loads.
-        UNREACHABLE();
-    }
-    if (!IsExternal()) {
-      ASSERT(this->array()->definition()->representation() == kTagged);
-      __ AddImmediate(idx,
-          FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag);
-    }
-    Address element_address(idx);
     const QRegister result = locs()->out(0).fpu_reg();
     const DRegister dresult0 = EvenDRegisterOf(result);
     switch (class_id()) {
@@ -1197,7 +1292,8 @@
       case kTypedDataFloat64x2ArrayCid:
       case kTypedDataInt32x4ArrayCid:
       case kTypedDataFloat32x4ArrayCid:
-        __ vldmd(IA, idx, dresult0, 2);
+        ASSERT(element_address.Equals(Address(IP)));
+        __ vldmd(IA, IP, dresult0, 2);
         break;
       default:
         UNREACHABLE();
@@ -1205,65 +1301,27 @@
     return;
   }
 
-  const Register array = locs()->in(0).reg();
-  Location index = locs()->in(1);
-  ASSERT(index.IsRegister());  // TODO(regis): Revisit.
-  Address element_address(kNoRegister, 0);
-  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
-  // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
-  // index is expected to be untagged before accessing.
-  ASSERT(kSmiTagShift == 1);
-  const intptr_t offset = IsExternal()
-      ? 0
-      : FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag;
-  switch (index_scale()) {
-    case 1: {
-      __ add(index.reg(), array, ShifterOperand(index.reg(), ASR, kSmiTagSize));
-      element_address = Address(index.reg(), offset);
-      break;
-    }
-    case 2: {
-      // No scaling needed, since index is a smi.
-      if (!IsExternal()) {
-        __ AddImmediate(index.reg(), index.reg(),
-            FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag);
-        element_address = Address(array, index.reg(), LSL, 0);
-      } else {
-        element_address = Address(array, index.reg(), LSL, 0);
-      }
-      break;
-    }
-    case 4: {
-      __ add(index.reg(), array, ShifterOperand(index.reg(), LSL, 1));
-      element_address = Address(index.reg(), offset);
-      break;
-    }
-    // Cases 8 and 16 are only for unboxed values and are handled above.
-    default:
-      UNREACHABLE();
-  }
-
   if (representation() == kUnboxedMint) {
     ASSERT(locs()->out(0).IsPairLocation());
     PairLocation* result_pair = locs()->out(0).AsPairLocation();
-    Register result1 = result_pair->At(0).reg();
-    Register result2 = result_pair->At(1).reg();
+    const Register result1 = result_pair->At(0).reg();
+    const Register result2 = result_pair->At(1).reg();
     switch (class_id()) {
       case kTypedDataInt32ArrayCid:
         // Load low word.
         __ ldr(result1, element_address);
         // Sign extend into high word.
         __ SignFill(result2, result1);
-      break;
+        break;
       case kTypedDataUint32ArrayCid:
         // Load low word.
         __ ldr(result1, element_address);
         // Zero high word.
         __ eor(result2, result2, ShifterOperand(result2));
-      break;
+        break;
       default:
         UNREACHABLE();
-      break;
+        break;
     }
     return;
   }
@@ -1359,16 +1417,19 @@
 }
 
 
-LocationSummary* StoreIndexedInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
-  // The smi index is either untagged (element size == 1), or it is left smi
-  // tagged (for all element sizes > 1).
-  // TODO(regis): Revisit and see if the index can be immediate.
-  locs->set_in(1, Location::WritableRegister());
+  if (CanBeImmediateIndex(index(), class_id(), IsExternal(), false /*store*/)) {
+    // CanBeImmediateIndex must return false for unsafe smis.
+    locs->set_in(1, Location::Constant(index()->BoundConstant()));
+  } else {
+    locs->set_in(1, Location::WritableRegister());
+  }
   switch (class_id()) {
     case kArrayCid:
       locs->set_in(2, ShouldEmitStoreBarrier()
@@ -1417,98 +1478,17 @@
 
 
 void StoreIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  if ((class_id() == kTypedDataFloat32ArrayCid) ||
-      (class_id() == kTypedDataFloat64ArrayCid) ||
-      (class_id() == kTypedDataFloat32x4ArrayCid) ||
-      (class_id() == kTypedDataFloat64x2ArrayCid) ||
-      (class_id() == kTypedDataInt32x4ArrayCid)) {
-    const Register array = locs()->in(0).reg();
-    const Register idx = locs()->in(1).reg();
-    Location value = locs()->in(2);
-    switch (index_scale()) {
-      case 1:
-        __ add(idx, array, ShifterOperand(idx, ASR, kSmiTagSize));
-        break;
-      case 4:
-        __ add(idx, array, ShifterOperand(idx, LSL, 1));
-        break;
-      case 8:
-        __ add(idx, array, ShifterOperand(idx, LSL, 2));
-        break;
-      case 16:
-        __ add(idx, array, ShifterOperand(idx, LSL, 3));
-        break;
-      default:
-        // Case 2 is not reachable: We don't have unboxed 16-bit sized loads.
-        UNREACHABLE();
-    }
-    if (!IsExternal()) {
-      ASSERT(this->array()->definition()->representation() == kTagged);
-      __ AddImmediate(idx,
-          FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag);
-    }
-    switch (class_id()) {
-      case kTypedDataFloat32ArrayCid: {
-        const SRegister value_reg =
-            EvenSRegisterOf(EvenDRegisterOf(value.fpu_reg()));
-        __ StoreSToOffset(value_reg, idx, 0);
-        break;
-      }
-      case kTypedDataFloat64ArrayCid: {
-        const DRegister value_reg = EvenDRegisterOf(value.fpu_reg());
-        __ StoreDToOffset(value_reg, idx, 0);
-        break;
-      }
-      case kTypedDataFloat64x2ArrayCid:
-      case kTypedDataInt32x4ArrayCid:
-      case kTypedDataFloat32x4ArrayCid: {
-        const DRegister value_reg = EvenDRegisterOf(value.fpu_reg());
-        __ vstmd(IA, idx, value_reg, 2);
-        break;
-      }
-      default:
-        UNREACHABLE();
-    }
-    return;
-  }
-
   const Register array = locs()->in(0).reg();
   Location index = locs()->in(1);
 
   Address element_address(kNoRegister, 0);
-  ASSERT(index.IsRegister());  // TODO(regis): Revisit.
-  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
-  // with index scale factor > 1. E.g., for Uint8Array and OneByteString the
-  // index is expected to be untagged before accessing.
-  ASSERT(kSmiTagShift == 1);
-  const intptr_t offset = IsExternal()
-      ? 0
-      : FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag;
-  switch (index_scale()) {
-    case 1: {
-      __ add(index.reg(), array, ShifterOperand(index.reg(), ASR, kSmiTagSize));
-      element_address = Address(index.reg(), offset);
-      break;
-    }
-    case 2: {
-      // No scaling needed, since index is a smi.
-      if (!IsExternal()) {
-        __ AddImmediate(index.reg(), index.reg(), offset);
-        element_address = Address(array, index.reg(), LSL, 0);
-      } else {
-        element_address = Address(array, index.reg(), LSL, 0);
-      }
-      break;
-    }
-    case 4: {
-      __ add(index.reg(), array, ShifterOperand(index.reg(), LSL, 1));
-      element_address = Address(index.reg(), offset);
-      break;
-    }
-    // Cases 8 and 16 are only for unboxed values and are handled above.
-    default:
-      UNREACHABLE();
-  }
+  element_address = index.IsRegister()
+  ? ElementAddressForRegIndex(compiler->assembler(),
+                              false,  // Store.
+                              IsExternal(), class_id(), index_scale(),
+                              array, index.reg())
+  : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
+                              array, Smi::Cast(index.constant()).Value());
 
   switch (class_id()) {
     case kArrayCid:
@@ -1587,16 +1567,36 @@
       }
       break;
     }
+    case kTypedDataFloat32ArrayCid: {
+      const SRegister value_reg =
+          EvenSRegisterOf(EvenDRegisterOf(locs()->in(2).fpu_reg()));
+      __ vstrs(value_reg, element_address);
+      break;
+    }
+    case kTypedDataFloat64ArrayCid: {
+      const DRegister value_reg = EvenDRegisterOf(locs()->in(2).fpu_reg());
+      __ vstrd(value_reg, element_address);
+      break;
+    }
+    case kTypedDataFloat64x2ArrayCid:
+    case kTypedDataInt32x4ArrayCid:
+    case kTypedDataFloat32x4ArrayCid: {
+      ASSERT(element_address.Equals(Address(index.reg())));
+      const DRegister value_reg = EvenDRegisterOf(locs()->in(2).fpu_reg());
+      __ vstmd(IA, index.reg(), value_reg, 2);
+      break;
+    }
     default:
       UNREACHABLE();
   }
 }
 
 
-LocationSummary* GuardFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* GuardFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, 0, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   const bool field_has_length = field().needs_length_check();
   summary->AddTemp(Location::RequiresRegister());
@@ -1947,11 +1947,12 @@
 };
 
 
-LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps,
           !field().IsNull() &&
           ((field().guarded_cid() == kIllegalCid) || is_initialization_)
           ? LocationSummary::kCallOnSlowPath
@@ -2188,11 +2189,12 @@
 }
 
 
-LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -2212,8 +2214,10 @@
 }
 
 
-LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(bool opt) const {
-  LocationSummary* locs = new LocationSummary(1, 1, LocationSummary::kNoCall);
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, 1, 1, LocationSummary::kNoCall);
   locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
                                               : Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
@@ -2236,11 +2240,12 @@
 }
 
 
-LocationSummary* InstanceOfInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* InstanceOfInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_in(1, Location::RegisterLocation(R2));
   summary->set_in(2, Location::RegisterLocation(R1));
@@ -2263,11 +2268,12 @@
 }
 
 
-LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CreateArrayInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(kElementTypePos, Location::RegisterLocation(R1));
   locs->set_in(kLengthPos, Location::RegisterLocation(R2));
   locs->set_out(0, Location::RegisterLocation(R0));
@@ -2483,12 +2489,12 @@
 };
 
 
-LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(
-          kNumInputs, kNumTemps,
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps,
           (opt && !IsPotentialUnboxedLoad())
           ? LocationSummary::kNoCall
           : LocationSummary::kCallOnSlowPath);
@@ -2631,11 +2637,12 @@
 }
 
 
-LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2663,11 +2670,11 @@
 
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2731,11 +2738,12 @@
 }
 
 
-LocationSummary* AllocateContextInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(R1));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2756,11 +2764,12 @@
 }
 
 
-LocationSummary* CloneContextInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2783,7 +2792,8 @@
 }
 
 
-LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   UNREACHABLE();
   return NULL;
 }
@@ -2820,11 +2830,12 @@
 }
 
 
-LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_temp(0, Location::RequiresRegister());
@@ -3022,11 +3033,12 @@
 }
 
 
-LocationSummary* BinarySmiOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (op_kind() == Token::kTRUNCDIV) {
     summary->set_in(0, Location::RequiresRegister());
     if (RightIsPowerOfTwoConstant()) {
@@ -3387,14 +3399,15 @@
 }
 
 
-LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-    new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   return summary;
@@ -3422,11 +3435,12 @@
 }
 
 
-LocationSummary* BoxDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
@@ -3452,14 +3466,15 @@
 }
 
 
-LocationSummary* UnboxDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t value_cid = value()->Type()->ToCid();
   const bool needs_temp = ((value_cid != kSmiCid) && (value_cid != kDoubleCid));
   const bool needs_writable_input = (value_cid == kSmiCid);
   const intptr_t kNumTemps = needs_temp ? 1 : 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, needs_writable_input
                      ? Location::WritableRegister()
                      : Location::RequiresRegister());
@@ -3512,11 +3527,12 @@
 }
 
 
-LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
@@ -3545,12 +3561,13 @@
 }
 
 
-LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxFloat32x4Instr::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 == kFloat32x4Cid ? 0 : 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (kNumTemps > 0) {
     ASSERT(kNumTemps == 1);
@@ -3581,11 +3598,12 @@
 }
 
 
-LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
@@ -3614,12 +3632,13 @@
 }
 
 
-LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxFloat64x2Instr::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 == kFloat64x2Cid ? 0 : 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (kNumTemps > 0) {
     ASSERT(kNumTemps == 1);
@@ -3650,11 +3669,12 @@
 }
 
 
-LocationSummary* BoxInt32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
@@ -3714,12 +3734,13 @@
 }
 
 
-LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxInt32x4Instr::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 == kInt32x4Cid ? 0 : 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (kNumTemps > 0) {
     ASSERT(kNumTemps == 1);
@@ -3750,11 +3771,12 @@
 }
 
 
-LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3776,11 +3798,12 @@
 }
 
 
-LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3803,11 +3826,12 @@
 }
 
 
-LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3851,11 +3875,12 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   // Low (< Q7) Q registers are needed for the vcvtds and vmovs instructions.
   summary->set_in(0, Location::FpuRegisterLocation(Q5));
   summary->set_out(0, Location::FpuRegisterLocation(Q6));
@@ -3875,6 +3900,10 @@
 
   const DRegister dvalue0 = EvenDRegisterOf(value);
   const DRegister dvalue1 = OddDRegisterOf(value);
+  const SRegister svalue0 = EvenSRegisterOf(dvalue0);
+  const SRegister svalue1 = OddSRegisterOf(dvalue0);
+  const SRegister svalue2 = EvenSRegisterOf(dvalue1);
+  const SRegister svalue3 = OddSRegisterOf(dvalue1);
 
   const DRegister dtemp0 = DTMP;
   const DRegister dtemp1 = OddDRegisterOf(QTMP);
@@ -3884,20 +3913,16 @@
 
   switch (op_kind()) {
     case MethodRecognizer::kFloat32x4ShuffleX:
-      __ vdup(kWord, result, dvalue0, 0);
-      __ vcvtds(dresult0, sresult0);
+      __ vcvtds(dresult0, svalue0);
       break;
     case MethodRecognizer::kFloat32x4ShuffleY:
-      __ vdup(kWord, result, dvalue0, 1);
-      __ vcvtds(dresult0, sresult0);
+      __ vcvtds(dresult0, svalue1);
       break;
     case MethodRecognizer::kFloat32x4ShuffleZ:
-      __ vdup(kWord, result, dvalue1, 0);
-      __ vcvtds(dresult0, sresult0);
+      __ vcvtds(dresult0, svalue2);
       break;
     case MethodRecognizer::kFloat32x4ShuffleW:
-      __ vdup(kWord, result, dvalue1, 1);
-      __ vcvtds(dresult0, sresult0);
+      __ vcvtds(dresult0, svalue3);
       break;
     case MethodRecognizer::kInt32x4Shuffle:
     case MethodRecognizer::kFloat32x4Shuffle:
@@ -3931,11 +3956,12 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   // Low (< Q7) Q registers are needed for the vcvtds and vmovs instructions.
   summary->set_in(0, Location::FpuRegisterLocation(Q4));
   summary->set_in(1, Location::FpuRegisterLocation(Q5));
@@ -3987,11 +4013,12 @@
 }
 
 
-LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::FpuRegisterLocation(Q5));
   summary->set_temp(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
@@ -4028,11 +4055,11 @@
 
 
 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4060,11 +4087,12 @@
 }
 
 
-LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -4076,11 +4104,12 @@
 }
 
 
-LocationSummary* Float32x4SplatInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4101,11 +4130,12 @@
 }
 
 
-LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4145,11 +4175,12 @@
 }
 
 
-LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4174,11 +4205,12 @@
 }
 
 
-LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RequiresFpuRegister());
@@ -4206,11 +4238,12 @@
 }
 
 
-LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4234,11 +4267,12 @@
 }
 
 
-LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4261,11 +4295,12 @@
 }
 
 
-LocationSummary* Float32x4ClampInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4284,11 +4319,12 @@
 }
 
 
-LocationSummary* Float32x4WithInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4WithInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   // Low (< 7) Q registers are needed for the vmovs instruction.
@@ -4332,11 +4368,12 @@
 }
 
 
-LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4353,11 +4390,12 @@
 }
 
 
-LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4386,11 +4424,12 @@
 }
 
 
-LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -4402,11 +4441,12 @@
 }
 
 
-LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4430,11 +4470,11 @@
 
 
 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4459,11 +4499,11 @@
 
 
 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   // Low (< 7) Q registers are needed for the vcvtsd instruction.
   summary->set_out(0, Location::FpuRegisterLocation(Q6));
@@ -4490,11 +4530,11 @@
 
 
 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   // Low (< 7) Q registers are needed for the vcvtsd instruction.
   summary->set_out(0, Location::FpuRegisterLocation(Q6));
@@ -4518,11 +4558,12 @@
 }
 
 
-LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
 
   if (representation() == kTagged) {
     ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
@@ -4585,11 +4626,12 @@
 }
 
 
-LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4658,11 +4700,11 @@
 
 
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  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());
@@ -4705,11 +4747,12 @@
 }
 
 
-LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   // Low (< 7) Q registers are needed for the vmovrs instruction.
   summary->set_in(0, Location::FpuRegisterLocation(Q6));
   summary->set_out(0, Location::RequiresRegister());
@@ -4750,11 +4793,12 @@
 }
 
 
-LocationSummary* Int32x4SelectInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4784,11 +4828,12 @@
 }
 
 
-LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Low (< 7) Q register needed for the vmovsr instruction.
@@ -4834,11 +4879,12 @@
 }
 
 
-LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4855,11 +4901,12 @@
 }
 
 
-LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -4872,35 +4919,23 @@
   const QRegister right = locs()->in(1).fpu_reg();
   const QRegister result = locs()->out(0).fpu_reg();
   switch (op_kind()) {
-    case Token::kBIT_AND: {
-      __ vandq(result, left, right);
-      break;
-    }
-    case Token::kBIT_OR: {
-      __ vorrq(result, left, right);
-      break;
-    }
-    case Token::kBIT_XOR: {
-      __ veorq(result, left, right);
-      break;
-    }
-    case Token::kADD:
-      __ vaddqi(kWord, result, left, right);
-      break;
-    case Token::kSUB:
-      __ vsubqi(kWord, result, left, right);
-      break;
+    case Token::kBIT_AND: __ vandq(result, left, right); break;
+    case Token::kBIT_OR: __ vorrq(result, left, right); break;
+    case Token::kBIT_XOR: __ veorq(result, left, right); break;
+    case Token::kADD: __ vaddqi(kWord, result, left, right); break;
+    case Token::kSUB: __ vsubqi(kWord, result, left, right); break;
     default: UNREACHABLE();
   }
 }
 
 
-LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
     summary->set_in(0, Location::FpuRegisterLocation(Q0));
     summary->set_out(0, Location::FpuRegisterLocation(Q0));
     if (!TargetCPUFeatures::hardfp_supported()) {
@@ -4915,8 +4950,8 @@
          (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -4951,12 +4986,13 @@
 }
 
 
-LocationSummary* MathMinMaxInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* MathMinMaxInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     // Reuse the left register so that code can be made shorter.
@@ -4967,8 +5003,8 @@
   ASSERT(result_cid() == kSmiCid);
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Reuse the left register so that code can be made shorter.
@@ -5036,11 +5072,12 @@
 }
 
 
-LocationSummary* UnarySmiOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // We make use of 3-operand instructions by not requiring result register
   // to be identical to first input register as on Intel.
@@ -5070,11 +5107,12 @@
 }
 
 
-LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -5088,11 +5126,12 @@
 }
 
 
-LocationSummary* SmiToDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::WritableRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -5108,11 +5147,12 @@
 }
 
 
-LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::RegisterLocation(R1));
   result->set_out(0, Location::RegisterLocation(R0));
   return result;
@@ -5160,11 +5200,12 @@
 }
 
 
-LocationSummary* DoubleToSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new LocationSummary(
-      kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresRegister());
   return result;
@@ -5190,7 +5231,8 @@
 }
 
 
-LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -5201,11 +5243,12 @@
 }
 
 
-LocationSummary* DoubleToFloatInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   // Low (<= Q7) Q registers are needed for the conversion instructions.
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::FpuRegisterLocation(Q7));
@@ -5221,11 +5264,12 @@
 }
 
 
-LocationSummary* FloatToDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   // Low (<= Q7) Q registers are needed for the conversion instructions.
   result->set_in(0, Location::FpuRegisterLocation(Q7));
   result->set_out(0, Location::RequiresFpuRegister());
@@ -5241,11 +5285,12 @@
 }
 
 
-LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
   ASSERT((InputCount() == 1) || (InputCount() == 2));
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, InputCount(), kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::FpuRegisterLocation(Q0));
   if (InputCount() == 2) {
     result->set_in(1, Location::FpuRegisterLocation(Q1));
@@ -5424,12 +5469,13 @@
 }
 
 
-LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   // Only use this instruction in optimized code.
   ASSERT(opt);
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, 0, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     if (index() == 0) {
       summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
@@ -5473,12 +5519,13 @@
 }
 
 
-LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* MergedMathInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 2;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
@@ -5556,7 +5603,7 @@
 
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   return MakeCallSummary();
 }
 
@@ -5599,8 +5646,9 @@
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(bool opt) const {
-  comparison()->InitializeLocationSummary(opt);
+LocationSummary* BranchInstr::MakeLocationSummary(Isolate* isolate,
+                                                  bool opt) const {
+  comparison()->InitializeLocationSummary(isolate, opt);
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
   return comparison()->locs();
@@ -5612,11 +5660,12 @@
 }
 
 
-LocationSummary* CheckClassInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->AddTemp(Location::RequiresRegister());
@@ -5666,11 +5715,12 @@
 }
 
 
-LocationSummary* CheckSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5684,11 +5734,12 @@
 }
 
 
-LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
   locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
   return locs;
@@ -5752,11 +5803,12 @@
 }
 
 
-LocationSummary* UnboxIntegerInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxIntegerInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
   summary->set_out(0,  Location::Pair(Location::RequiresRegister(),
@@ -5828,11 +5880,12 @@
 }
 
 
-LocationSummary* BoxIntegerInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
@@ -5934,11 +5987,12 @@
 }
 
 
-LocationSummary* BinaryMintOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -6007,11 +6061,12 @@
 }
 
 
-LocationSummary* ShiftMintOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_in(1, Location::WritableRegister());
@@ -6098,11 +6153,12 @@
 }
 
 
-LocationSummary* UnaryMintOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_out(0, Location::Pair(Location::RequiresRegister(),
@@ -6134,8 +6190,9 @@
 }
 
 
-LocationSummary* ThrowInstr::MakeLocationSummary(bool opt) const {
-  return new LocationSummary(0, 0, LocationSummary::kCall);
+LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
+                                                 bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -6149,8 +6206,9 @@
 }
 
 
-LocationSummary* ReThrowInstr::MakeLocationSummary(bool opt) const {
-  return new LocationSummary(0, 0, LocationSummary::kCall);
+LocationSummary* ReThrowInstr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -6175,7 +6233,9 @@
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    compiler->EmitEdgeCounter();
+    if (FLAG_emit_edge_counters) {
+      compiler->EmitEdgeCounter();
+    }
     // Add an edge counter.
     // On ARM the deoptimization descriptor points after the edge counter
     // code so that we can reuse the same pattern matching code as at call
@@ -6190,14 +6250,17 @@
 }
 
 
-LocationSummary* GotoInstr::MakeLocationSummary(bool opt) const {
-  return new LocationSummary(0, 0, LocationSummary::kNoCall);
+LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate,
+                                                bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
 }
 
 
 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   if (!compiler->is_optimizing()) {
-    compiler->EmitEdgeCounter();
+    if (FLAG_emit_edge_counters) {
+      compiler->EmitEdgeCounter();
+    }
     // Add a deoptimization descriptor for deoptimizing instructions that
     // may be inserted before this instruction.  On ARM this descriptor
     // points after the edge counter code so that we can reuse the same
@@ -6219,7 +6282,8 @@
 }
 
 
-LocationSummary* CurrentContextInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   return LocationSummary::Make(0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -6231,19 +6295,20 @@
 }
 
 
-LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StrictCompareInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (needs_number_check()) {
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
     locs->set_in(0, Location::RegisterLocation(R0));
     locs->set_in(1, Location::RegisterLocation(R1));
     locs->set_out(0, Location::RegisterLocation(R0));
     return locs;
   }
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
@@ -6304,7 +6369,8 @@
 }
 
 
-LocationSummary* BooleanNegateInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   return LocationSummary::Make(1,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -6321,7 +6387,8 @@
 }
 
 
-LocationSummary* AllocateObjectInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   return MakeCallSummary();
 }
 
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 8564de6..b33c192 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -21,23 +21,27 @@
 
 namespace dart {
 
+DECLARE_FLAG(bool, emit_edge_counters);
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, use_osr);
 
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register R0.
 LocationSummary* Instruction::MakeCallSummary() {
-  LocationSummary* result = new LocationSummary(0, 0, LocationSummary::kCall);
+  Isolate* isolate = Isolate::Current();
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(R0));
   return result;
 }
 
 
-LocationSummary* PushArgumentInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps= 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
   return locs;
 }
@@ -62,11 +66,12 @@
 }
 
 
-LocationSummary* ReturnInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ReturnInstr::MakeLocationSummary(Isolate* isolate,
+                                                  bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   return locs;
 }
@@ -123,8 +128,9 @@
 }
 
 
-LocationSummary* IfThenElseInstr::MakeLocationSummary(bool opt) const {
-  comparison()->InitializeLocationSummary(opt);
+LocationSummary* IfThenElseInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
+  comparison()->InitializeLocationSummary(isolate, opt);
   return comparison()->locs();
 }
 
@@ -179,11 +185,12 @@
 }
 
 
-LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ClosureCallInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // Function.
   summary->set_out(0, Location::RegisterLocation(R0));
   return summary;
@@ -229,7 +236,8 @@
 }
 
 
-LocationSummary* LoadLocalInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   return LocationSummary::Make(0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -242,7 +250,8 @@
 }
 
 
-LocationSummary* StoreLocalInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   return LocationSummary::Make(1,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
@@ -257,7 +266,8 @@
 }
 
 
-LocationSummary* ConstantInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
   return LocationSummary::Make(0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -273,7 +283,8 @@
 }
 
 
-LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 0;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresFpuRegister(),
@@ -289,11 +300,12 @@
 }
 
 
-LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AssertAssignableInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));  // Value.
   summary->set_in(1, Location::RegisterLocation(R2));  // Instantiator.
   summary->set_in(2, Location::RegisterLocation(R1));  // Type arguments.
@@ -302,11 +314,12 @@
 }
 
 
-LocationSummary* AssertBooleanInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AssertBooleanInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -422,12 +435,13 @@
 }
 
 
-LocationSummary* EqualityCompareInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* EqualityCompareInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kDoubleCid) {
     const intptr_t kNumTemps =  0;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -435,8 +449,8 @@
   }
   if (operation_cid() == kSmiCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
@@ -528,11 +542,12 @@
 }
 
 
-LocationSummary* TestSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* TestSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -572,11 +587,12 @@
 }
 
 
-LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* TestCidsInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
   locs->set_out(0, Location::RequiresRegister());
@@ -646,20 +662,21 @@
 }
 
 
-LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* RelationalOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kDoubleCid) {
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
   ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -718,11 +735,12 @@
 }
 
 
-LocationSummary* NativeCallInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 3;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(R1));
   locs->set_temp(1, Location::RegisterLocation(R2));
   locs->set_temp(2, Location::RegisterLocation(R5));
@@ -779,7 +797,8 @@
 }
 
 
-LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
   return LocationSummary::Make(kNumInputs,
@@ -800,7 +819,8 @@
 }
 
 
-LocationSummary* StringToCharCodeInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -821,11 +841,12 @@
 }
 
 
-LocationSummary* StringInterpolateInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StringInterpolateInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_out(0, Location::RegisterLocation(R0));
   return summary;
@@ -847,7 +868,8 @@
 }
 
 
-LocationSummary* LoadUntaggedInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -862,7 +884,8 @@
 }
 
 
-LocationSummary* LoadClassIdInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -953,11 +976,12 @@
 }
 
 
-LocationSummary* LoadIndexedInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // The smi index is either untagged (element size == 1), or it is left smi
   // tagged (for all element sizes > 1).
@@ -986,7 +1010,7 @@
   intptr_t offset = 0;
   if (!IsExternal()) {
     ASSERT(this->array()->definition()->representation() == kTagged);
-    offset = FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag;
+    offset = Instance::DataOffsetFor(class_id()) - kHeapObjectTag;
   }
 
   // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
@@ -1121,11 +1145,12 @@
 }
 
 
-LocationSummary* StoreIndexedInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // The smi index is either untagged (element size == 1), or it is left smi
   // tagged (for all element sizes > 1).
@@ -1179,7 +1204,7 @@
   intptr_t offset = 0;
   if (!IsExternal()) {
     ASSERT(this->array()->definition()->representation() == kTagged);
-    offset = FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag;
+    offset = Instance::DataOffsetFor(class_id()) - kHeapObjectTag;
   }
 
   // Note that index is expected smi-tagged, (i.e, times 2) for all arrays
@@ -1333,10 +1358,11 @@
 }
 
 
-LocationSummary* GuardFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* GuardFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, 0, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   const bool field_has_length = field().needs_length_check();
   summary->AddTemp(Location::RequiresRegister());
@@ -1686,15 +1712,16 @@
 };
 
 
-LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps,
-          !field().IsNull() &&
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps,
+      !field().IsNull() &&
           ((field().guarded_cid() == kIllegalCid) || is_initialization_)
-          ? LocationSummary::kCallOnSlowPath
-          : LocationSummary::kNoCall);
+              ? LocationSummary::kCallOnSlowPath
+              : LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   if (IsUnboxedStore() && opt) {
@@ -1918,11 +1945,12 @@
 }
 
 
-LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -1941,8 +1969,10 @@
 }
 
 
-LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(bool opt) const {
-  LocationSummary* locs = new LocationSummary(1, 1, LocationSummary::kNoCall);
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, 1, 1, LocationSummary::kNoCall);
   locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
                                               : Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
@@ -1964,11 +1994,12 @@
 }
 
 
-LocationSummary* InstanceOfInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* InstanceOfInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(R0));
   summary->set_in(1, Location::RegisterLocation(R2));
   summary->set_in(2, Location::RegisterLocation(R1));
@@ -1991,11 +2022,12 @@
 }
 
 
-LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CreateArrayInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(kElementTypePos, Location::RegisterLocation(R1));
   locs->set_in(kLengthPos, Location::RegisterLocation(R2));
   locs->set_out(0, Location::RegisterLocation(R0));
@@ -2111,13 +2143,13 @@
 };
 
 
-LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(
-          kNumInputs, kNumTemps,
-          (opt && !IsPotentialUnboxedLoad())
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps,
+      (opt && !IsPotentialUnboxedLoad())
           ? LocationSummary::kNoCall
           : LocationSummary::kCallOnSlowPath);
 
@@ -2251,11 +2283,12 @@
 }
 
 
-LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2283,11 +2316,11 @@
 
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2350,11 +2383,12 @@
 }
 
 
-LocationSummary* AllocateContextInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(R1));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2375,11 +2409,12 @@
 }
 
 
-LocationSummary* CloneContextInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(R0));
   locs->set_out(0, Location::RegisterLocation(R0));
   return locs;
@@ -2402,7 +2437,8 @@
 }
 
 
-LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   UNREACHABLE();
   return NULL;
 }
@@ -2439,13 +2475,12 @@
 }
 
 
-LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_temp(0, Location::RequiresRegister());
   return summary;
 }
@@ -2666,11 +2701,12 @@
 }
 
 
-LocationSummary* BinarySmiOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (op_kind() == Token::kTRUNCDIV) {
     summary->set_in(0, Location::RequiresRegister());
     if (RightIsPowerOfTwoConstant()) {
@@ -2988,14 +3024,15 @@
 }
 
 
-LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-    new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   return summary;
@@ -3021,13 +3058,12 @@
 }
 
 
-LocationSummary* BoxDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3050,11 +3086,12 @@
 }
 
 
-LocationSummary* UnboxDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3098,13 +3135,12 @@
 }
 
 
-LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3128,11 +3164,12 @@
 }
 
 
-LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3156,13 +3193,12 @@
 }
 
 
-LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3186,11 +3222,12 @@
 }
 
 
-LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3214,13 +3251,12 @@
 }
 
 
-LocationSummary* BoxInt32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3276,11 +3312,12 @@
 }
 
 
-LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3304,11 +3341,12 @@
 }
 
 
-LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3330,11 +3368,12 @@
 }
 
 
-LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3357,11 +3396,12 @@
 }
 
 
-LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3384,45 +3424,136 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void Simd32x4ShuffleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister value = locs()->in(0).fpu_reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat32x4ShuffleX:
+      __ vinss(result, 0, value, 0);
+      __ fcvtds(result, result);
+      break;
+    case MethodRecognizer::kFloat32x4ShuffleY:
+      __ vinss(result, 0, value, 1);
+      __ fcvtds(result, result);
+      break;
+    case MethodRecognizer::kFloat32x4ShuffleZ:
+      __ vinss(result, 0, value, 2);
+      __ fcvtds(result, result);
+      break;
+    case MethodRecognizer::kFloat32x4ShuffleW:
+      __ vinss(result, 0, value, 3);
+      __ fcvtds(result, result);
+      break;
+    case MethodRecognizer::kInt32x4Shuffle:
+    case MethodRecognizer::kFloat32x4Shuffle:
+      if (mask_ == 0x00) {
+        __ vdups(result, value, 0);
+      } else if (mask_ == 0x55) {
+        __ vdups(result, value, 1);
+      } else if (mask_ == 0xAA) {
+        __ vdups(result, value, 2);
+      } else  if (mask_ == 0xFF) {
+        __ vdups(result, value, 3);
+      } else {
+        __ vinss(result, 0, value, mask_ & 0x3);
+        __ vinss(result, 1, value, (mask_ >> 2) & 0x3);
+        __ vinss(result, 2, value, (mask_ >> 4) & 0x3);
+        __ vinss(result, 3, value, (mask_ >> 6) & 0x3);
+      }
+      break;
+    default: UNREACHABLE();
+  }
 }
 
 
-LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void Simd32x4ShuffleMixInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister left = locs()->in(0).fpu_reg();
+  const VRegister right = locs()->in(1).fpu_reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat32x4ShuffleMix:
+    case MethodRecognizer::kInt32x4ShuffleMix:
+      __ vinss(result, 0, left, mask_ & 0x3);
+      __ vinss(result, 1, left, (mask_ >> 2) & 0x3);
+      __ vinss(result, 2, right, (mask_ >> 4) & 0x3);
+      __ vinss(result, 3, right, (mask_ >> 6) & 0x3);
+      break;
+    default: UNREACHABLE();
+  }
 }
 
 
-LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* summary =  new LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_temp(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
 }
 
 
 void Simd32x4GetSignMaskInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister value = locs()->in(0).fpu_reg();
+  const Register out = locs()->out(0).reg();
+  const Register temp = locs()->temp(0).reg();
+
+  // X lane.
+  __ vmovrs(out, value, 0);
+  __ Lsr(out, out, 31);
+  // Y lane.
+  __ vmovrs(temp, value, 1);
+  __ Lsr(temp, temp, 31);
+  __ orr(out, out, Operand(temp, LSL, 1));
+  // Z lane.
+  __ vmovrs(temp, value, 2);
+  __ Lsr(temp, temp, 31);
+  __ orr(out, out, Operand(temp, LSL, 2));
+  // W lane.
+  __ vmovrs(temp, value, 3);
+  __ Lsr(temp, temp, 31);
+  __ orr(out, out, Operand(temp, LSL, 3));
+  // Tag.
+  __ SmiTag(out);
 }
 
 
 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -3439,22 +3570,23 @@
   const VRegister v3 = locs()->in(3).fpu_reg();
   const VRegister r = locs()->out(0).fpu_reg();
 
-  __ fcvtsd(v0, v0);
-  __ vinss(r, 0, v0, 0);
-  __ fcvtsd(v1, v1);
-  __ vinss(r, 1, v1, 1);
-  __ fcvtsd(v2, v2);
-  __ vinss(r, 2, v2, 2);
-  __ fcvtsd(v3, v3);
-  __ vinss(r, 3, v3, 3);
+  __ fcvtsd(VTMP, v0);
+  __ vinss(r, 0, VTMP, 0);
+  __ fcvtsd(VTMP, v1);
+  __ vinss(r, 1, VTMP, 0);
+  __ fcvtsd(VTMP, v2);
+  __ vinss(r, 2, VTMP, 0);
+  __ fcvtsd(VTMP, v3);
+  __ vinss(r, 3, VTMP, 0);
 }
 
 
-LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -3462,15 +3594,16 @@
 
 void Float32x4ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const VRegister v = locs()->out(0).fpu_reg();
-  __ LoadDImmediate(v, 0.0, PP);
+  __ veor(v, v, v);
 }
 
 
-LocationSummary* Float32x4SplatInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3489,7 +3622,8 @@
 }
 
 
-LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3500,7 +3634,8 @@
 }
 
 
-LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3511,7 +3646,8 @@
 }
 
 
-LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3522,11 +3658,12 @@
 }
 
 
-LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3550,18 +3687,36 @@
 }
 
 
-LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void Float32x4ZeroArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister left = locs()->in(0).fpu_reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat32x4Negate:
+      __ vnegs(result, left);
+      break;
+    case MethodRecognizer::kFloat32x4Absolute:
+      __ vabss(result, left);
+      break;
+    default: UNREACHABLE();
+  }
 }
 
 
-LocationSummary* Float32x4ClampInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3572,33 +3727,75 @@
 }
 
 
-LocationSummary* Float32x4WithInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+LocationSummary* Float32x4WithInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void Float32x4WithInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister replacement = locs()->in(0).fpu_reg();
+  const VRegister value = locs()->in(1).fpu_reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+
+  __ fcvtsd(VTMP, replacement);
+  if (result != value) {
+    __ vmov(result, value);
+  }
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat32x4WithX:
+      __ vinss(result, 0, VTMP, 0);
+      break;
+    case MethodRecognizer::kFloat32x4WithY:
+      __ vinss(result, 1, VTMP, 0);
+      break;
+    case MethodRecognizer::kFloat32x4WithZ:
+      __ vinss(result, 2, VTMP, 0);
+      break;
+    case MethodRecognizer::kFloat32x4WithW:
+      __ vinss(result, 3, VTMP, 0);
+      break;
+    default: UNREACHABLE();
+  }
 }
 
 
-LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void Float32x4ToInt32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister value = locs()->in(0).fpu_reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+
+  if (value != result) {
+    __ vmov(result, value);
+  }
 }
 
 
-LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3621,11 +3818,12 @@
 }
 
 
-LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -3633,15 +3831,16 @@
 
 void Float64x2ZeroInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const VRegister v = locs()->out(0).fpu_reg();
-  __ LoadDImmediate(v, 0.0, PP);
+  __ veor(v, v, v);
 }
 
 
-LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3656,11 +3855,11 @@
 
 
 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3678,30 +3877,63 @@
 
 
 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
-    bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+    Isolate* isolate, bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void Float64x2ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister q = locs()->in(0).fpu_reg();
+  const VRegister r = locs()->out(0).fpu_reg();
+
+  // Zero register.
+  __ veor(r, r, r);
+  // Set X lane.
+  __ vinsd(VTMP, 0, q, 0);
+  __ fcvtsd(VTMP, VTMP);
+  __ vinss(r, 0, VTMP, 0);
+  // Set Y lane.
+  __ vinsd(VTMP, 0, q, 1);
+  __ fcvtsd(VTMP, VTMP);
+  __ vinss(r, 1, VTMP, 0);
 }
 
 
 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
-    bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+    Isolate* isolate, bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void Float32x4ToFloat64x2Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister q = locs()->in(0).fpu_reg();
+  const VRegister r = locs()->out(0).fpu_reg();
+
+  // Set X.
+  __ vinss(VTMP, 0, q, 0);
+  __ fcvtds(VTMP, VTMP);
+  __ vinsd(r, 0, VTMP, 0);
+  // Set Y.
+  __ vinss(VTMP, 0, q, 1);
+  __ fcvtds(VTMP, VTMP);
+  __ vinsd(r, 1, VTMP, 0);
 }
 
 
-LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3712,90 +3944,272 @@
 }
 
 
-LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::SameAsFirstInput());
+  return summary;
 }
 
 
 void Float64x2OneArgInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister left = locs()->in(0).fpu_reg();
+  const VRegister right = locs()->in(1).fpu_reg();
+  const VRegister out = locs()->out(0).fpu_reg();
+  ASSERT(left == out);
+
+  switch (op_kind()) {
+    case MethodRecognizer::kFloat64x2Scale:
+      __ vmuld(out, left, right);
+      break;
+    case MethodRecognizer::kFloat64x2WithX:
+      __ vinsd(out, 0, right, 0);
+      break;
+    case MethodRecognizer::kFloat64x2WithY:
+      __ vinsd(out, 1, right, 0);
+      break;
+    case MethodRecognizer::kFloat64x2Min: {
+      UNIMPLEMENTED();
+      break;
+    }
+    case MethodRecognizer::kFloat64x2Max: {
+      UNIMPLEMENTED();
+      break;
+    }
+    default: UNREACHABLE();
+  }
 }
 
 
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
-    bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+    Isolate* isolate, bool opt) const {
+  const intptr_t kNumInputs = 4;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* summary = new 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_temp(0, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void Int32x4BoolConstructorInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  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 Register temp = locs()->temp(0).reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+
+  __ veor(result, result, result);
+  __ LoadImmediate(temp, 0xffffffff, PP);
+  __ LoadObject(TMP2, Bool::True(), PP);
+
+  // __ CompareObject(v0, Bool::True(), PP);
+  __ CompareRegisters(v0, TMP2);
+  __ csel(TMP, temp, ZR, EQ);
+  __ vinsw(result, 0, TMP);
+
+  // __ CompareObject(v1, Bool::True(), PP);
+  __ CompareRegisters(v1, TMP2);
+  __ csel(TMP, temp, ZR, EQ);
+  __ vinsw(result, 1, TMP);
+
+  // __ CompareObject(v2, Bool::True(), PP);
+  __ CompareRegisters(v2, TMP2);
+  __ csel(TMP, temp, ZR, EQ);
+  __ vinsw(result, 2, TMP);
+
+  // __ CompareObject(v3, Bool::True(), PP);
+  __ CompareRegisters(v3, TMP2);
+  __ csel(TMP, temp, ZR, EQ);
+  __ vinsw(result, 3, TMP);
 }
 
 
-LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresRegister());
+  return summary;
 }
 
 
 void Int32x4GetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister value = locs()->in(0).fpu_reg();
+  const Register result = locs()->out(0).reg();
+
+  switch (op_kind()) {
+    case MethodRecognizer::kInt32x4GetFlagX:
+      __ vmovrs(result, value, 0);
+      break;
+    case MethodRecognizer::kInt32x4GetFlagY:
+      __ vmovrs(result, value, 1);
+      break;
+    case MethodRecognizer::kInt32x4GetFlagZ:
+      __ vmovrs(result, value, 2);
+      break;
+    case MethodRecognizer::kInt32x4GetFlagW:
+      __ vmovrs(result, value, 3);
+      break;
+    default: UNREACHABLE();
+  }
+
+  __ tst(result, Operand(result));
+  __ LoadObject(result, Bool::True(), PP);
+  __ LoadObject(TMP, Bool::False(), PP);
+  __ csel(result, TMP, result, EQ);
 }
 
 
-LocationSummary* Int32x4SelectInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
+  const intptr_t kNumInputs = 3;
+  const intptr_t kNumTemps = 1;
+  LocationSummary* summary = new LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_in(2, Location::RequiresFpuRegister());
+  summary->set_temp(0, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void Int32x4SelectInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister mask = locs()->in(0).fpu_reg();
+  const VRegister trueValue = locs()->in(1).fpu_reg();
+  const VRegister falseValue = locs()->in(2).fpu_reg();
+  const VRegister out = locs()->out(0).fpu_reg();
+  const VRegister temp = locs()->temp(0).fpu_reg();
+
+  // Copy mask.
+  __ vmov(temp, mask);
+  // Invert it.
+  __ vnot(temp, temp);
+  // mask = mask & trueValue.
+  __ vand(mask, mask, trueValue);
+  // temp = temp & falseValue.
+  __ vand(temp, temp, falseValue);
+  // out = mask | temp.
+  __ vorr(out, mask, temp);
 }
 
 
-LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void Int32x4SetFlagInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister mask = locs()->in(0).fpu_reg();
+  const Register flag = locs()->in(1).reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+
+  if (result != mask) {
+    __ vmov(result, mask);
+  }
+
+  __ CompareObject(flag, Bool::True(), PP);
+  __ LoadImmediate(TMP, 0xffffffff, PP);
+  __ csel(TMP, TMP, ZR, EQ);
+  switch (op_kind()) {
+    case MethodRecognizer::kInt32x4WithFlagX:
+      __ vinsw(result, 0, TMP);
+      break;
+    case MethodRecognizer::kInt32x4WithFlagY:
+      __ vinsw(result, 1, TMP);
+      break;
+    case MethodRecognizer::kInt32x4WithFlagZ:
+      __ vinsw(result, 2, TMP);
+      break;
+    case MethodRecognizer::kInt32x4WithFlagW:
+      __ vinsw(result, 3, TMP);
+      break;
+    default: UNREACHABLE();
+  }
 }
 
 
-LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
+  const intptr_t kNumInputs = 1;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void Int32x4ToFloat32x4Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister value = locs()->in(0).fpu_reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+
+  if (value != result) {
+    __ vmov(result, value);
+  }
 }
 
 
-LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(bool opt) const {
-  UNIMPLEMENTED();
-  return NULL;
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
+  const intptr_t kNumInputs = 2;
+  const intptr_t kNumTemps = 0;
+  LocationSummary* summary = new LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  summary->set_in(0, Location::RequiresFpuRegister());
+  summary->set_in(1, Location::RequiresFpuRegister());
+  summary->set_out(0, Location::RequiresFpuRegister());
+  return summary;
 }
 
 
 void BinaryInt32x4OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  UNIMPLEMENTED();
+  const VRegister left = locs()->in(0).fpu_reg();
+  const VRegister right = locs()->in(1).fpu_reg();
+  const VRegister result = locs()->out(0).fpu_reg();
+  switch (op_kind()) {
+    case Token::kBIT_AND: __ vand(result, left, right); break;
+    case Token::kBIT_OR: __ vorr(result, left, right); break;
+    case Token::kBIT_XOR: __ veor(result, left, right); break;
+    case Token::kADD: __ vaddw(result, left, right); break;
+    case Token::kSUB: __ vsubw(result, left, right); break;
+    default: UNREACHABLE();
+  }
 }
 
 
-LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
     summary->set_in(0, Location::FpuRegisterLocation(V0));
     summary->set_out(0, Location::FpuRegisterLocation(V0));
     return summary;
@@ -3804,8 +4218,8 @@
          (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3829,12 +4243,13 @@
 }
 
 
-LocationSummary* MathMinMaxInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* MathMinMaxInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     // Reuse the left register so that code can be made shorter.
@@ -3844,8 +4259,8 @@
   ASSERT(result_cid() == kSmiCid);
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Reuse the left register so that code can be made shorter.
@@ -3914,11 +4329,12 @@
 }
 
 
-LocationSummary* UnarySmiOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // We make use of 3-operand instructions by not requiring result register
   // to be identical to first input register as on Intel.
@@ -3951,11 +4367,12 @@
 }
 
 
-LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3969,11 +4386,12 @@
 }
 
 
-LocationSummary* SmiToDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::WritableRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -3988,11 +4406,12 @@
 }
 
 
-LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::RegisterLocation(R1));
   result->set_out(0, Location::RegisterLocation(R0));
   return result;
@@ -4041,11 +4460,12 @@
 }
 
 
-LocationSummary* DoubleToSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new LocationSummary(
-      kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresRegister());
   return result;
@@ -4073,7 +4493,8 @@
 }
 
 
-LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4084,11 +4505,12 @@
 }
 
 
-LocationSummary* DoubleToFloatInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4102,11 +4524,12 @@
 }
 
 
-LocationSummary* FloatToDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4120,11 +4543,12 @@
 }
 
 
-LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
   ASSERT((InputCount() == 1) || (InputCount() == 2));
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, InputCount(), kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::FpuRegisterLocation(V0));
   if (InputCount() == 2) {
     result->set_in(1, Location::FpuRegisterLocation(V1));
@@ -4259,12 +4683,13 @@
 }
 
 
-LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   // Only use this instruction in optimized code.
   ASSERT(opt);
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, 0, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     if (index() == 0) {
       summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
@@ -4308,12 +4733,13 @@
 }
 
 
-LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* MergedMathInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::RequiresRegister());
     // Output is a pair of registers.
@@ -4389,7 +4815,7 @@
 
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   return MakeCallSummary();
 }
 
@@ -4432,8 +4858,9 @@
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(bool opt) const {
-  comparison()->InitializeLocationSummary(opt);
+LocationSummary* BranchInstr::MakeLocationSummary(Isolate* isolate,
+                                                  bool opt) const {
+  comparison()->InitializeLocationSummary(isolate, opt);
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
   return comparison()->locs();
@@ -4445,11 +4872,12 @@
 }
 
 
-LocationSummary* CheckClassInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->AddTemp(Location::RequiresRegister());
@@ -4498,11 +4926,12 @@
 }
 
 
-LocationSummary* CheckSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -4516,11 +4945,12 @@
 }
 
 
-LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
   locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
   return locs;
@@ -4570,7 +5000,8 @@
 }
 
 
-LocationSummary* UnboxIntegerInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxIntegerInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4581,7 +5012,8 @@
 }
 
 
-LocationSummary* BoxIntegerInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4592,7 +5024,8 @@
 }
 
 
-LocationSummary* BinaryMintOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4603,7 +5036,8 @@
 }
 
 
-LocationSummary* ShiftMintOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4614,7 +5048,8 @@
 }
 
 
-LocationSummary* UnaryMintOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4625,8 +5060,9 @@
 }
 
 
-LocationSummary* ThrowInstr::MakeLocationSummary(bool opt) const {
-  return new LocationSummary(0, 0, LocationSummary::kCall);
+LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
+                                                 bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -4640,8 +5076,9 @@
 }
 
 
-LocationSummary* ReThrowInstr::MakeLocationSummary(bool opt) const {
-  return new LocationSummary(0, 0, LocationSummary::kCall);
+LocationSummary* ReThrowInstr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -4666,7 +5103,9 @@
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    compiler->EmitEdgeCounter();
+    if (FLAG_emit_edge_counters) {
+      compiler->EmitEdgeCounter();
+    }
     // Add an edge counter.
     // On ARM64 the deoptimization descriptor points after the edge counter
     // code so that we can reuse the same pattern matching code as at call
@@ -4681,14 +5120,17 @@
 }
 
 
-LocationSummary* GotoInstr::MakeLocationSummary(bool opt) const {
-  return new LocationSummary(0, 0, LocationSummary::kNoCall);
+LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate,
+                                                bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
 }
 
 
 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   if (!compiler->is_optimizing()) {
-    compiler->EmitEdgeCounter();
+    if (FLAG_emit_edge_counters) {
+      compiler->EmitEdgeCounter();
+    }
     // Add a deoptimization descriptor for deoptimizing instructions that
     // may be inserted before this instruction.  On ARM64 this descriptor
     // points after the edge counter code so that we can reuse the same
@@ -4710,7 +5152,8 @@
 }
 
 
-LocationSummary* CurrentContextInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   return LocationSummary::Make(0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -4722,19 +5165,20 @@
 }
 
 
-LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StrictCompareInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (needs_number_check()) {
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
     locs->set_in(0, Location::RegisterLocation(R0));
     locs->set_in(1, Location::RegisterLocation(R1));
     locs->set_out(0, Location::RegisterLocation(R0));
     return locs;
   }
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
@@ -4802,7 +5246,8 @@
 }
 
 
-LocationSummary* BooleanNegateInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   return LocationSummary::Make(1,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -4820,7 +5265,8 @@
 }
 
 
-LocationSummary* AllocateObjectInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   return MakeCallSummary();
 }
 
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 7e082dd..039c7a4 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -20,6 +20,7 @@
 
 namespace dart {
 
+DECLARE_FLAG(bool, emit_edge_counters);
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, propagate_ic_data);
 DECLARE_FLAG(bool, use_osr);
@@ -29,17 +30,20 @@
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register EAX.
 LocationSummary* Instruction::MakeCallSummary() {
-  LocationSummary* result = new LocationSummary(0, 0, LocationSummary::kCall);
+  Isolate* isolate = Isolate::Current();
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(EAX));
   return result;
 }
 
 
-LocationSummary* PushArgumentInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps= 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
   return locs;
 }
@@ -62,11 +66,12 @@
 }
 
 
-LocationSummary* ReturnInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ReturnInstr::MakeLocationSummary(Isolate* isolate,
+                                                  bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   return locs;
 }
@@ -96,7 +101,8 @@
 }
 
 
-LocationSummary* LoadLocalInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t stack_index = (local().index() < 0)
       ? kFirstLocalSlotFromFp - local().index()
@@ -113,7 +119,8 @@
 }
 
 
-LocationSummary* StoreLocalInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::SameAsFirstInput(),
@@ -129,7 +136,8 @@
 }
 
 
-LocationSummary* ConstantInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
   const intptr_t kNumInputs = 0;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -146,11 +154,12 @@
 }
 
 
-LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = (constant_address() == 0) ? 1 : 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_out(0, Location::RequiresFpuRegister());
   if (kNumTemps == 1) {
     locs->set_temp(0, Location::RequiresRegister());
@@ -176,11 +185,12 @@
 }
 
 
-LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AssertAssignableInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(EAX));  // Value.
   summary->set_in(1, Location::RegisterLocation(ECX));  // Instantiator.
   summary->set_in(2, Location::RegisterLocation(EDX));  // Type arguments.
@@ -189,11 +199,12 @@
 }
 
 
-LocationSummary* AssertBooleanInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AssertBooleanInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -250,12 +261,13 @@
 }
 
 
-LocationSummary* EqualityCompareInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* EqualityCompareInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -265,8 +277,8 @@
   }
   if (operation_cid() == kDoubleCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -274,8 +286,8 @@
   }
   if (operation_cid() == kSmiCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
@@ -569,11 +581,12 @@
 }
 
 
-LocationSummary* TestSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* TestSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -614,11 +627,12 @@
 
 
 
-LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* TestCidsInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
   locs->set_out(0, Location::RequiresRegister());
@@ -685,13 +699,14 @@
 }
 
 
-LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* RelationalOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::Pair(Location::RequiresRegister(),
                                    Location::RequiresRegister()));
     locs->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -700,16 +715,16 @@
     return locs;
   }
   if (operation_cid() == kDoubleCid) {
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
   ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -759,11 +774,12 @@
 }
 
 
-LocationSummary* NativeCallInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 3;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(EAX));
   locs->set_temp(1, Location::RegisterLocation(ECX));
   locs->set_temp(2, Location::RegisterLocation(EDX));
@@ -806,14 +822,15 @@
     return false;
   }
   const int64_t index = Smi::Cast(constant->value()).AsInt64Value();
-  const intptr_t scale = FlowGraphCompiler::ElementSizeFor(cid);
-  const intptr_t offset = FlowGraphCompiler::DataOffsetFor(cid);
+  const intptr_t scale = Instance::ElementSizeFor(cid);
+  const intptr_t offset = Instance::DataOffsetFor(cid);
   const int64_t displacement = index * scale + offset;
   return Utils::IsInt(32, displacement);
 }
 
 
-LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
   return LocationSummary::Make(kNumInputs,
@@ -834,7 +851,8 @@
 }
 
 
-LocationSummary* StringToCharCodeInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -859,11 +877,12 @@
 }
 
 
-LocationSummary* StringInterpolateInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StringInterpolateInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(EAX));
   summary->set_out(0, Location::RegisterLocation(EAX));
   return summary;
@@ -885,7 +904,8 @@
 }
 
 
-LocationSummary* LoadUntaggedInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -900,7 +920,8 @@
 }
 
 
-LocationSummary* LoadClassIdInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -1000,11 +1021,12 @@
 }
 
 
-LocationSummary* LoadIndexedInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id())) {
     // CanBeImmediateIndex must return false for unsafe smis.
@@ -1038,26 +1060,66 @@
 }
 
 
+static Address ElementAddressForIntIndex(bool is_external,
+                                         intptr_t cid,
+                                         intptr_t index_scale,
+                                         Register array,
+                                         intptr_t index) {
+  if (is_external) {
+    return Address(array, index * index_scale);
+  } else {
+    const int64_t disp = static_cast<int64_t>(index) * index_scale +
+        Instance::DataOffsetFor(cid);
+    ASSERT(Utils::IsInt(32, disp));
+    return FieldAddress(array, static_cast<int32_t>(disp));
+  }
+}
+
+
+static ScaleFactor ToScaleFactor(intptr_t index_scale) {
+  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays with
+  // index scale factor > 1. E.g., for Uint8Array and OneByteString the index is
+  // expected to be untagged before accessing.
+  ASSERT(kSmiTagShift == 1);
+  switch (index_scale) {
+    case 1: return TIMES_1;
+    case 2: return TIMES_1;
+    case 4: return TIMES_2;
+    case 8: return TIMES_4;
+    case 16: return TIMES_8;
+    default:
+      UNREACHABLE();
+      return TIMES_1;
+  }
+}
+
+
+static Address ElementAddressForRegIndex(bool is_external,
+                                         intptr_t cid,
+                                         intptr_t index_scale,
+                                         Register array,
+                                         Register index) {
+  if (is_external) {
+    return Address(array, index, ToScaleFactor(index_scale), 0);
+  } else {
+    return FieldAddress(array,
+                        index,
+                        ToScaleFactor(index_scale),
+                        Instance::DataOffsetFor(cid));
+  }
+}
+
+
 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register array = locs()->in(0).reg();
   Location index = locs()->in(1);
 
   Address element_address(kNoRegister, 0);
-  if (IsExternal()) {
-    element_address = index.IsRegister()
-        ? compiler->ExternalElementAddressForRegIndex(
-            index_scale(), array, index.reg())
-        : compiler->ExternalElementAddressForIntIndex(
-            index_scale(), array, Smi::Cast(index.constant()).Value());
-  } else {
-    ASSERT(this->array()->definition()->representation() == kTagged);
-    element_address = index.IsRegister()
-        ? compiler->ElementAddressForRegIndex(
-            class_id(), index_scale(), array, index.reg())
-        : compiler->ElementAddressForIntIndex(
-            class_id(), index_scale(), array,
-            Smi::Cast(index.constant()).Value());
-  }
+  element_address = index.IsRegister()
+      ? ElementAddressForRegIndex(IsExternal(), class_id(), index_scale(),
+                                  array, index.reg())
+      : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
+                                  array, Smi::Cast(index.constant()).Value());
 
   if ((representation() == kUnboxedDouble) ||
       (representation() == kUnboxedFloat32x4) ||
@@ -1204,11 +1266,12 @@
 }
 
 
-LocationSummary* StoreIndexedInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   if (CanBeImmediateIndex(index(), class_id())) {
     // CanBeImmediateIndex must return false for unsafe smis.
@@ -1277,21 +1340,11 @@
   Location index = locs()->in(1);
 
   Address element_address(kNoRegister, 0);
-  if (IsExternal()) {
-    element_address = index.IsRegister()
-        ? compiler->ExternalElementAddressForRegIndex(
-            index_scale(), array, index.reg())
-        : compiler->ExternalElementAddressForIntIndex(
-            index_scale(), array, Smi::Cast(index.constant()).Value());
-  } else {
-    ASSERT(this->array()->definition()->representation() == kTagged);
-    element_address = index.IsRegister()
-        ? compiler->ElementAddressForRegIndex(
-          class_id(), index_scale(), array, index.reg())
-        : compiler->ElementAddressForIntIndex(
-          class_id(), index_scale(), array,
-          Smi::Cast(index.constant()).Value());
-  }
+  element_address = index.IsRegister()
+      ? ElementAddressForRegIndex(IsExternal(), class_id(), index_scale(),
+                                  array, index.reg())
+      : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
+                                  array, Smi::Cast(index.constant()).Value());
 
   if ((index_scale() == 1) && index.IsRegister()) {
     __ SmiUntag(index.reg());
@@ -1391,10 +1444,11 @@
 }
 
 
-LocationSummary* GuardFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* GuardFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, 0, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   const bool field_has_length = field().needs_length_check();
   const bool need_value_temp_reg =
@@ -1765,11 +1819,12 @@
 };
 
 
-LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps,
           !field().IsNull() &&
           ((field().guarded_cid() == kIllegalCid) || is_initialization_)
           ? LocationSummary::kCallOnSlowPath
@@ -2020,11 +2075,12 @@
 }
 
 
-LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // By specifying same register as input, our simple register allocator can
   // generate better code.
@@ -2045,8 +2101,10 @@
 }
 
 
-LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(bool opt) const {
-  LocationSummary* locs = new LocationSummary(1, 1, LocationSummary::kNoCall);
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, 1, 1, LocationSummary::kNoCall);
   locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
                                               : Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
@@ -2069,11 +2127,12 @@
 }
 
 
-LocationSummary* InstanceOfInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* InstanceOfInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(EAX));
   summary->set_in(1, Location::RegisterLocation(ECX));
   summary->set_in(2, Location::RegisterLocation(EDX));
@@ -2098,11 +2157,12 @@
 
 // TODO(srdjan): In case of constant inputs make CreateArray kNoCall and
 // use slow path stub.
-LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CreateArrayInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(ECX));
   locs->set_in(1, Location::RegisterLocation(EDX));
   locs->set_out(0, Location::RegisterLocation(EAX));
@@ -2313,12 +2373,12 @@
 };
 
 
-LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(
-          kNumInputs, kNumTemps,
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps,
           (opt && !IsPotentialUnboxedLoad())
           ? LocationSummary::kNoCall
           : LocationSummary::kCallOnSlowPath);
@@ -2459,11 +2519,12 @@
 }
 
 
-LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -2491,11 +2552,11 @@
 
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -2562,12 +2623,13 @@
 }
 
 
-LocationSummary* AllocateContextInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   if (opt) {
     const intptr_t kNumInputs = 0;
     const intptr_t kNumTemps = 2;
-    LocationSummary* locs = new LocationSummary(
-        kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
+    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));
@@ -2575,8 +2637,8 @@
   }
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  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;
@@ -2698,11 +2760,12 @@
 }
 
 
-LocationSummary* CloneContextInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(EAX));
   locs->set_out(0, Location::RegisterLocation(EAX));
   return locs;
@@ -2725,7 +2788,8 @@
 }
 
 
-LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   UNREACHABLE();
   return NULL;
 }
@@ -2758,11 +2822,12 @@
 }
 
 
-LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   return summary;
@@ -2967,12 +3032,13 @@
 }
 
 
-LocationSummary* BinarySmiOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   if (op_kind() == Token::kTRUNCDIV) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     if (RightIsPowerOfTwoConstant()) {
       summary->set_in(0, Location::RequiresRegister());
       ConstantInstr* right_constant = right()->definition()->AsConstant();
@@ -2991,8 +3057,8 @@
     return summary;
   } else if (op_kind() == Token::kMOD) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     // Both inputs must be writable because they will be untagged.
     summary->set_in(0, Location::RegisterLocation(EDX));
     summary->set_in(1, Location::WritableRegister());
@@ -3002,16 +3068,16 @@
     return summary;
   } else if (op_kind() == Token::kSHR) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    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 = 0;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    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 (!is_truncating()) {
@@ -3021,8 +3087,8 @@
     return summary;
   } else {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     ConstantInstr* constant = right()->definition()->AsConstant();
     if (constant != NULL) {
@@ -3342,7 +3408,8 @@
 }
 
 
-LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
@@ -3351,8 +3418,8 @@
                       &&(left_cid != kSmiCid)
                       && (right_cid != kSmiCid);
   const intptr_t kNumTemps = need_temp ? 1 : 0;
-  LocationSummary* summary =
-    new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   if (need_temp) summary->set_temp(0, Location::RequiresRegister());
@@ -3386,13 +3453,12 @@
 
 
 
-LocationSummary* BoxDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
-                          kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3416,14 +3482,15 @@
 }
 
 
-LocationSummary* UnboxDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t value_cid = value()->Type()->ToCid();
   const bool needs_temp = ((value_cid != kSmiCid) && (value_cid != kDoubleCid));
   const bool needs_writable_input = (value_cid == kSmiCid);
   const intptr_t kNumTemps = needs_temp ? 1 : 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, needs_writable_input
                      ? Location::WritableRegister()
                      : Location::RequiresRegister());
@@ -3474,11 +3541,12 @@
 }
 
 
-LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
@@ -3504,12 +3572,13 @@
 }
 
 
-LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxFloat32x4Instr::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 == kFloat32x4Cid ? 0 : 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (kNumTemps > 0) {
     ASSERT(kNumTemps == 1);
@@ -3537,11 +3606,12 @@
 }
 
 
-LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
@@ -3567,12 +3637,13 @@
 }
 
 
-LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxFloat64x2Instr::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 == kFloat64x2Cid ? 0 : 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (kNumTemps > 0) {
     ASSERT(kNumTemps == 1);
@@ -3600,11 +3671,12 @@
 }
 
 
-LocationSummary* BoxInt32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
@@ -3662,12 +3734,13 @@
 }
 
 
-LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxInt32x4Instr::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 == kInt32x4Cid ? 0 : 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (kNumTemps > 0) {
     ASSERT(kNumTemps == 1);
@@ -3696,11 +3769,12 @@
 
 
 
-LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3724,11 +3798,12 @@
 }
 
 
-LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3752,11 +3827,12 @@
 }
 
 
-LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3780,11 +3856,12 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -3822,11 +3899,12 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3849,11 +3927,12 @@
 }
 
 
-LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3870,11 +3949,11 @@
 
 
 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -3907,11 +3986,12 @@
 }
 
 
-LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -3923,11 +4003,12 @@
 }
 
 
-LocationSummary* Float32x4SplatInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -3944,11 +4025,12 @@
 }
 
 
-LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3987,11 +4069,12 @@
 }
 
 
-LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4017,11 +4100,12 @@
 }
 
 
-LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4046,11 +4130,12 @@
 }
 
 
-LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4077,11 +4162,12 @@
 }
 
 
-LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4104,11 +4190,12 @@
 }
 
 
-LocationSummary* Float32x4ClampInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4127,11 +4214,12 @@
 }
 
 
-LocationSummary* Float32x4WithInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4WithInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4195,11 +4283,12 @@
 }
 
 
-LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4211,11 +4300,12 @@
 }
 
 
-LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4240,11 +4330,12 @@
 
 
 
-LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -4256,11 +4347,12 @@
 }
 
 
-LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4274,11 +4366,11 @@
 
 
 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4299,11 +4391,11 @@
 
 
 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4317,11 +4409,11 @@
 
 
 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4334,11 +4426,12 @@
 }
 
 
-LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (representation() == kTagged) {
     ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
@@ -4376,11 +4469,12 @@
 }
 
 
-LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4430,11 +4524,11 @@
 
 
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  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());
@@ -4492,11 +4586,12 @@
 }
 
 
-LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -4537,11 +4632,12 @@
 }
 
 
-LocationSummary* Int32x4SelectInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4571,11 +4667,12 @@
 }
 
 
-LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4627,11 +4724,12 @@
 }
 
 
-LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4643,11 +4741,12 @@
 }
 
 
-LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4683,12 +4782,13 @@
 }
 
 
-LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
     summary->set_in(0, Location::FpuRegisterLocation(XMM1));
     // EDI is chosen because it is callee saved so we do not need to back it
     // up before calling into the runtime.
@@ -4700,8 +4800,8 @@
          (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (kind() == MathUnaryInstr::kDoubleSquare) {
     summary->set_out(0, Location::SameAsFirstInput());
@@ -4735,12 +4835,13 @@
 }
 
 
-LocationSummary* MathMinMaxInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* MathMinMaxInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     // Reuse the left register so that code can be made shorter.
@@ -4752,8 +4853,8 @@
   ASSERT(result_cid() == kSmiCid);
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Reuse the left register so that code can be made shorter.
@@ -4823,7 +4924,8 @@
 }
 
 
-LocationSummary* UnarySmiOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::SameAsFirstInput(),
@@ -4851,11 +4953,12 @@
 }
 
 
-LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4869,11 +4972,12 @@
 }
 
 
-LocationSummary* SmiToDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::WritableRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4888,11 +4992,12 @@
 }
 
 
-LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::RegisterLocation(ECX));
   result->set_out(0, Location::RegisterLocation(EAX));
   return result;
@@ -4932,11 +5037,12 @@
 }
 
 
-LocationSummary* DoubleToSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new LocationSummary(
-      kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresRegister());
   return result;
@@ -4955,11 +5061,12 @@
 }
 
 
-LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4985,11 +5092,12 @@
 }
 
 
-LocationSummary* DoubleToFloatInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -5001,11 +5109,12 @@
 }
 
 
-LocationSummary* FloatToDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -5017,11 +5126,12 @@
 }
 
 
-LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
   ASSERT((InputCount() == 1) || (InputCount() == 2));
   const intptr_t kNumTemps = 1;
-  LocationSummary* result =
-      new LocationSummary(InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, InputCount(), kNumTemps, LocationSummary::kCall);
   // EDI is chosen because it is callee saved so we do not need to back it
   // up before calling into the runtime.
   result->set_temp(0, Location::RegisterLocation(EDI));
@@ -5193,12 +5303,13 @@
 }
 
 
-LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   // Only use this instruction in optimized code.
   ASSERT(opt);
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, 0, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     if (index() == 0) {
       summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
@@ -5242,12 +5353,13 @@
 }
 
 
-LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* MergedMathInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     // Both inputs must be writable because they will be untagged.
     summary->set_in(0, Location::RegisterLocation(EAX));
     summary->set_in(1, Location::WritableRegister());
@@ -5259,8 +5371,8 @@
   if (kind() == MergedMathInstr::kSinCos) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_out(0, Location::Pair(Location::RequiresFpuRegister(),
                                        Location::RequiresFpuRegister()));
@@ -5374,7 +5486,7 @@
 
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   return MakeCallSummary();
 }
 
@@ -5417,8 +5529,9 @@
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(bool opt) const {
-  comparison()->InitializeLocationSummary(opt);
+LocationSummary* BranchInstr::MakeLocationSummary(Isolate* isolate,
+                                                  bool opt) const {
+  comparison()->InitializeLocationSummary(isolate, opt);
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
   return comparison()->locs();
@@ -5430,11 +5543,12 @@
 }
 
 
-LocationSummary* CheckClassInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->AddTemp(Location::RequiresRegister());
@@ -5490,11 +5604,12 @@
 }
 
 
-LocationSummary* CheckSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5510,11 +5625,12 @@
 
 // Length: register or constant.
 // Index: register, constant or stack slot.
-LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  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) {
@@ -5572,11 +5688,12 @@
 }
 
 
-LocationSummary* UnboxIntegerInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxIntegerInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::Pair(Location::RegisterLocation(EAX),
                                      Location::RegisterLocation(EDX)));
@@ -5625,11 +5742,12 @@
 }
 
 
-LocationSummary* BoxIntegerInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
@@ -5718,15 +5836,16 @@
 }
 
 
-LocationSummary* BinaryMintOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   switch (op_kind()) {
     case Token::kBIT_AND:
     case Token::kBIT_OR:
     case Token::kBIT_XOR: {
       const intptr_t kNumTemps = 0;
-      LocationSummary* summary =
-          new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      LocationSummary* summary = new(isolate) LocationSummary(
+          isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
       summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                         Location::RequiresRegister()));
       summary->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -5737,8 +5856,8 @@
     case Token::kADD:
     case Token::kSUB: {
       const intptr_t kNumTemps = 0;
-      LocationSummary* summary =
-          new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+      LocationSummary* summary = new(isolate) LocationSummary(
+          isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
       summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                         Location::RequiresRegister()));
       summary->set_in(1, Location::Pair(Location::RequiresRegister(),
@@ -5806,11 +5925,12 @@
 }
 
 
-LocationSummary* ShiftMintOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = op_kind() == Token::kSHL ? 2 : 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_in(1, Location::RegisterLocation(ECX));
@@ -5878,11 +5998,12 @@
 }
 
 
-LocationSummary* UnaryMintOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
   summary->set_out(0, Location::SameAsFirstInput());
@@ -5918,8 +6039,9 @@
 }
 
 
-LocationSummary* ThrowInstr::MakeLocationSummary(bool opt) const {
-  return new LocationSummary(0, 0, LocationSummary::kCall);
+LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
+                                                 bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -5934,8 +6056,9 @@
 }
 
 
-LocationSummary* ReThrowInstr::MakeLocationSummary(bool opt) const {
-  return new LocationSummary(0, 0, LocationSummary::kCall);
+LocationSummary* ReThrowInstr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -5960,7 +6083,9 @@
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    compiler->EmitEdgeCounter();
+    if (FLAG_emit_edge_counters) {
+      compiler->EmitEdgeCounter();
+    }
     // The deoptimization descriptor points after the edge counter code for
     // uniformity with ARM and MIPS, where we can reuse pattern matching
     // code that matches backwards from the end of the pattern.
@@ -5974,14 +6099,17 @@
 }
 
 
-LocationSummary* GotoInstr::MakeLocationSummary(bool opt) const {
-  return new LocationSummary(0, 0, LocationSummary::kNoCall);
+LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate,
+                                                bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
 }
 
 
 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   if (!compiler->is_optimizing()) {
-    compiler->EmitEdgeCounter();
+    if (FLAG_emit_edge_counters) {
+      compiler->EmitEdgeCounter();
+    }
     // Add a deoptimization descriptor for deoptimizing instructions that
     // may be inserted before this instruction.  This descriptor points
     // after the edge counter for uniformity with ARM and MIPS, where we can
@@ -6003,7 +6131,8 @@
 }
 
 
-LocationSummary* CurrentContextInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   return LocationSummary::Make(0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -6015,19 +6144,20 @@
 }
 
 
-LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StrictCompareInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (needs_number_check()) {
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
     locs->set_in(0, Location::RegisterLocation(EAX));
     locs->set_in(1, Location::RegisterLocation(ECX));
     locs->set_out(0, Location::RegisterLocation(EAX));
     return locs;
   }
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
@@ -6101,8 +6231,9 @@
 }
 
 
-LocationSummary* IfThenElseInstr::MakeLocationSummary(bool opt) const {
-  comparison()->InitializeLocationSummary(opt);
+LocationSummary* IfThenElseInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
+  comparison()->InitializeLocationSummary(isolate, opt);
   // TODO(vegorov): support byte register constraints in the register allocator.
   comparison()->locs()->set_out(0, Location::RegisterLocation(EDX));
   return comparison()->locs();
@@ -6158,11 +6289,12 @@
 }
 
 
-LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ClosureCallInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(EAX));  // Function.
   summary->set_out(0, Location::RegisterLocation(EAX));
   return summary;
@@ -6208,7 +6340,8 @@
 }
 
 
-LocationSummary* BooleanNegateInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   return LocationSummary::Make(1,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -6228,7 +6361,8 @@
 }
 
 
-LocationSummary* AllocateObjectInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   return MakeCallSummary();
 }
 
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 55e2020..5ac7ec4 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -21,6 +21,7 @@
 
 namespace dart {
 
+DECLARE_FLAG(bool, emit_edge_counters);
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, propagate_ic_data);
 DECLARE_FLAG(bool, use_osr);
@@ -28,17 +29,20 @@
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register V0.
 LocationSummary* Instruction::MakeCallSummary() {
-  LocationSummary* result = new LocationSummary(0, 0, LocationSummary::kCall);
+  Isolate* isolate = Isolate::Current();
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(V0));
   return result;
 }
 
 
-LocationSummary* PushArgumentInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps= 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
   return locs;
 }
@@ -64,11 +68,12 @@
 }
 
 
-LocationSummary* ReturnInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ReturnInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterLocation(V0));
   return locs;
 }
@@ -122,8 +127,9 @@
 }
 
 
-LocationSummary* IfThenElseInstr::MakeLocationSummary(bool opt) const {
-  comparison()->InitializeLocationSummary(opt);
+LocationSummary* IfThenElseInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
+  comparison()->InitializeLocationSummary(isolate, opt);
   return comparison()->locs();
 }
 
@@ -204,11 +210,12 @@
 }
 
 
-LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ClosureCallInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(T0));  // Function.
   summary->set_out(0, Location::RegisterLocation(V0));
   return summary;
@@ -252,7 +259,8 @@
 }
 
 
-LocationSummary* LoadLocalInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   return LocationSummary::Make(0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -266,7 +274,8 @@
 }
 
 
-LocationSummary* StoreLocalInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   return LocationSummary::Make(1,
                                Location::SameAsFirstInput(),
                                LocationSummary::kNoCall);
@@ -282,7 +291,8 @@
 }
 
 
-LocationSummary* ConstantInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
   return LocationSummary::Make(0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -299,11 +309,12 @@
 }
 
 
-LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_out(0, Location::RequiresFpuRegister());
   locs->set_temp(0, Location::RequiresRegister());
   return locs;
@@ -323,11 +334,12 @@
 }
 
 
-LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AssertAssignableInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(A0));  // Value.
   summary->set_in(1, Location::RegisterLocation(A2));  // Instantiator.
   summary->set_in(2, Location::RegisterLocation(A1));  // Type arguments.
@@ -336,11 +348,12 @@
 }
 
 
-LocationSummary* AssertBooleanInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AssertBooleanInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(A0));
   locs->set_out(0, Location::RegisterLocation(A0));
   return locs;
@@ -381,12 +394,13 @@
 }
 
 
-LocationSummary* EqualityCompareInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* EqualityCompareInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_temp(0, Location::RequiresRegister());
@@ -395,8 +409,8 @@
   }
   if (operation_cid() == kDoubleCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -404,8 +418,8 @@
   }
   if (operation_cid() == kSmiCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
@@ -633,11 +647,12 @@
 }
 
 
-LocationSummary* TestSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* TestSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -678,11 +693,12 @@
 }
 
 
-LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* TestCidsInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
   locs->set_out(0, Location::RequiresRegister());
@@ -750,13 +766,14 @@
 }
 
 
-LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* RelationalOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kMintCid) {
     const intptr_t kNumTemps = 2;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_temp(0, Location::RequiresRegister());
@@ -765,16 +782,16 @@
     return locs;
   }
   if (operation_cid() == kDoubleCid) {
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
   ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -826,11 +843,12 @@
 }
 
 
-LocationSummary* NativeCallInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 3;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(A1));
   locs->set_temp(1, Location::RegisterLocation(A2));
   locs->set_temp(2, Location::RegisterLocation(T5));
@@ -888,7 +906,8 @@
 }
 
 
-LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
   return LocationSummary::Make(kNumInputs,
@@ -912,7 +931,8 @@
 }
 
 
-LocationSummary* StringToCharCodeInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -938,11 +958,12 @@
 }
 
 
-LocationSummary* StringInterpolateInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StringInterpolateInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(A0));
   summary->set_out(0, Location::RegisterLocation(V0));
   return summary;
@@ -964,7 +985,8 @@
 }
 
 
-LocationSummary* LoadUntaggedInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -979,7 +1001,8 @@
 }
 
 
-LocationSummary* LoadClassIdInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -1075,11 +1098,12 @@
 }
 
 
-LocationSummary* LoadIndexedInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // The smi index is either untagged (element size == 1), or it is left smi
   // tagged (for all element sizes > 1).
@@ -1141,7 +1165,7 @@
     // mode, then we must load the offset into a register and add it to the
     // index.
     element_address = Address(index.reg(),
-        FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag);
+        Instance::DataOffsetFor(class_id()) - kHeapObjectTag);
   }
 
   if ((representation() == kUnboxedDouble) ||
@@ -1162,7 +1186,7 @@
         break;
       case kTypedDataFloat64ArrayCid:
         __ LoadDFromOffset(result, index.reg(),
-            FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag);
+            Instance::DataOffsetFor(class_id()) - kHeapObjectTag);
         break;
       case kTypedDataInt32x4ArrayCid:
       case kTypedDataFloat32x4ArrayCid:
@@ -1259,11 +1283,12 @@
 }
 
 
-LocationSummary* StoreIndexedInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // The smi index is either untagged (element size == 1), or it is left smi
   // tagged (for all element sizes > 1).
@@ -1346,7 +1371,7 @@
   } else {
     ASSERT(this->array()->definition()->representation() == kTagged);
     element_address = Address(index.reg(),
-        FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag);
+        Instance::DataOffsetFor(class_id()) - kHeapObjectTag);
   }
 
   switch (class_id()) {
@@ -1430,7 +1455,7 @@
     }
     case kTypedDataFloat64ArrayCid:
       __ StoreDToOffset(locs()->in(2).fpu_reg(), index.reg(),
-          FlowGraphCompiler::DataOffsetFor(class_id()) - kHeapObjectTag);
+          Instance::DataOffsetFor(class_id()) - kHeapObjectTag);
       break;
     case kTypedDataInt32x4ArrayCid:
     case kTypedDataFloat32x4ArrayCid:
@@ -1442,10 +1467,11 @@
 }
 
 
-LocationSummary* GuardFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* GuardFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, 0, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   const bool field_has_length = field().needs_length_check();
   const bool need_value_temp_reg =
@@ -1803,11 +1829,12 @@
 };
 
 
-LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps,
           !field().IsNull() &&
           ((field().guarded_cid() == kIllegalCid) || is_initialization_)
           ? LocationSummary::kCallOnSlowPath
@@ -1967,11 +1994,12 @@
 }
 
 
-LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -1991,8 +2019,10 @@
 }
 
 
-LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(bool opt) const {
-  LocationSummary* locs = new LocationSummary(1, 1, LocationSummary::kNoCall);
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, 1, 1, LocationSummary::kNoCall);
   locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
                                               : Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
@@ -2016,11 +2046,12 @@
 }
 
 
-LocationSummary* InstanceOfInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* InstanceOfInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(A0));
   summary->set_in(1, Location::RegisterLocation(A2));
   summary->set_in(2, Location::RegisterLocation(A1));
@@ -2044,11 +2075,12 @@
 }
 
 
-LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CreateArrayInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(A0));
   locs->set_in(1, Location::RegisterLocation(A1));
   locs->set_out(0, Location::RegisterLocation(V0));
@@ -2204,12 +2236,12 @@
 };
 
 
-LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(
-          kNumInputs, kNumTemps,
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps,
           (opt && !IsPotentialUnboxedLoad())
           ? LocationSummary::kNoCall
           : LocationSummary::kCallOnSlowPath);
@@ -2299,11 +2331,12 @@
 }
 
 
-LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(T0));
   locs->set_out(0, Location::RegisterLocation(T0));
   return locs;
@@ -2339,11 +2372,11 @@
 
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(T0));
   locs->set_out(0, Location::RegisterLocation(T0));
   return locs;
@@ -2412,11 +2445,12 @@
 }
 
 
-LocationSummary* AllocateContextInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(T1));
   locs->set_out(0, Location::RegisterLocation(V0));
   return locs;
@@ -2439,11 +2473,12 @@
 }
 
 
-LocationSummary* CloneContextInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(T0));
   locs->set_out(0, Location::RegisterLocation(T0));
   return locs;
@@ -2471,7 +2506,8 @@
 }
 
 
-LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   UNREACHABLE();
   return NULL;
 }
@@ -2511,11 +2547,12 @@
 }
 
 
-LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_temp(0, Location::RequiresRegister());
@@ -2718,11 +2755,12 @@
 }
 
 
-LocationSummary* BinarySmiOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = op_kind() == Token::kADD ? 1 : 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   if (op_kind() == Token::kTRUNCDIV) {
     summary->set_in(0, Location::RequiresRegister());
     if (RightIsPowerOfTwoConstant()) {
@@ -3066,14 +3104,15 @@
 }
 
 
-LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-    new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   return summary;
@@ -3101,11 +3140,12 @@
 }
 
 
-LocationSummary* BoxDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
@@ -3131,13 +3171,14 @@
 }
 
 
-LocationSummary* UnboxDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t value_cid = value()->Type()->ToCid();
   const bool needs_writable_input = (value_cid == kSmiCid);
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, needs_writable_input
                      ? Location::WritableRegister()
                      : Location::RequiresRegister());
@@ -3188,7 +3229,8 @@
 }
 
 
-LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3199,7 +3241,8 @@
 }
 
 
-LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3210,7 +3253,8 @@
 }
 
 
-LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3221,7 +3265,8 @@
 }
 
 
-LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3232,7 +3277,8 @@
 }
 
 
-LocationSummary* BoxInt32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3243,7 +3289,8 @@
 }
 
 
-LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3254,11 +3301,12 @@
 }
 
 
-LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
@@ -3280,7 +3328,8 @@
 }
 
 
-LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3291,7 +3340,8 @@
 }
 
 
-LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3302,7 +3352,8 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3314,7 +3365,8 @@
 
 
 
-LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3326,7 +3378,7 @@
 
 
 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3337,7 +3389,8 @@
 }
 
 
-LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3348,7 +3401,8 @@
 }
 
 
-LocationSummary* Float32x4SplatInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3359,7 +3413,8 @@
 }
 
 
-LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3370,7 +3425,8 @@
 }
 
 
-LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3381,7 +3437,8 @@
 }
 
 
-LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3392,7 +3449,8 @@
 }
 
 
-LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3403,7 +3461,8 @@
 }
 
 
-LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3414,7 +3473,8 @@
 }
 
 
-LocationSummary* Float32x4ClampInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3425,7 +3485,8 @@
 }
 
 
-LocationSummary* Float32x4WithInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4WithInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3436,7 +3497,8 @@
 }
 
 
-LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3447,7 +3509,8 @@
 }
 
 
-LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3458,7 +3521,8 @@
 }
 
 
-LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3469,7 +3533,8 @@
 }
 
 
-LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3481,7 +3546,7 @@
 
 
 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3493,7 +3558,7 @@
 
 
 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3505,7 +3570,7 @@
 
 
 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3516,7 +3581,8 @@
 }
 
 
-LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3527,7 +3593,8 @@
 }
 
 
-LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3539,7 +3606,7 @@
 
 
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3550,7 +3617,8 @@
 }
 
 
-LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3561,7 +3629,8 @@
 }
 
 
-LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3572,7 +3641,8 @@
 }
 
 
-LocationSummary* Int32x4SelectInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3583,7 +3653,8 @@
 }
 
 
-LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3594,7 +3665,8 @@
 }
 
 
-LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3605,7 +3677,8 @@
 }
 
 
-LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3616,12 +3689,13 @@
 }
 
 
-LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
     summary->set_in(0, Location::FpuRegisterLocation(D6));
     summary->set_out(0, Location::FpuRegisterLocation(D0));
     return summary;
@@ -3630,8 +3704,8 @@
          (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3651,12 +3725,13 @@
 }
 
 
-LocationSummary* MathMinMaxInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* MathMinMaxInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     // Reuse the left register so that code can be made shorter.
@@ -3667,8 +3742,8 @@
   ASSERT(result_cid() == kSmiCid);
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Reuse the left register so that code can be made shorter.
@@ -3742,11 +3817,12 @@
 }
 
 
-LocationSummary* UnarySmiOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   // We make use of 3-operand instructions by not requiring result register
   // to be identical to first input register as on Intel.
@@ -3775,11 +3851,12 @@
 }
 
 
-LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   summary->set_temp(0, Location::RequiresFpuRegister());
@@ -3800,11 +3877,12 @@
 
 
 
-LocationSummary* SmiToDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::WritableRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -3820,11 +3898,12 @@
 }
 
 
-LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::RegisterLocation(T1));
   result->set_out(0, Location::RegisterLocation(V0));
   return result;
@@ -3866,11 +3945,12 @@
 }
 
 
-LocationSummary* DoubleToSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result = new LocationSummary(
-      kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresRegister());
   return result;
@@ -3892,7 +3972,8 @@
 }
 
 
-LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -3903,11 +3984,12 @@
 }
 
 
-LocationSummary* DoubleToFloatInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -3921,11 +4003,12 @@
 }
 
 
-LocationSummary* FloatToDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -3939,13 +4022,14 @@
 }
 
 
-LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
   // Calling convention on MIPS uses D6 and D7 to pass the first two
   // double arguments.
   ASSERT((InputCount() == 1) || (InputCount() == 2));
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, InputCount(), kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::FpuRegisterLocation(D6));
   if (InputCount() == 2) {
     result->set_in(1, Location::FpuRegisterLocation(D7));
@@ -4079,12 +4163,13 @@
 }
 
 
-LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   // Only use this instruction in optimized code.
   ASSERT(opt);
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, 0, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     if (index() == 0) {
       summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
@@ -4128,12 +4213,13 @@
 }
 
 
-LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* MergedMathInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::RequiresRegister());
     summary->set_temp(0, Location::RequiresRegister());
@@ -4208,7 +4294,7 @@
 
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   return MakeCallSummary();
 }
 
@@ -4251,8 +4337,9 @@
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(bool opt) const {
-  comparison()->InitializeLocationSummary(opt);
+LocationSummary* BranchInstr::MakeLocationSummary(Isolate* isolate,
+                                                  bool opt) const {
+  comparison()->InitializeLocationSummary(isolate, opt);
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
   return comparison()->locs();
@@ -4265,11 +4352,12 @@
 }
 
 
-LocationSummary* CheckClassInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->AddTemp(Location::RequiresRegister());
@@ -4319,11 +4407,12 @@
 }
 
 
-LocationSummary* CheckSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -4338,11 +4427,12 @@
 }
 
 
-LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
   locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
   return locs;
@@ -4384,7 +4474,8 @@
 }
 
 
-LocationSummary* UnboxIntegerInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxIntegerInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4395,7 +4486,8 @@
 }
 
 
-LocationSummary* BoxIntegerInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4406,7 +4498,8 @@
 }
 
 
-LocationSummary* BinaryMintOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4417,7 +4510,8 @@
 }
 
 
-LocationSummary* ShiftMintOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4428,7 +4522,8 @@
 }
 
 
-LocationSummary* UnaryMintOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -4439,8 +4534,9 @@
 }
 
 
-LocationSummary* ThrowInstr::MakeLocationSummary(bool opt) const {
-  return new LocationSummary(0, 0, LocationSummary::kCall);
+LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
+                                                 bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -4455,8 +4551,9 @@
 }
 
 
-LocationSummary* ReThrowInstr::MakeLocationSummary(bool opt) const {
-  return new LocationSummary(0, 0, LocationSummary::kCall);
+LocationSummary* ReThrowInstr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -4481,7 +4578,9 @@
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    compiler->EmitEdgeCounter();
+    if (FLAG_emit_edge_counters) {
+      compiler->EmitEdgeCounter();
+    }
     // On MIPS the deoptimization descriptor points after the edge counter
     // code so that we can reuse the same pattern matching code as at call
     // sites, which matches backwards from the end of the pattern.
@@ -4495,15 +4594,18 @@
 }
 
 
-LocationSummary* GotoInstr::MakeLocationSummary(bool opt) const {
-  return new LocationSummary(0, 0, LocationSummary::kNoCall);
+LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate,
+                                                bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
 }
 
 
 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ TraceSimMsg("GotoInstr");
   if (!compiler->is_optimizing()) {
-    compiler->EmitEdgeCounter();
+    if (FLAG_emit_edge_counters) {
+      compiler->EmitEdgeCounter();
+    }
     // Add a deoptimization descriptor for deoptimizing instructions that
     // may be inserted before this instruction.  On MIPS this descriptor
     // points after the edge counter code so that we can reuse the same
@@ -4525,7 +4627,8 @@
 }
 
 
-LocationSummary* CurrentContextInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   return LocationSummary::Make(0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -4537,19 +4640,20 @@
 }
 
 
-LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StrictCompareInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (needs_number_check()) {
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
     locs->set_in(0, Location::RegisterLocation(A0));
     locs->set_in(1, Location::RegisterLocation(A1));
     locs->set_out(0, Location::RegisterLocation(A0));
     return locs;
   }
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
@@ -4619,7 +4723,8 @@
 }
 
 
-LocationSummary* BooleanNegateInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   return LocationSummary::Make(1,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -4637,7 +4742,8 @@
 }
 
 
-LocationSummary* AllocateObjectInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   return MakeCallSummary();
 }
 
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 063890c..d3fda6d 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -20,6 +20,7 @@
 
 namespace dart {
 
+DECLARE_FLAG(bool, emit_edge_counters);
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(bool, propagate_ic_data);
 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
@@ -28,17 +29,19 @@
 // Generic summary for call instructions that have all arguments pushed
 // on the stack and return the result in a fixed register RAX.
 LocationSummary* Instruction::MakeCallSummary() {
-  LocationSummary* result = new LocationSummary(0, 0, LocationSummary::kCall);
+  LocationSummary* result = new LocationSummary(
+      Isolate::Current(), 0, 0, LocationSummary::kCall);
   result->set_out(0, Location::RegisterLocation(RAX));
   return result;
 }
 
 
-LocationSummary* PushArgumentInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* PushArgumentInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps= 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::AnyOrConstant(value()));
   return locs;
 }
@@ -61,11 +64,12 @@
 }
 
 
-LocationSummary* ReturnInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ReturnInstr::MakeLocationSummary(Isolate* isolate,
+                                                  bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   return locs;
 }
@@ -121,8 +125,9 @@
 }
 
 
-LocationSummary* IfThenElseInstr::MakeLocationSummary(bool opt) const {
-  comparison()->InitializeLocationSummary(opt);
+LocationSummary* IfThenElseInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
+  comparison()->InitializeLocationSummary(isolate, opt);
   // TODO(vegorov): support byte register constraints in the register allocator.
   comparison()->locs()->set_out(0, Location::RegisterLocation(RDX));
   return comparison()->locs();
@@ -178,7 +183,8 @@
 }
 
 
-LocationSummary* LoadLocalInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t stack_index = (local().index() < 0)
       ? kFirstLocalSlotFromFp - local().index()
@@ -195,7 +201,8 @@
 }
 
 
-LocationSummary* StoreLocalInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StoreLocalInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::SameAsFirstInput(),
@@ -211,7 +218,8 @@
 }
 
 
-LocationSummary* ConstantInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ConstantInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
   const intptr_t kNumInputs = 0;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -228,11 +236,12 @@
 }
 
 
-LocationSummary* UnboxedConstantInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxedConstantInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_out(0, Location::RequiresFpuRegister());
   return locs;
 }
@@ -252,11 +261,12 @@
 }
 
 
-LocationSummary* AssertAssignableInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AssertAssignableInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(RAX));  // Value.
   summary->set_in(1, Location::RegisterLocation(RCX));  // Instantiator.
   summary->set_in(2, Location::RegisterLocation(RDX));  // Type arguments.
@@ -265,11 +275,12 @@
 }
 
 
-LocationSummary* AssertBooleanInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AssertBooleanInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -326,12 +337,13 @@
 }
 
 
-LocationSummary* EqualityCompareInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* EqualityCompareInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   if (operation_cid() == kDoubleCid) {
     const intptr_t kNumTemps =  0;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RequiresFpuRegister());
     locs->set_in(1, Location::RequiresFpuRegister());
     locs->set_out(0, Location::RequiresRegister());
@@ -339,8 +351,8 @@
   }
   if (operation_cid() == kSmiCid) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     locs->set_in(0, Location::RegisterOrConstant(left()));
     // Only one input can be a constant operand. The case of two constant
     // operands should be handled by constant propagation.
@@ -509,11 +521,12 @@
 }
 
 
-LocationSummary* TestSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* TestSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -554,11 +567,12 @@
 
 
 
-LocationSummary* TestCidsInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* TestCidsInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
   locs->set_out(0, Location::RequiresRegister());
@@ -625,20 +639,21 @@
 }
 
 
-LocationSummary* RelationalOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* RelationalOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (operation_cid() == kDoubleCid) {
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     summary->set_out(0, Location::RequiresRegister());
     return summary;
   }
   ASSERT(operation_cid() == kSmiCid);
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RegisterOrConstant(left()));
   // Only one input can be a constant operand. The case of two constant
   // operands should be handled by constant propagation.
@@ -686,11 +701,12 @@
 }
 
 
-LocationSummary* NativeCallInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* NativeCallInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 3;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(RAX));
   locs->set_temp(1, Location::RegisterLocation(RBX));
   locs->set_temp(2, Location::RegisterLocation(R10));
@@ -735,14 +751,15 @@
   const Object& constant = index->definition()->AsConstant()->value();
   if (!constant.IsSmi()) return false;
   const Smi& smi_const = Smi::Cast(constant);
-  const intptr_t scale = FlowGraphCompiler::ElementSizeFor(cid);
-  const intptr_t data_offset = FlowGraphCompiler::DataOffsetFor(cid);
+  const intptr_t scale = Instance::ElementSizeFor(cid);
+  const intptr_t data_offset = Instance::DataOffsetFor(cid);
   const int64_t disp = smi_const.AsInt64Value() * scale + data_offset;
   return Utils::IsInt(32, disp);
 }
 
 
-LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   // TODO(fschneider): Allow immediate operands for the char code.
   return LocationSummary::Make(kNumInputs,
@@ -763,7 +780,8 @@
 }
 
 
-LocationSummary* StringToCharCodeInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -788,11 +806,12 @@
 }
 
 
-LocationSummary* StringInterpolateInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StringInterpolateInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(RAX));
   summary->set_out(0, Location::RegisterLocation(RAX));
   return summary;
@@ -814,7 +833,8 @@
 }
 
 
-LocationSummary* LoadUntaggedInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadUntaggedInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -829,7 +849,8 @@
 }
 
 
-LocationSummary* LoadClassIdInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadClassIdInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresRegister(),
@@ -920,11 +941,12 @@
 }
 
 
-LocationSummary* LoadIndexedInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadIndexedInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // The smi index is either untagged (element size == 1), or it is left smi
   // tagged (for all element sizes > 1).
@@ -951,29 +973,66 @@
 }
 
 
+static Address ElementAddressForIntIndex(bool is_external,
+                                         intptr_t cid,
+                                         intptr_t index_scale,
+                                         Register array,
+                                         intptr_t index) {
+  if (is_external) {
+    return Address(array, index * index_scale);
+  } else {
+    const int64_t disp = static_cast<int64_t>(index) * index_scale +
+        Instance::DataOffsetFor(cid);
+    ASSERT(Utils::IsInt(32, disp));
+    return FieldAddress(array, static_cast<int32_t>(disp));
+  }
+}
+
+
+static ScaleFactor ToScaleFactor(intptr_t index_scale) {
+  // Note that index is expected smi-tagged, (i.e, times 2) for all arrays with
+  // index scale factor > 1. E.g., for Uint8Array and OneByteString the index is
+  // expected to be untagged before accessing.
+  ASSERT(kSmiTagShift == 1);
+  switch (index_scale) {
+    case 1: return TIMES_1;
+    case 2: return TIMES_1;
+    case 4: return TIMES_2;
+    case 8: return TIMES_4;
+    case 16: return TIMES_8;
+    default:
+      UNREACHABLE();
+      return TIMES_1;
+  }
+}
+
+
+static Address ElementAddressForRegIndex(bool is_external,
+                                         intptr_t cid,
+                                         intptr_t index_scale,
+                                         Register array,
+                                         Register index) {
+  if (is_external) {
+    return Address(array, index, ToScaleFactor(index_scale), 0);
+  } else {
+    return FieldAddress(array,
+                        index,
+                        ToScaleFactor(index_scale),
+                        Instance::DataOffsetFor(cid));
+  }
+}
+
+
 void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register array = locs()->in(0).reg();
   Location index = locs()->in(1);
 
-  const bool is_external =
-      (this->array()->definition()->representation() == kUntagged);
   Address element_address(kNoRegister, 0);
-
-  if (is_external) {
-    element_address = index.IsRegister()
-        ? compiler->ExternalElementAddressForRegIndex(
-            index_scale(), array, index.reg())
-        : compiler->ExternalElementAddressForIntIndex(
-            index_scale(), array, Smi::Cast(index.constant()).Value());
-  } else {
-    ASSERT(this->array()->definition()->representation() == kTagged);
-    element_address = index.IsRegister()
-        ? compiler->ElementAddressForRegIndex(
-            class_id(), index_scale(), array, index.reg())
-        : compiler->ElementAddressForIntIndex(
-            class_id(), index_scale(), array,
-            Smi::Cast(index.constant()).Value());
-  }
+  element_address = index.IsRegister()
+      ? ElementAddressForRegIndex(IsExternal(), class_id(), index_scale(),
+                                  array, index.reg())
+      : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
+                                  array, Smi::Cast(index.constant()).Value());
 
   if ((representation() == kUnboxedDouble)    ||
       (representation() == kUnboxedFloat32x4) ||
@@ -1074,11 +1133,12 @@
 }
 
 
-LocationSummary* StoreIndexedInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StoreIndexedInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RequiresRegister());
   // The smi index is either untagged (element size == 1), or it is left smi
   // tagged (for all element sizes > 1).
@@ -1138,24 +1198,12 @@
   Register array = locs()->in(0).reg();
   Location index = locs()->in(1);
 
-  const bool is_external =
-      (this->array()->definition()->representation() == kUntagged);
   Address element_address(kNoRegister, 0);
-  if (is_external) {
-    element_address = index.IsRegister()
-        ? compiler->ExternalElementAddressForRegIndex(
-            index_scale(), array, index.reg())
-        : compiler->ExternalElementAddressForIntIndex(
-            index_scale(), array, Smi::Cast(index.constant()).Value());
-  } else {
-    ASSERT(this->array()->definition()->representation() == kTagged);
-    element_address = index.IsRegister()
-        ? compiler->ElementAddressForRegIndex(
-            class_id(), index_scale(), array, index.reg())
-        : compiler->ElementAddressForIntIndex(
-            class_id(), index_scale(), array,
-            Smi::Cast(index.constant()).Value());
-  }
+  element_address = index.IsRegister()
+      ? ElementAddressForRegIndex(IsExternal(), class_id(), index_scale(),
+                                  array, index.reg())
+      : ElementAddressForIntIndex(IsExternal(), class_id(), index_scale(),
+                                  array, Smi::Cast(index.constant()).Value());
 
   if ((index_scale() == 1) && index.IsRegister()) {
     __ SmiUntag(index.reg());
@@ -1248,10 +1296,11 @@
 }
 
 
-LocationSummary* GuardFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* GuardFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, 0, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   const bool field_has_length = field().needs_length_check();
   const bool need_value_temp_reg =
@@ -1622,11 +1671,12 @@
 };
 
 
-LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StoreInstanceFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps,
           !field().IsNull() &&
           ((field().guarded_cid() == kIllegalCid) || is_initialization_)
           ? LocationSummary::kCallOnSlowPath
@@ -1866,11 +1916,12 @@
 }
 
 
-LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -1889,8 +1940,10 @@
 }
 
 
-LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(bool opt) const {
-  LocationSummary* locs = new LocationSummary(1, 1, LocationSummary::kNoCall);
+LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, 1, 1, LocationSummary::kNoCall);
   locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister()
                                               : Location::RequiresRegister());
   locs->set_temp(0, Location::RequiresRegister());
@@ -1913,11 +1966,12 @@
 }
 
 
-LocationSummary* InstanceOfInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* InstanceOfInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(RAX));
   summary->set_in(1, Location::RegisterLocation(RCX));
   summary->set_in(2, Location::RegisterLocation(RDX));
@@ -1942,11 +1996,12 @@
 
 // TODO(srdjan): In case of constant inputs make CreateArray kNoCall and
 // use slow path stub.
-LocationSummary* CreateArrayInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CreateArrayInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RBX));
   locs->set_in(1, Location::RegisterLocation(R10));
   locs->set_out(0, Location::RegisterLocation(RAX));
@@ -2162,12 +2217,12 @@
 };
 
 
-LocationSummary* LoadFieldInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* LoadFieldInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(
-          kNumInputs, kNumTemps,
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps,
           (opt && !IsPotentialUnboxedLoad())
           ? LocationSummary::kNoCall
           : LocationSummary::kCallOnSlowPath);
@@ -2306,11 +2361,12 @@
 }
 
 
-LocationSummary* InstantiateTypeInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* InstantiateTypeInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -2338,11 +2394,11 @@
 
 
 LocationSummary* InstantiateTypeArgumentsInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -2409,11 +2465,12 @@
 }
 
 
-LocationSummary* AllocateContextInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AllocateContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_temp(0, Location::RegisterLocation(R10));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -2434,11 +2491,12 @@
 }
 
 
-LocationSummary* CloneContextInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   locs->set_in(0, Location::RegisterLocation(RAX));
   locs->set_out(0, Location::RegisterLocation(RAX));
   return locs;
@@ -2461,7 +2519,8 @@
 }
 
 
-LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CatchBlockEntryInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   UNREACHABLE();
   return NULL;
 }
@@ -2498,11 +2557,12 @@
 }
 
 
-LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckStackOverflowInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_temp(0, Location::RequiresRegister());
@@ -2742,7 +2802,8 @@
 }
 
 
-LocationSummary* BinarySmiOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 2;
 
   ConstantInstr* right_constant = right()->definition()->AsConstant();
@@ -2753,8 +2814,8 @@
       (op_kind() != Token::kMOD) &&
       CanBeImmediate(right_constant->value())) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    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_out(0, Location::SameAsFirstInput());
@@ -2763,8 +2824,8 @@
 
   if (op_kind() == Token::kTRUNCDIV) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     if (RightIsPowerOfTwoConstant()) {
       summary->set_in(0, Location::RequiresRegister());
       ConstantInstr* right_constant = right()->definition()->AsConstant();
@@ -2782,8 +2843,8 @@
     return summary;
   } else if (op_kind() == Token::kMOD) {
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     // Both inputs must be writable because they will be untagged.
     summary->set_in(0, Location::RegisterLocation(RDX));
     summary->set_in(1, Location::WritableRegister());
@@ -2793,16 +2854,16 @@
     return summary;
   } else if (op_kind() == Token::kSHR) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   } else if (op_kind() == Token::kSHL) {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
     if (!is_truncating()) {
@@ -2812,8 +2873,8 @@
     return summary;
   } else {
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     ConstantInstr* constant = right()->definition()->AsConstant();
     if (constant != NULL) {
@@ -3197,7 +3258,8 @@
 }
 
 
-LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   intptr_t left_cid = left()->Type()->ToCid();
   intptr_t right_cid = right()->Type()->ToCid();
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
@@ -3206,8 +3268,8 @@
                       && (left_cid != kSmiCid)
                       && (right_cid != kSmiCid);
   const intptr_t kNumTemps = need_temp ? 1 : 0;
-  LocationSummary* summary =
-    new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+    isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   if (need_temp) summary->set_temp(0, Location::RequiresRegister());
@@ -3238,11 +3300,12 @@
 }
 
 
-LocationSummary* BoxDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
@@ -3268,11 +3331,12 @@
 }
 
 
-LocationSummary* UnboxDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   const bool needs_writable_input = (value()->Type()->ToCid() != kDoubleCid);
   summary->set_in(0, needs_writable_input
                      ? Location::WritableRegister()
@@ -3321,11 +3385,12 @@
 }
 
 
-LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
@@ -3351,7 +3416,8 @@
 }
 
 
-LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::RequiresFpuRegister(),
@@ -3375,11 +3441,12 @@
 }
 
 
-LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxFloat64x2Instr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
@@ -3405,12 +3472,13 @@
 }
 
 
-LocationSummary* UnboxFloat64x2Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxFloat64x2Instr::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 == kFloat64x2Cid ? 0 : 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3433,11 +3501,12 @@
 }
 
 
-LocationSummary* BoxInt32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs,
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs,
                           kNumTemps,
                           LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::RequiresFpuRegister());
@@ -3495,11 +3564,12 @@
 }
 
 
-LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
@@ -3522,11 +3592,12 @@
 }
 
 
-LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3550,11 +3621,12 @@
 }
 
 
-LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryFloat32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3578,11 +3650,12 @@
 }
 
 
-LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryFloat64x2OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                             bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3606,11 +3679,12 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd32x4ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -3648,11 +3722,12 @@
 }
 
 
-LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd32x4ShuffleMixInstr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3675,11 +3750,12 @@
 }
 
 
-LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd32x4GetSignMaskInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -3696,11 +3772,11 @@
 
 
 LocationSummary* Float32x4ConstructorInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -3733,11 +3809,12 @@
 }
 
 
-LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ZeroInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -3749,11 +3826,12 @@
 }
 
 
-LocationSummary* Float32x4SplatInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4SplatInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -3770,11 +3848,12 @@
 }
 
 
-LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ComparisonInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3813,11 +3892,12 @@
 }
 
 
-LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4MinMaxInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3843,11 +3923,12 @@
 }
 
 
-LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ScaleInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -3872,11 +3953,12 @@
 }
 
 
-LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4SqrtInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -3903,11 +3985,12 @@
 }
 
 
-LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -3930,11 +4013,12 @@
 }
 
 
-LocationSummary* Float32x4ClampInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ClampInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -3953,11 +4037,12 @@
 }
 
 
-LocationSummary* Float32x4WithInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4WithInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4021,11 +4106,12 @@
 }
 
 
-LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float32x4ToInt32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4037,11 +4123,12 @@
 }
 
 
-LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Simd64x2ShuffleInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4064,11 +4151,12 @@
 }
 
 
-LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2ZeroInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 0;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_out(0, Location::RequiresFpuRegister());
   return summary;
 }
@@ -4080,11 +4168,12 @@
 }
 
 
-LocationSummary* Float64x2SplatInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2SplatInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4098,11 +4187,11 @@
 
 
 LocationSummary* Float64x2ConstructorInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4123,11 +4212,11 @@
 
 
 LocationSummary* Float64x2ToFloat32x4Instr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4141,11 +4230,11 @@
 
 
 LocationSummary* Float32x4ToFloat64x2Instr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4158,11 +4247,12 @@
 }
 
 
-LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2ZeroArgInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (representation() == kTagged) {
     ASSERT(op_kind() == MethodRecognizer::kFloat64x2GetSignMask);
@@ -4200,11 +4290,12 @@
 }
 
 
-LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Float64x2OneArgInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4254,11 +4345,11 @@
 
 
 LocationSummary* Int32x4BoolConstructorInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   const intptr_t kNumInputs = 4;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  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());
@@ -4323,11 +4414,12 @@
 }
 
 
-LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4GetFlagInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::RequiresRegister());
   return summary;
@@ -4368,11 +4460,12 @@
 }
 
 
-LocationSummary* Int32x4SelectInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4SelectInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 3;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_in(2, Location::RequiresFpuRegister());
@@ -4402,11 +4495,12 @@
 }
 
 
-LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4SetFlagInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresRegister());
   summary->set_temp(0, Location::RequiresRegister());
@@ -4468,11 +4562,12 @@
 }
 
 
-LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(bool opt) const {
+LocationSummary* Int32x4ToFloat32x4Instr::MakeLocationSummary(Isolate* isolate,
+                                                              bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4484,11 +4579,12 @@
 }
 
 
-LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryInt32x4OpInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_in(1, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
@@ -4524,7 +4620,8 @@
 }
 
 
-LocationSummary* MathUnaryInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* MathUnaryInstr::MakeLocationSummary(Isolate* isolate,
+                                                     bool opt) const {
   if ((kind() == MathUnaryInstr::kSin) || (kind() == MathUnaryInstr::kCos)) {
     // Calling convention on x64 uses XMM0 and XMM1 to pass the first two
     // double arguments and XMM0 to return the result. Unfortunately
@@ -4532,8 +4629,8 @@
     // assumes that XMM0 is free at all times.
     // TODO(vegorov): allow XMM0 to be used.
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary =
-        new LocationSummary(InputCount(), kNumTemps, LocationSummary::kCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, InputCount(), kNumTemps, LocationSummary::kCall);
     summary->set_in(0, Location::FpuRegisterLocation(XMM1));
     // R13 is chosen because it is callee saved so we do not need to back it
     // up before calling into the runtime.
@@ -4545,8 +4642,8 @@
          (kind() == MathUnaryInstr::kDoubleSquare));
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   if (kind() == MathUnaryInstr::kDoubleSquare) {
     summary->set_out(0, Location::SameAsFirstInput());
@@ -4579,7 +4676,8 @@
 }
 
 
-LocationSummary* UnarySmiOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnarySmiOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   return LocationSummary::Make(kNumInputs,
                                Location::SameAsFirstInput(),
@@ -4611,11 +4709,12 @@
 }
 
 
-LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnaryDoubleOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresFpuRegister());
   summary->set_out(0, Location::SameAsFirstInput());
   return summary;
@@ -4629,12 +4728,13 @@
 }
 
 
-LocationSummary* MathMinMaxInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* MathMinMaxInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   if (result_cid() == kDoubleCid) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresFpuRegister());
     summary->set_in(1, Location::RequiresFpuRegister());
     // Reuse the left register so that code can be made shorter.
@@ -4645,8 +4745,8 @@
   ASSERT(result_cid() == kSmiCid);
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RequiresRegister());
   // Reuse the left register so that code can be made shorter.
@@ -4718,11 +4818,12 @@
 }
 
 
-LocationSummary* SmiToDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::WritableRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4737,11 +4838,12 @@
 }
 
 
-LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   result->set_in(0, Location::RegisterLocation(RCX));
   result->set_out(0, Location::RegisterLocation(RAX));
   result->set_temp(0, Location::RegisterLocation(RBX));
@@ -4788,11 +4890,12 @@
 }
 
 
-LocationSummary* DoubleToSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 1;
-  LocationSummary* result = new LocationSummary(
-      kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location:: Location::RequiresRegister());
   result->set_temp(0, Location::RequiresRegister());
@@ -4820,11 +4923,12 @@
 }
 
 
-LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::RequiresFpuRegister());
   return result;
@@ -4850,11 +4954,12 @@
 }
 
 
-LocationSummary* DoubleToFloatInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* DoubleToFloatInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -4866,11 +4971,12 @@
 }
 
 
-LocationSummary* FloatToDoubleInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* FloatToDoubleInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* result =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
   result->set_out(0, Location::SameAsFirstInput());
   return result;
@@ -4882,7 +4988,8 @@
 }
 
 
-LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* InvokeMathCFunctionInstr::MakeLocationSummary(Isolate* isolate,
+                                                               bool opt) const {
   // Calling convention on x64 uses XMM0 and XMM1 to pass the first two
   // double arguments and XMM0 to return the result. Unfortunately
   // currently we can't specify these registers because ParallelMoveResolver
@@ -4890,8 +4997,8 @@
   // TODO(vegorov): allow XMM0 to be used.
   ASSERT((InputCount() == 1) || (InputCount() == 2));
   const intptr_t kNumTemps = 1;
-  LocationSummary* result =
-      new LocationSummary(InputCount(), kNumTemps, LocationSummary::kCall);
+  LocationSummary* result = new(isolate) LocationSummary(
+      isolate, InputCount(), kNumTemps, LocationSummary::kCall);
   result->set_temp(0, Location::RegisterLocation(R13));
   result->set_in(0, Location::FpuRegisterLocation(XMM2));
   if (InputCount() == 2) {
@@ -5063,12 +5170,13 @@
 }
 
 
-LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ExtractNthOutputInstr::MakeLocationSummary(Isolate* isolate,
+                                                            bool opt) const {
   // Only use this instruction in optimized code.
   ASSERT(opt);
   const intptr_t kNumInputs = 1;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, 0, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, 0, LocationSummary::kNoCall);
   if (representation() == kUnboxedDouble) {
     if (index() == 0) {
       summary->set_in(0, Location::Pair(Location::RequiresFpuRegister(),
@@ -5112,12 +5220,13 @@
 }
 
 
-LocationSummary* MergedMathInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* MergedMathInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   if (kind() == MergedMathInstr::kTruncDivMod) {
     const intptr_t kNumInputs = 2;
     const intptr_t kNumTemps = 0;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     // Both inputs must be writable because they will be untagged.
     summary->set_in(0, Location::RegisterLocation(RAX));
     summary->set_in(1, Location::WritableRegister());
@@ -5128,8 +5237,8 @@
   if (kind() == MergedMathInstr::kSinCos) {
     const intptr_t kNumInputs = 1;
     const intptr_t kNumTemps = 1;
-    LocationSummary* summary =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* summary = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
     // Because we always call into the runtime (LocationSummary::kCall) we
     // must specify each input, temp, and output register explicitly.
     summary->set_in(0, Location::FpuRegisterLocation(XMM1));
@@ -5287,7 +5396,7 @@
 
 
 LocationSummary* PolymorphicInstanceCallInstr::MakeLocationSummary(
-    bool opt) const {
+    Isolate* isolate, bool opt) const {
   return MakeCallSummary();
 }
 
@@ -5328,8 +5437,9 @@
 }
 
 
-LocationSummary* BranchInstr::MakeLocationSummary(bool opt) const {
-  comparison()->InitializeLocationSummary(opt);
+LocationSummary* BranchInstr::MakeLocationSummary(Isolate* isolate,
+                                                  bool opt) const {
+  comparison()->InitializeLocationSummary(isolate, opt);
   // Branches don't produce a result.
   comparison()->locs()->set_out(0, Location::NoLocation());
   return comparison()->locs();
@@ -5341,11 +5451,12 @@
 }
 
 
-LocationSummary* CheckClassInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckClassInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   if (!IsNullCheck()) {
     summary->AddTemp(Location::RequiresRegister());
@@ -5400,11 +5511,12 @@
 }
 
 
-LocationSummary* CheckSmiInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckSmiInstr::MakeLocationSummary(Isolate* isolate,
+                                                    bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   summary->set_in(0, Location::RequiresRegister());
   return summary;
 }
@@ -5418,11 +5530,12 @@
 }
 
 
-LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CheckArrayBoundInstr::MakeLocationSummary(Isolate* isolate,
+                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(kLengthPos, Location::RegisterOrSmiConstant(length()));
   locs->set_in(kIndexPos, Location::RegisterOrSmiConstant(index()));
   return locs;
@@ -5467,7 +5580,8 @@
 }
 
 
-LocationSummary* UnboxIntegerInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnboxIntegerInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -5478,7 +5592,8 @@
 }
 
 
-LocationSummary* BoxIntegerInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate,
+                                                      bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -5489,7 +5604,8 @@
 }
 
 
-LocationSummary* BinaryMintOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BinaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                        bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -5500,7 +5616,8 @@
 }
 
 
-LocationSummary* UnaryMintOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* UnaryMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -5511,7 +5628,8 @@
 }
 
 
-LocationSummary* ShiftMintOpInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ShiftMintOpInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   UNIMPLEMENTED();
   return NULL;
 }
@@ -5522,8 +5640,9 @@
 }
 
 
-LocationSummary* ThrowInstr::MakeLocationSummary(bool opt) const {
-  return new LocationSummary(0, 0, LocationSummary::kCall);
+LocationSummary* ThrowInstr::MakeLocationSummary(Isolate* isolate,
+                                                 bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -5537,8 +5656,9 @@
 }
 
 
-LocationSummary* ReThrowInstr::MakeLocationSummary(bool opt) const {
-  return new LocationSummary(0, 0, LocationSummary::kCall);
+LocationSummary* ReThrowInstr::MakeLocationSummary(Isolate* isolate,
+                                                   bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kCall);
 }
 
 
@@ -5563,7 +5683,9 @@
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    compiler->EmitEdgeCounter();
+    if (FLAG_emit_edge_counters) {
+      compiler->EmitEdgeCounter();
+    }
     // The deoptimization descriptor points after the edge counter code for
     // uniformity with ARM and MIPS, where we can reuse pattern matching
     // code that matches backwards from the end of the pattern.
@@ -5577,14 +5699,17 @@
 }
 
 
-LocationSummary* GotoInstr::MakeLocationSummary(bool opt) const {
-  return new LocationSummary(0, 0, LocationSummary::kNoCall);
+LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate,
+                                                bool opt) const {
+  return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall);
 }
 
 
 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   if (!compiler->is_optimizing()) {
-    compiler->EmitEdgeCounter();
+    if (FLAG_emit_edge_counters) {
+      compiler->EmitEdgeCounter();
+    }
     // Add a deoptimization descriptor for deoptimizing instructions that
     // may be inserted before this instruction.  This descriptor points
     // after the edge counter for uniformity with ARM and MIPS, where we can
@@ -5606,7 +5731,8 @@
 }
 
 
-LocationSummary* CurrentContextInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   return LocationSummary::Make(0,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -5618,19 +5744,20 @@
 }
 
 
-LocationSummary* StrictCompareInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* StrictCompareInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps = 0;
   if (needs_number_check()) {
-    LocationSummary* locs =
-        new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+    LocationSummary* locs = new(isolate) LocationSummary(
+        isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
     locs->set_in(0, Location::RegisterLocation(RAX));
     locs->set_in(1, Location::RegisterLocation(RCX));
     locs->set_out(0, Location::RegisterLocation(RAX));
     return locs;
   }
-  LocationSummary* locs =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
+  LocationSummary* locs = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   locs->set_in(0, Location::RegisterOrConstant(left()));
   // Only one of the inputs can be a constant. Choose register if the first one
   // is a constant.
@@ -5699,11 +5826,12 @@
 }
 
 
-LocationSummary* ClosureCallInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* ClosureCallInstr::MakeLocationSummary(Isolate* isolate,
+                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
   const intptr_t kNumTemps = 0;
-  LocationSummary* summary =
-      new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+  LocationSummary* summary = new(isolate) LocationSummary(
+      isolate, kNumInputs, kNumTemps, LocationSummary::kCall);
   summary->set_in(0, Location::RegisterLocation(RAX));  // Function.
   summary->set_out(0, Location::RegisterLocation(RAX));
   return summary;
@@ -5749,7 +5877,8 @@
 }
 
 
-LocationSummary* BooleanNegateInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* BooleanNegateInstr::MakeLocationSummary(Isolate* isolate,
+                                                         bool opt) const {
   return LocationSummary::Make(1,
                                Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -5769,7 +5898,8 @@
 }
 
 
-LocationSummary* AllocateObjectInstr::MakeLocationSummary(bool opt) const {
+LocationSummary* AllocateObjectInstr::MakeLocationSummary(Isolate* isolate,
+                                                          bool opt) const {
   return MakeCallSummary();
 }
 
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index f55b91c..9480bfd 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -1249,12 +1249,9 @@
     __ ldr(R1, FieldAddress(R0, state_field.Offset()));  // Field '_state'.
     // Addresses of _state[0] and _state[1].
 
-    const int64_t disp_0 =
-        FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid);
-
-    const int64_t disp_1 =
-        FlowGraphCompiler::ElementSizeFor(kTypedDataUint32ArrayCid) +
-        FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid);
+    const int64_t disp_0 = Instance::DataOffsetFor(kTypedDataUint32ArrayCid);
+    const int64_t disp_1 = disp_0 +
+        Instance::ElementSizeFor(kTypedDataUint32ArrayCid);
 
     __ LoadImmediate(R0, a_int32_value);
     __ LoadFromOffset(kWord, R2, R1, disp_0 - kHeapObjectTag);
diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
index a6fbb38..5d9d5bd 100644
--- a/runtime/vm/intrinsifier_arm64.cc
+++ b/runtime/vm/intrinsifier_arm64.cc
@@ -1134,8 +1134,7 @@
 
   // Addresses of _state[0].
   const int64_t disp =
-      FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid) -
-      kHeapObjectTag;
+      Instance::DataOffsetFor(kTypedDataUint32ArrayCid) - kHeapObjectTag;
 
   __ LoadImmediate(R0, a_int_value, kNoPP);
   __ LoadFromOffset(R2, R1, disp, kNoPP);
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index 438a994..bce10c3 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -1248,12 +1248,10 @@
   __ movl(EAX, Address(ESP, + 1 * kWordSize));  // Receiver.
   __ movl(EBX, FieldAddress(EAX, state_field.Offset()));  // Field '_state'.
   // Addresses of _state[0] and _state[1].
-  const intptr_t index_scale =
-      FlowGraphCompiler::ElementSizeFor(kTypedDataUint32ArrayCid);
-  const intptr_t offset =
-      FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid);
-  Address addr_0 = FieldAddress(EBX, 0 * index_scale + offset);
-  Address addr_1 = FieldAddress(EBX, 1 * index_scale + offset);
+  const intptr_t scale = Instance::ElementSizeFor(kTypedDataUint32ArrayCid);
+  const intptr_t offset = Instance::DataOffsetFor(kTypedDataUint32ArrayCid);
+  Address addr_0 = FieldAddress(EBX, 0 * scale + offset);
+  Address addr_1 = FieldAddress(EBX, 1 * scale + offset);
   __ movl(EAX, Immediate(a_int32_value));
   // 64-bit multiply EAX * value -> EDX:EAX.
   __ mull(addr_0);
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index c352ced..e69fba9 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -1275,12 +1275,10 @@
   __ lw(T1, FieldAddress(T0, state_field.Offset()));  // Field '_state'.
 
   // Addresses of _state[0] and _state[1].
-  const Address& addr_0 = FieldAddress(T1,
-      FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid));
-
-  const Address& addr_1 = FieldAddress(T1,
-      FlowGraphCompiler::ElementSizeFor(kTypedDataUint32ArrayCid) +
-      FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid));
+  const intptr_t scale = Instance::ElementSizeFor(kTypedDataUint32ArrayCid);
+  const intptr_t offset = Instance::DataOffsetFor(kTypedDataUint32ArrayCid);
+  const Address& addr_0 = FieldAddress(T1, 0 * scale + offset);
+  const Address& addr_1 = FieldAddress(T1, 1 * scale + offset);
 
   __ LoadImmediate(T0, a_int32_value);
   __ lw(T2, addr_0);
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index 5364ce1..e3edffe 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -1150,12 +1150,10 @@
   __ movq(RAX, Address(RSP, + 1 * kWordSize));  // Receiver.
   __ movq(RBX, FieldAddress(RAX, state_field.Offset()));  // Field '_state'.
   // Addresses of _state[0] and _state[1].
-  const intptr_t index_scale =
-      FlowGraphCompiler::ElementSizeFor(kTypedDataUint32ArrayCid);
-  const intptr_t offset =
-      FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid);
-  Address addr_0 = FieldAddress(RBX, 0 * index_scale + offset);
-  Address addr_1 = FieldAddress(RBX, 1 * index_scale + offset);
+  const intptr_t scale = Instance::ElementSizeFor(kTypedDataUint32ArrayCid);
+  const intptr_t offset = Instance::DataOffsetFor(kTypedDataUint32ArrayCid);
+  Address addr_0 = FieldAddress(RBX, 0 * scale + offset);
+  Address addr_1 = FieldAddress(RBX, 1 * scale + offset);
   __ movq(RAX, Immediate(a_int_value));
   __ movl(RCX, addr_0);
   __ imulq(RCX, RAX);
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index e97589be..1fcf7e4 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -37,8 +37,6 @@
 
 namespace dart {
 
-DEFINE_FLAG(bool, report_usage_count, false,
-            "Track function usage and report.");
 DEFINE_FLAG(bool, trace_isolates, false,
             "Trace isolate creation and shut down.");
 DEFINE_FLAG(bool, pause_isolates_on_start, false,
@@ -189,7 +187,12 @@
       Function::Handle(isolate_, lib.LookupLocalFunction(callback_name));
   if (func.IsNull()) {
     lib = isolate_->object_store()->root_library();
-    func = lib.LookupLocalFunction(callback_name);
+    // Note: bootstrap code in builtin library may attempt to resolve a
+    // callback function before the script is fully loaded, in which case
+    // the root library may not be registered yet.
+    if (!lib.IsNull()) {
+      func = lib.LookupLocalFunction(callback_name);
+    }
   }
   return func.raw();
 }
@@ -443,8 +446,6 @@
   result->SetStackLimitFromCurrentTOS(reinterpret_cast<uword>(&result));
   result->set_main_port(PortMap::CreatePort(result->message_handler()));
   result->BuildName(name_prefix);
-  result->message_handler()->set_pause_on_start(FLAG_pause_isolates_on_start);
-  result->message_handler()->set_pause_on_exit(FLAG_pause_isolates_on_exit);
 
   result->debugger_ = new Debugger();
   result->debugger_->Initialize(result);
@@ -544,6 +545,10 @@
   // Set the isolate as runnable and if we are being spawned schedule
   // isolate on thread pool for execution.
   is_runnable_ = true;
+  if (!Service::IsServiceIsolate(this)) {
+    message_handler()->set_pause_on_start(FLAG_pause_isolates_on_start);
+    message_handler()->set_pause_on_exit(FLAG_pause_isolates_on_exit);
+  }
   IsolateSpawnState* state = spawn_state();
   if (state != NULL) {
     ASSERT(this == state->isolate());
@@ -762,11 +767,8 @@
     delete message_handler();
     set_message_handler(NULL);
 
-    // Dump all accumalated timer data for the isolate.
+    // Dump all accumulated timer data for the isolate.
     timer_list_.ReportTimers();
-    if (FLAG_report_usage_count) {
-      PrintInvokedFunctions();
-    }
 
     // Write out profiler data if requested.
     Profiler::WriteProfile(this);
@@ -976,19 +978,31 @@
     typeargsRef.AddProperty("id", "typearguments");
     typeargsRef.AddProperty("name", "canonical type arguments");
   }
+  bool is_io_enabled = false;
   {
     const GrowableObjectArray& libs =
         GrowableObjectArray::Handle(object_store()->libraries());
     intptr_t num_libs = libs.Length();
-    Library &lib = Library::Handle();
+    Library& lib = Library::Handle();
+    String& name = String::Handle();
 
     JSONArray lib_array(&jsobj, "libraries");
     for (intptr_t i = 0; i < num_libs; i++) {
       lib ^= libs.At(i);
+      name = lib.name();
+      if (name.Equals(Symbols::DartIOLibName())) {
+        is_io_enabled = true;
+      }
       ASSERT(!lib.IsNull());
       lib_array.AddValue(lib);
     }
   }
+  {
+    JSONArray features_array(&jsobj, "features");
+    if (is_io_enabled) {
+      features_array.AddValue("io");
+    }
+  }
 }
 
 
diff --git a/runtime/vm/locations.cc b/runtime/vm/locations.cc
index 9809707..ee2ed2c 100644
--- a/runtime/vm/locations.cc
+++ b/runtime/vm/locations.cc
@@ -23,12 +23,13 @@
 }
 
 
-LocationSummary::LocationSummary(intptr_t input_count,
+LocationSummary::LocationSummary(Isolate* isolate,
+                                 intptr_t input_count,
                                  intptr_t temp_count,
                                  LocationSummary::ContainsCall contains_call)
-    : input_locations_(input_count),
-      temp_locations_(temp_count),
-      output_locations_(1),
+    : input_locations_(isolate, input_count),
+      temp_locations_(isolate, temp_count),
+      output_locations_(isolate, 1),
       stack_bitmap_(NULL),
       contains_call_(contains_call),
       live_registers_() {
@@ -40,19 +41,17 @@
   }
   output_locations_.Add(Location());
   ASSERT(output_locations_.length() == 1);
-  if (contains_call_ != kNoCall) {
-    stack_bitmap_ = new BitmapBuilder();
-  }
 }
 
 
-LocationSummary::LocationSummary(intptr_t input_count,
-                                intptr_t temp_count,
-                                intptr_t output_count,
-                                LocationSummary::ContainsCall contains_call)
-    : input_locations_(input_count),
-      temp_locations_(temp_count),
-      output_locations_(output_count),
+LocationSummary::LocationSummary(Isolate* isolate,
+                                 intptr_t input_count,
+                                 intptr_t temp_count,
+                                 intptr_t output_count,
+                                 LocationSummary::ContainsCall contains_call)
+    : input_locations_(isolate, input_count),
+      temp_locations_(isolate, temp_count),
+      output_locations_(isolate, output_count),
       stack_bitmap_(NULL),
       contains_call_(contains_call),
       live_registers_() {
@@ -68,9 +67,6 @@
   for (intptr_t i = 0; i < output_count; i++) {
     output_locations_.Add(Location());
   }
-  if (contains_call_ != kNoCall) {
-    stack_bitmap_ = new BitmapBuilder();
-  }
 }
 
 
@@ -78,7 +74,8 @@
     intptr_t input_count,
     Location out,
     LocationSummary::ContainsCall contains_call) {
-  LocationSummary* summary = new LocationSummary(input_count, 0, contains_call);
+  LocationSummary* summary = new LocationSummary(
+      Isolate::Current(), input_count, 0, contains_call);
   for (intptr_t i = 0; i < input_count; i++) {
     summary->set_in(i, Location::RequiresRegister());
   }
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index cf6a60b..d01ebdb 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -522,11 +522,13 @@
   };
 
   // Defaults to 1 output.
-  LocationSummary(intptr_t input_count,
+  LocationSummary(Isolate* isolate,
+                  intptr_t input_count,
                   intptr_t temp_count,
                   LocationSummary::ContainsCall contains_call);
 
-  LocationSummary(intptr_t input_count,
+  LocationSummary(Isolate* isolate,
+                  intptr_t input_count,
                   intptr_t temp_count,
                   intptr_t output_count,
                   LocationSummary::ContainsCall contains_call);
@@ -589,7 +591,15 @@
     output_locations_[index] = loc;
   }
 
-  BitmapBuilder* stack_bitmap() const { return stack_bitmap_; }
+  BitmapBuilder* stack_bitmap() {
+    if (stack_bitmap_ == NULL) {
+      stack_bitmap_ = new BitmapBuilder();
+    }
+    return stack_bitmap_;
+  }
+  void SetStackBit(intptr_t index) {
+    stack_bitmap()->Set(index, true);
+  }
 
   bool always_calls() const {
     return contains_call_ == kCall;
@@ -614,9 +624,9 @@
   }
 
  private:
-  ZoneGrowableArray<Location> input_locations_;
-  ZoneGrowableArray<Location> temp_locations_;
-  ZoneGrowableArray<Location> output_locations_;
+  GrowableArray<Location> input_locations_;
+  GrowableArray<Location> temp_locations_;
+  GrowableArray<Location> output_locations_;
 
   BitmapBuilder* stack_bitmap_;
 
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 3c18a07..a5e6ed6 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -62,6 +62,7 @@
 DEFINE_FLAG(bool, throw_on_javascript_int_overflow, false,
     "Throw an exception when the result of an integer calculation will not "
     "fit into a javascript integer.");
+DEFINE_FLAG(bool, use_field_guards, true, "Guard field cids.");
 DEFINE_FLAG(bool, use_lib_cache, true, "Use library name cache");
 
 DECLARE_FLAG(bool, eliminate_type_checks);
@@ -6782,10 +6783,10 @@
   result.set_token_pos(token_pos);
   result.set_has_initializer(false);
   result.set_is_unboxing_candidate(true);
-  result.set_guarded_cid(kIllegalCid);
-  result.set_is_nullable(false);
+  result.set_guarded_cid(FLAG_use_field_guards ? kIllegalCid : kDynamicCid);
+  result.set_is_nullable(FLAG_use_field_guards ? false : true);
   // Presently, we only attempt to remember the list length for final fields.
-  if (is_final) {
+  if (is_final && FLAG_use_field_guards) {
     result.set_guarded_list_length(Field::kUnknownFixedLength);
   } else {
     result.set_guarded_list_length(Field::kNoFixedLength);
@@ -11088,9 +11089,10 @@
 
 intptr_t ICData::GetReceiverClassIdAt(intptr_t index) const {
   ASSERT(index < NumberOfChecks());
-  const Array& data = Array::Handle(ic_data());
   const intptr_t data_pos = index * TestEntryLength();
-  return Smi::Value(Smi::RawCast(data.At(data_pos)));
+  NoGCScope no_gc;
+  RawArray* raw_data = ic_data();
+  return Smi::Value(Smi::RawCast(raw_data->ptr()->data()[data_pos]));
 }
 
 
@@ -11607,13 +11609,12 @@
       // GrowableObjectArray in new space.
       instrs.set_object_pool(Array::MakeArray(object_pool));
     }
-    bool status =
-        VirtualMemory::Protect(reinterpret_cast<void*>(instrs.raw_ptr()),
-                               instrs.raw()->Size(),
-                               FLAG_write_protect_code
-                                   ? VirtualMemory::kReadExecute
-                                   : VirtualMemory::kReadWriteExecute);
-    ASSERT(status);
+    if (FLAG_write_protect_code) {
+      bool status = VirtualMemory::Protect(
+          reinterpret_cast<void*>(instrs.raw_ptr()), instrs.raw()->Size(),
+          VirtualMemory::kReadExecute);
+      ASSERT(status);
+    }
   }
   code.set_comments(assembler->GetCodeComments());
   return code.raw();
@@ -13054,6 +13055,50 @@
 }
 
 
+intptr_t Instance::ElementSizeFor(intptr_t cid) {
+  if (RawObject::IsExternalTypedDataClassId(cid)) {
+    return ExternalTypedData::ElementSizeInBytes(cid);
+  } else if (RawObject::IsTypedDataClassId(cid)) {
+    return TypedData::ElementSizeInBytes(cid);
+  }
+  switch (cid) {
+    case kArrayCid:
+    case kImmutableArrayCid:
+      return Array::kBytesPerElement;
+    case kOneByteStringCid:
+      return OneByteString::kBytesPerElement;
+    case kTwoByteStringCid:
+      return TwoByteString::kBytesPerElement;
+    default:
+      UNIMPLEMENTED();
+      return 0;
+  }
+}
+
+
+intptr_t Instance::DataOffsetFor(intptr_t cid) {
+  if (RawObject::IsExternalTypedDataClassId(cid)) {
+    // Elements start at offset 0 of the external data.
+    return 0;
+  }
+  if (RawObject::IsTypedDataClassId(cid)) {
+    return TypedData::data_offset();
+  }
+  switch (cid) {
+    case kArrayCid:
+    case kImmutableArrayCid:
+      return Array::data_offset();
+    case kOneByteStringCid:
+      return OneByteString::data_offset();
+    case kTwoByteStringCid:
+      return TwoByteString::data_offset();
+    default:
+      UNIMPLEMENTED();
+      return Array::data_offset();
+  }
+}
+
+
 const char* Instance::ToCString() const {
   if (IsNull()) {
     return "null";
@@ -13138,6 +13183,15 @@
 }
 
 
+void Object::PrintJSONImpl(JSONStream* stream, bool ref) const {
+  JSONObject jsobj(stream);
+  jsobj.AddProperty("type", JSONType(ref));
+  ObjectIdRing* ring = Isolate::Current()->object_id_ring();
+  const intptr_t id = ring->GetIdForObject(raw());
+  jsobj.AddPropertyF("id", "objects/%" Pd "", id);
+}
+
+
 void Instance::PrintJSONImpl(JSONStream* stream, bool ref) const {
   JSONObject jsobj(stream);
 
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index a425f80..11edabf 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -577,10 +577,7 @@
   RawObject* raw_;  // The raw object reference.
 
  protected:
-  virtual void PrintJSONImpl(JSONStream* stream, bool ref) const {
-    JSONObject jsobj(stream);
-    jsobj.AddProperty("type", JSONType(ref));
-  }
+  virtual void PrintJSONImpl(JSONStream* stream, bool ref) const;
 
  private:
   static intptr_t NextFieldOffset() {
@@ -4215,6 +4212,10 @@
 
   static RawInstance* New(const Class& cls, Heap::Space space = Heap::kNew);
 
+  // Array/list element address computations.
+  static intptr_t DataOffsetFor(intptr_t cid);
+  static intptr_t ElementSizeFor(intptr_t cid);
+
  protected:
   virtual void PrintSharedInstanceJSON(JSONObject* jsobj, bool ref) const;
 
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index 5b547b5..154e742 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -223,13 +223,14 @@
       return kProceed;
     } else {
       HANDLESCOPE(Isolate::Current());
-      Object& parent = Object::Handle();
-      for (length_ = 0; it->MoveToParent(); ++length_) {
+      Object& current = Object::Handle();
+      do {
         if (!path_.IsNull() && length_ < path_.Length()) {
-          parent = it->Get();
-          path_.SetAt(length_, parent);
+          current = it->Get();
+          path_.SetAt(length_, current);
         }
-      }
+        ++length_;
+      } while (it->MoveToParent());
       return kAbort;
     }
   }
diff --git a/runtime/vm/object_graph.h b/runtime/vm/object_graph.h
index d7e60ef..cc0d11a 100644
--- a/runtime/vm/object_graph.h
+++ b/runtime/vm/object_graph.h
@@ -69,9 +69,9 @@
   intptr_t SizeRetainedByClass(intptr_t class_id);
 
   // Finds some retaining path from the isolate roots to 'obj'. Populates the
-  // provided array, starting with a direct parent of 'obj', up to the smaller
-  // of the length of the array and the length of the path. Returns the length
-  // of the path. A null input array behaves like a zero-length input array.
+  // provided array, starting 'obj' itself, up to the smaller of the length of
+  // the array and the length of the path. Returns the length of the path. A
+  // null input array behaves like a zero-length input array.
   //
   // To break the trivial path, the handle 'obj' is temporarily cleared during
   // the search, but restored before returning. If no path is found (i.e., the
diff --git a/runtime/vm/object_graph_test.cc b/runtime/vm/object_graph_test.cc
index de5a63e..91d0765 100644
--- a/runtime/vm/object_graph_test.cc
+++ b/runtime/vm/object_graph_test.cc
@@ -98,7 +98,6 @@
     b = Array::null();
     ObjectGraph graph(isolate);
     // A retaining path should end like this: c <- b <- a <- ...
-    // c itself is not included in the returned path and length.
     {
       HANDLESCOPE(isolate);
       // Test null, empty, and length 1 array.
@@ -108,17 +107,20 @@
       intptr_t one_length = graph.RetainingPath(&c, path);
       EXPECT_EQ(null_length, empty_length);
       EXPECT_EQ(null_length, one_length);
-      EXPECT_LE(2, null_length);
+      EXPECT_LE(3, null_length);
     }
     {
       HANDLESCOPE(isolate);
-      Array& path = Array::Handle(Array::New(2, Heap::kNew));
+      Array& path = Array::Handle(Array::New(3, Heap::kNew));
       intptr_t length = graph.RetainingPath(&c, path);
-      EXPECT_LE(2, length);
+      EXPECT_LE(3, length);
+      Array& expected_c = Array::Handle();
+      expected_c ^= path.At(0);
       Array& expected_b = Array::Handle();
-      expected_b ^= path.At(0);
+      expected_b ^= path.At(1);
       Array& expected_a = Array::Handle();
-      expected_a ^= path.At(1);
+      expected_a ^= path.At(2);
+      EXPECT(expected_c.raw() == c.raw());
       EXPECT(expected_b.raw() == a.At(0));
       EXPECT(expected_a.raw() == a.raw());
     }
diff --git a/runtime/vm/os_win.cc b/runtime/vm/os_win.cc
index 98e864e..800e759 100644
--- a/runtime/vm/os_win.cc
+++ b/runtime/vm/os_win.cc
@@ -316,12 +316,8 @@
   init_once_called = true;
   // Do not pop up a message box when abort is called.
   _set_abort_behavior(0, _WRITE_ABORT_MSG);
-  ThreadInlineImpl::thread_id_key = Thread::CreateThreadLocal();
   MonitorWaitData::monitor_wait_data_key_ = Thread::CreateThreadLocal();
   MonitorData::GetMonitorWaitDataForThread();
-  ThreadId thread_id = ThreadInlineImpl::CreateThreadId();
-  Thread::SetThreadLocal(ThreadInlineImpl::thread_id_key,
-                         reinterpret_cast<DWORD>(thread_id));
 }
 
 
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index 57c0efe..564589e 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -446,7 +446,6 @@
 
 
 void PageSpace::WriteProtectCode(bool read_only) {
-  // TODO(koda): Is this flag still useful?
   if (FLAG_write_protect_code) {
     HeapPage* current_page = pages_;
     while (current_page != NULL) {
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 51cf2c1..c303585 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -5295,21 +5295,22 @@
   if (current_block_ == NULL) {
     if (!func.IsLocalFunction()) {
       // We are compiling a non-nested function.
-      outer_scope = new LocalScope(NULL, 0, 0);
+      outer_scope = new(isolate()) LocalScope(NULL, 0, 0);
     } else {
       // We are compiling the function of an invoked closure.
       // Restore the outer scope containing all captured variables.
       const ContextScope& context_scope =
-          ContextScope::Handle(func.context_scope());
+          ContextScope::Handle(isolate(), func.context_scope());
       ASSERT(!context_scope.IsNull());
-      outer_scope =
-          new LocalScope(LocalScope::RestoreOuterScope(context_scope), 0, 0);
+      outer_scope = new(isolate()) LocalScope(
+          LocalScope::RestoreOuterScope(context_scope), 0, 0);
     }
   } else {
     // We are parsing a nested function while compiling the enclosing function.
-    outer_scope = new LocalScope(current_block_->scope,
-                                 current_block_->scope->function_level() + 1,
-                                 0);
+    outer_scope =
+        new(isolate()) LocalScope(current_block_->scope,
+                                  current_block_->scope->function_level() + 1,
+                                  0);
   }
   ChainNewBlock(outer_scope);
 }
@@ -9173,6 +9174,11 @@
         // be found.
         AstNode* receiver = NULL;
         const bool kTestOnly = true;
+        if (parsing_metadata_) {
+          ErrorMsg(ident_pos,
+                   "'%s' is not a compile-time constant",
+                   ident.ToCString());
+        }
         if (!current_function().is_static() &&
             (LookupReceiver(current_block_->scope, kTestOnly) != NULL)) {
           receiver = LoadReceiver(ident_pos);
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 49df08a..1c6e2cc 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -21,8 +21,7 @@
 namespace dart {
 
 
-#if defined(USING_SIMULATOR) || defined(TARGET_OS_WINDOWS) || \
-    defined(TARGET_OS_ANDROID)
+#if defined(USING_SIMULATOR) || defined(TARGET_OS_ANDROID)
   DEFINE_FLAG(bool, profile, false, "Enable Sampling Profiler");
 #else
   DEFINE_FLAG(bool, profile, true, "Enable Sampling Profiler");
@@ -1688,7 +1687,7 @@
       // Stack pointer should not be above frame pointer.
       return 1;
     }
-    intptr_t gap = original_fp_ - original_sp_;
+    const intptr_t gap = original_fp_ - original_sp_;
     if (gap >= kMaxStep) {
       // Gap between frame pointer and stack pointer is
       // too large.
@@ -1699,8 +1698,19 @@
       // the isolates stack limit.
       lower_bound_ = original_sp_;
     }
-    // Store the PC marker for the top frame.
-    sample_->set_pc_marker(GetCurrentFramePcMarker(fp));
+#if defined(TARGET_OS_WINDOWS)
+    // If the original_fp_ is at the beginning of a page, it may be unsafe
+    // to access the pc marker, because we are reading it from a different
+    // thread on Windows. The next page may be a guard page.
+    const intptr_t kPageMask = kMaxStep - 1;
+    bool safe_to_read_pc_marker = (original_fp_ & kPageMask) != 0;
+#else
+    bool safe_to_read_pc_marker = true;
+#endif
+    if (safe_to_read_pc_marker && (gap > 0)) {
+      // Store the PC marker for the top frame.
+      sample_->set_pc_marker(GetCurrentFramePcMarker(fp));
+    }
     int i = 0;
     for (; i < FLAG_profile_depth; i++) {
       if (FLAG_profile_verify_stack_walk) {
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 0733461..a19f02b 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -329,9 +329,6 @@
   if (isolate == NULL) {
     return NULL;
   }
-  // We don't want to pause the service isolate.
-  isolate->message_handler()->set_pause_on_start(false);
-  isolate->message_handler()->set_pause_on_exit(false);
   Isolate::SetCurrent(isolate);
   {
     // Install the dart:vmservice library.
@@ -878,8 +875,9 @@
 }
 
 
+// Takes an Object* only because RetainingPath temporarily clears it.
 static bool HandleInstanceCommands(Isolate* isolate,
-                                   const Object& obj,
+                                   Object* obj,
                                    JSONStream* js,
                                    intptr_t arg_pos) {
   ASSERT(js->num_arguments() > arg_pos);
@@ -891,19 +889,19 @@
                  js->num_arguments());
       return true;
     }
-    if (obj.IsNull()) {
+    if (obj->IsNull()) {
       PrintErrorWithKind(js, "EvalCollected",
                          "attempt to evaluate against collected object\n",
                          js->num_arguments());
       return true;
     }
-    if (obj.raw() == Object::sentinel().raw()) {
+    if (obj->raw() == Object::sentinel().raw()) {
       PrintErrorWithKind(js, "EvalExpired",
                          "attempt to evaluate against expired object\n",
                          js->num_arguments());
       return true;
     }
-    if (ContainsNonInstance(obj)) {
+    if (ContainsNonInstance(*obj)) {
       PrintError(js, "attempt to evaluate against internal VM object\n");
       return true;
     }
@@ -914,8 +912,8 @@
       return true;
     }
     const String& expr_str = String::Handle(isolate, String::New(expr));
-    ASSERT(obj.IsInstance());
-    const Instance& instance = Instance::Cast(obj);
+    ASSERT(obj->IsInstance());
+    const Instance& instance = Instance::Cast(*obj);
     const Object& result =
         Object::Handle(instance.Evaluate(expr_str,
                                          Array::empty_array(),
@@ -924,10 +922,33 @@
     return true;
   } else if (strcmp(action, "retained") == 0) {
     ObjectGraph graph(isolate);
-    intptr_t retained_size = graph.SizeRetainedByInstance(obj);
+    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) {
+    intptr_t limit;
+    if (!GetIntegerId(js->LookupOption("limit"), &limit)) {
+      PrintError(js, "retaining_path expects a 'limit' option\n",
+                 js->num_arguments());
+      return true;
+    }
+    ObjectGraph graph(isolate);
+    Array& path = Array::Handle(Array::New(limit));
+    intptr_t length = graph.RetainingPath(obj, path);
+    JSONObject jsobj(js);
+    jsobj.AddProperty("type", "RetainingPath");
+    jsobj.AddProperty("id", "retaining_path");
+    jsobj.AddProperty("length", length);
+    JSONArray elements(&jsobj, "elements");
+    for (intptr_t i = 0; i < path.Length() && i < length; ++i) {
+      JSONObject jselement(&elements);
+      Object& element = Object::Handle();
+      element = path.At(i);
+      jselement.AddProperty("index", i);
+      jselement.AddProperty("value", element);
+    }
+    return true;
   }
 
   PrintError(js, "unrecognized action '%s'\n", action);
@@ -1095,7 +1116,7 @@
     type.PrintJSON(js, false);
     return true;
   }
-  return HandleInstanceCommands(isolate, type, js, 4);
+  return HandleInstanceCommands(isolate, &type, js, 4);
 }
 
 
@@ -1344,7 +1365,7 @@
     obj.PrintJSON(js, false);
     return true;
   }
-  return HandleInstanceCommands(isolate, obj, js, 2);
+  return HandleInstanceCommands(isolate, &obj, js, 2);
 }
 
 
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index ae67790..e4f8f06 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -563,6 +563,25 @@
                    "\"id\":\"objects\\/int-%" Pd "\"",
                    arr.raw()->Size() + arr.At(0)->Size());
 
+  // Retaining path to 'arr', limit 1.
+  service_msg = Eval(
+      lib,
+      "[port, ['objects', '$validId', 'retaining_path'], ['limit'], ['1']]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  ExpectSubstringF(
+      handler.msg(),
+      "{\"type\":\"RetainingPath\",\"id\":\"retaining_path\",\"length\":1,"
+      "\"elements\":[{\"index\":0,\"value\":{\"type\":\"@Array\"");
+
+  // Retaining path missing limit.
+  service_msg = Eval(
+      lib,
+      "[port, ['objects', '$validId', 'retaining_path'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  ExpectSubstringF(handler.msg(), "{\"type\":\"Error\"");
+
   // eval against list containing an internal object.
   Object& internal_object = Object::Handle();
   internal_object = LiteralToken::New();
diff --git a/runtime/vm/simulator_arm64.cc b/runtime/vm/simulator_arm64.cc
index 0085686..82b3880 100644
--- a/runtime/vm/simulator_arm64.cc
+++ b/runtime/vm/simulator_arm64.cc
@@ -2205,7 +2205,17 @@
 
   const VRegister vd = instr->VdField();
   const VRegister vn = instr->VnField();
-  if ((Q == 1)  && (op == 0) && (imm4 == 0)) {
+  const Register rn = instr->RnField();
+  const Register rd = instr->RdField();
+  if ((op == 0) && (imm4 == 7)) {
+    if (Q == 0) {
+      // Format(instr, "vmovrs 'rd, 'vn'idx5");
+      set_wregister(rd, get_vregisters(vn, idx5), R31IsZR);
+    } else {
+      // Format(instr, "vmovrd 'rd, 'vn'idx5");
+      set_register(rd, get_vregisterd(vn, idx5), R31IsZR);
+    }
+  } else if ((Q == 1)  && (op == 0) && (imm4 == 0)) {
     // Format(instr, "vdup'csz 'vd, 'vn'idx5");
     if (element_bytes == 4) {
       for (int i = 0; i < 4; i++) {
@@ -2219,6 +2229,29 @@
       UnimplementedInstruction(instr);
       return;
     }
+  } else if ((Q == 1) && (op == 0) && (imm4 == 3)) {
+    // Format(instr, "vins'csz 'vd'idx5, 'rn");
+    if (element_bytes == 4) {
+      set_vregisters(vd, idx5, get_wregister(rn, R31IsZR));
+    } else if (element_bytes == 8) {
+      set_vregisterd(vd, idx5, get_register(rn, R31IsZR));
+    } else {
+      UnimplementedInstruction(instr);
+    }
+  } else if ((Q == 1) && (op == 0) && (imm4 == 1)) {
+    // Format(instr, "vdup'csz 'vd, 'rn");
+    if (element_bytes == 4) {
+      for (int i = 0; i < 4; i++) {
+        set_vregisters(vd, i, get_wregister(rn, R31IsZR));
+      }
+    } else if (element_bytes == 8) {
+      for (int i = 0; i < 2; i++) {
+        set_vregisterd(vd, i, get_register(rn, R31IsZR));
+      }
+    } else {
+      UnimplementedInstruction(instr);
+      return;
+    }
   } else if ((Q == 1) && (op == 1)) {
     // Format(instr, "vins'csz 'vd'idx5, 'vn'idx4");
     if (element_bytes == 4) {
@@ -2250,64 +2283,159 @@
   if (instr->Bit(22) == 0) {
     // f32 case.
     for (int idx = 0; idx < 4; idx++) {
-      const float vn_val = bit_cast<float, int32_t>(get_vregisters(vn, idx));
-      const float vm_val = bit_cast<float, int32_t>(get_vregisters(vm, idx));
-      float res = 0.0;
-      if ((U == 0) && (opcode == 0x1a)) {
+      const int32_t vn_val = get_vregisters(vn, idx);
+      const int32_t vm_val = get_vregisters(vm, idx);
+      const float vn_flt = bit_cast<float, int32_t>(vn_val);
+      const float vm_flt = bit_cast<float, int32_t>(vm_val);
+      int32_t res = 0.0;
+      if ((U == 0) && (opcode == 0x3)) {
+        if (instr->Bit(23) == 0) {
+          // Format(instr, "vand 'vd, 'vn, 'vm");
+          res = vn_val & vm_val;
+        } else {
+          // Format(instr, "vorr 'vd, 'vn, 'vm");
+          res = vn_val | vm_val;
+        }
+      } else if ((U == 1) && (opcode == 0x3)) {
+        // Format(instr, "veor 'vd, 'vn, 'vm");
+        res = vn_val ^ vm_val;
+      } else if ((U == 0) && (opcode == 0x10)) {
+        // Format(instr, "vadd'vsz 'vd, 'vn, 'vm");
+        res = vn_val + vm_val;
+      } else if ((U == 1) && (opcode == 0x10)) {
+        // Format(instr, "vsub'vsz 'vd, 'vn, 'vm");
+        res = vn_val - vm_val;
+      } else if ((U == 0) && (opcode == 0x1a)) {
         if (instr->Bit(23) == 0) {
           // Format(instr, "vadd'vsz 'vd, 'vn, 'vm");
-          res = vn_val + vm_val;
+          res = bit_cast<int32_t, float>(vn_flt + vm_flt);
         } else {
           // Format(instr, "vsub'vsz 'vd, 'vn, 'vm");
-          res = vn_val - vm_val;
+          res = bit_cast<int32_t, float>(vn_flt - vm_flt);
         }
       } else if ((U == 1) && (opcode == 0x1b)) {
         // Format(instr, "vmul'vsz 'vd, 'vn, 'vm");
-        res = vn_val * vm_val;
+        res = bit_cast<int32_t, float>(vn_flt * vm_flt);
       } else if ((U == 1) && (opcode == 0x1f)) {
         // Format(instr, "vdiv'vsz 'vd, 'vn, 'vm");
-        res = vn_val / vm_val;
+        res = bit_cast<int32_t, float>(vn_flt / vm_flt);
       } else {
         UnimplementedInstruction(instr);
         return;
       }
-      set_vregisters(vd, idx, bit_cast<int32_t, float>(res));
+      set_vregisters(vd, idx, res);
     }
   } else {
     // f64 case.
     for (int idx = 0; idx < 2; idx++) {
-      const double vn_val = bit_cast<double, int64_t>(get_vregisterd(vn, idx));
-      const double vm_val = bit_cast<double, int64_t>(get_vregisterd(vm, idx));
-      double res = 0.0;
-      if ((U == 0) && (opcode == 0x1a)) {
+      const int64_t vn_val = get_vregisterd(vn, idx);
+      const int64_t vm_val = get_vregisterd(vm, idx);
+      const double vn_dbl = bit_cast<double, int64_t>(vn_val);
+      const double vm_dbl = bit_cast<double, int64_t>(vm_val);
+      int64_t res = 0.0;
+      if ((U == 0) && (opcode == 0x3)) {
+        if (instr->Bit(23) == 0) {
+          // Format(instr, "vand 'vd, 'vn, 'vm");
+          res = vn_val & vm_val;
+        } else {
+          // Format(instr, "vorr 'vd, 'vn, 'vm");
+          res = vn_val | vm_val;
+        }
+      } else if ((U == 1) && (opcode == 0x3)) {
+        // Format(instr, "veor 'vd, 'vn, 'vm");
+        res = vn_val ^ vm_val;
+      } else if ((U == 0) && (opcode == 0x10)) {
+        // Format(instr, "vadd'vsz 'vd, 'vn, 'vm");
+        res = vn_val + vm_val;
+      } else if ((U == 1) && (opcode == 0x10)) {
+        // Format(instr, "vsub'vsz 'vd, 'vn, 'vm");
+        res = vn_val - vm_val;
+      } else if ((U == 0) && (opcode == 0x1a)) {
         if (instr->Bit(23) == 0) {
           // Format(instr, "vadd'vsz 'vd, 'vn, 'vm");
-          res = vn_val + vm_val;
+          res = bit_cast<int64_t, double>(vn_dbl + vm_dbl);
         } else {
           // Format(instr, "vsub'vsz 'vd, 'vn, 'vm");
-          res = vn_val - vm_val;
+          res = bit_cast<int64_t, double>(vn_dbl - vm_dbl);
         }
       } else if ((U == 1) && (opcode == 0x1b)) {
         // Format(instr, "vmul'vsz 'vd, 'vn, 'vm");
-        res = vn_val * vm_val;
+        res = bit_cast<int64_t, double>(vn_dbl * vm_dbl);
       } else if ((U == 1) && (opcode == 0x1f)) {
         // Format(instr, "vdiv'vsz 'vd, 'vn, 'vm");
-        res = vn_val / vm_val;
+        res = bit_cast<int64_t, double>(vn_dbl / vm_dbl);
       } else {
         UnimplementedInstruction(instr);
         return;
       }
-      set_vregisterd(vd, idx, bit_cast<int64_t, double>(res));
+      set_vregisterd(vd, idx, res);
     }
   }
 }
 
 
+void Simulator::DecodeSIMDTwoReg(Instr* instr) {
+  const int32_t Q = instr->Bit(30);
+  const int32_t U = instr->Bit(29);
+  const int32_t op = instr->Bits(12, 5);
+  const int32_t sz = instr->Bits(22, 2);
+  const VRegister vd = instr->VdField();
+  const VRegister vn = instr->VnField();
+
+  if ((Q == 1) && (U == 1) && (op == 5)) {
+    // Format(instr, "vnot 'vd, 'vn");
+    for (int i = 0; i < 2; i++) {
+      set_vregisterd(vd, i, ~get_vregisterd(vn, i));
+    }
+  } else if ((U == 0) && (op == 0xf)) {
+    if (sz == 2) {
+      // Format(instr, "vabss 'vd, 'vn");
+      for (int i = 0; i < 4; i++) {
+        const int32_t vn_val = get_vregisters(vn, i);
+        const float vn_flt = bit_cast<float, int32_t>(vn_val);
+        set_vregisters(vd, i, bit_cast<int32_t, float>(fabsf(vn_flt)));
+      }
+    } else if (sz == 3) {
+      // Format(instr, "vabsd 'vd, 'vn");
+      for (int i = 0; i < 2; i++) {
+        const int64_t vn_val = get_vregisterd(vn, i);
+        const double vn_dbl = bit_cast<double, int64_t>(vn_val);
+        set_vregisterd(vd, i, bit_cast<int64_t, double>(fabs(vn_dbl)));
+      }
+    } else {
+      UnimplementedInstruction(instr);
+    }
+  } else if ((U == 1) && (op == 0xf)) {
+    if (sz == 2) {
+      // Format(instr, "vnegs 'vd, 'vn");
+      for (int i = 0; i < 4; i++) {
+        const int32_t vn_val = get_vregisters(vn, i);
+        const float vn_flt = bit_cast<float, int32_t>(vn_val);
+        set_vregisters(vd, i, bit_cast<int32_t, float>(-vn_flt));
+      }
+    } else if (sz == 3) {
+      // Format(instr, "vnegd 'vd, 'vn");
+      for (int i = 0; i < 2; i++) {
+        const int64_t vn_val = get_vregisterd(vn, i);
+        const double vn_dbl = bit_cast<double, int64_t>(vn_val);
+        set_vregisterd(vd, i, bit_cast<int64_t, double>(-vn_dbl));
+      }
+    } else {
+      UnimplementedInstruction(instr);
+    }
+  } else {
+    UnimplementedInstruction(instr);
+  }
+}
+
+
 void Simulator::DecodeDPSimd1(Instr* instr) {
   if (instr->IsSIMDCopyOp()) {
     DecodeSIMDCopy(instr);
   } else if (instr->IsSIMDThreeSameOp()) {
     DecodeSIMDThreeSame(instr);
+  } else if (instr->IsSIMDTwoRegOp()) {
+    DecodeSIMDTwoReg(instr);
   } else {
     UnimplementedInstruction(instr);
   }
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 20ed17d..1edcd2b 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -27,6 +27,7 @@
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
+DECLARE_FLAG(bool, enable_debugger);
 
 // Input parameters:
 //   LR : return address.
@@ -1268,18 +1269,20 @@
   }
 #endif  // DEBUG
 
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+  }
 
   // Load arguments descriptor into R4.
   __ ldr(R4, FieldAddress(R5, ICData::arguments_descriptor_offset()));
@@ -1483,18 +1486,20 @@
   }
 #endif  // DEBUG
 
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+  }
 
   // R5: IC data object (preserved).
   __ ldr(R6, FieldAddress(R5, ICData::ic_data_offset()));
@@ -1572,16 +1577,18 @@
 // Called only from unoptimized code. All relevant registers have been saved.
 void StubCode::GenerateDebugStepCheckStub(
     Assembler* assembler) {
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+  }
   __ Ret();
 }
 
@@ -1821,16 +1828,18 @@
 // Return Zero condition flag set if equal.
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+  }
 
   const Register temp = R2;
   const Register left = R1;
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 9670eee..6a793ac 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -26,6 +26,8 @@
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
+DECLARE_FLAG(bool, enable_debugger);
+
 // Input parameters:
 //   LR : return address.
 //   SP : address of last argument in argument array.
@@ -1310,19 +1312,21 @@
   }
 #endif  // DEBUG
 
-  // Check single stepping.
-  Label not_stepping;
-  __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset(), kNoPP);
-  __ LoadFromOffset(
-      R6, R6, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
-  __ CompareRegisters(R6, ZR);
-  __ b(&not_stepping, EQ);
-  __ EnterStubFrame();
-  __ Push(R5);  // Preserve IC data.
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-  __ Pop(R5);
-  __ LeaveStubFrame();
-  __ Bind(&not_stepping);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_stepping;
+    __ LoadFieldFromOffset(R6, CTX, Context::isolate_offset(), kNoPP);
+    __ LoadFromOffset(
+        R6, R6, Isolate::single_step_offset(), kNoPP, kUnsignedByte);
+    __ CompareRegisters(R6, ZR);
+    __ b(&not_stepping, EQ);
+    __ EnterStubFrame();
+    __ Push(R5);  // Preserve IC data.
+    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+    __ Pop(R5);
+    __ LeaveStubFrame();
+    __ Bind(&not_stepping);
+  }
 
   // Load arguments descriptor into R4.
   __ LoadFieldFromOffset(R4, R5, ICData::arguments_descriptor_offset(), kNoPP);
@@ -1559,19 +1563,21 @@
   }
 #endif  // DEBUG
 
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+  }
 
   // R5: IC data object (preserved).
   __ LoadFieldFromOffset(R6, R5, ICData::ic_data_offset(), kNoPP);
@@ -1655,17 +1661,19 @@
 // Called only from unoptimized code. All relevant registers have been saved.
 void StubCode::GenerateDebugStepCheckStub(
     Assembler* assembler) {
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+  }
   __ ret();
 }
 
@@ -1881,17 +1889,19 @@
 // Return Zero condition flag set if equal.
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+  }
 
   const Register left = R1;
   const Register right = R0;
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index 28b67ac..e33bded 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -29,6 +29,7 @@
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 DEFINE_FLAG(bool, verify_incoming_contexts, false, "");
 
+DECLARE_FLAG(bool, enable_debugger);
 
 // Input parameters:
 //   ESP : points to return address.
@@ -1301,19 +1302,21 @@
   }
 #endif  // DEBUG
 
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+    __ EnterStubFrame();
+    __ pushl(ECX);
+    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+    __ popl(ECX);
+    __ LeaveFrame();
+    __ Bind(&not_stepping);
+  }
 
   // ECX: IC data object (preserved).
   // Load arguments descriptor into EDX.
@@ -1526,19 +1529,21 @@
     __ Bind(&ok);
   }
 #endif  // DEBUG
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+    __ EnterStubFrame();
+    __ pushl(ECX);
+    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+    __ popl(ECX);
+    __ LeaveFrame();
+    __ Bind(&not_stepping);
+  }
 
   // ECX: IC data object (preserved).
   __ movl(EBX, FieldAddress(ECX, ICData::ic_data_offset()));
@@ -1620,17 +1625,19 @@
 
 // Called only from unoptimized code.
 void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+    __ EnterStubFrame();
+    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+    __ LeaveFrame();
+    __ Bind(&not_stepping);
+  }
   __ ret();
 }
 
@@ -1873,17 +1880,19 @@
 // Returns ZF set.
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+    __ EnterStubFrame();
+    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+    __ LeaveFrame();
+    __ Bind(&not_stepping);
+  }
 
   const Register left = EAX;
   const Register right = EDX;
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index ea9c76c..d319d2b 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -26,6 +26,7 @@
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
+DECLARE_FLAG(bool, enable_debugger);
 
 // Input parameters:
 //   RA : return address.
@@ -1424,22 +1425,24 @@
 #endif  // DEBUG
 
 
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+  }
 
   // Load argument descriptor into S4.
   __ lw(S4, FieldAddress(S5, ICData::arguments_descriptor_offset()));
@@ -1671,23 +1674,24 @@
   }
 #endif  // DEBUG
 
-  // Check single stepping.
-  Label not_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);
-
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+  }
 
   // S5: IC data object (preserved).
   __ lw(T0, FieldAddress(S5, ICData::ic_data_offset()));
@@ -1777,20 +1781,22 @@
 // Called only from unoptimized code. All relevant registers have been saved.
 // RA: return address.
 void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+  }
   __ Ret();
 }
 
@@ -2053,20 +2059,22 @@
 // Returns: CMPRES1 is zero if equal, non-zero otherwise.
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+  }
 
   const Register temp1 = T2;
   const Register temp2 = T3;
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index d6324d2..69d0562 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -27,6 +27,7 @@
     "Set to true for debugging & verifying the slow paths.");
 DECLARE_FLAG(bool, trace_optimized_ic_calls);
 
+DECLARE_FLAG(bool, enable_debugger);
 
 // Input parameters:
 //   RSP : points to return address.
@@ -1230,18 +1231,20 @@
   }
 #endif  // DEBUG
 
-  // Check single stepping.
-  Label not_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);
-  __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
-  __ popq(RBX);
-  __ LeaveStubFrame();
-  __ Bind(&not_stepping);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+    __ popq(RBX);
+    __ LeaveStubFrame();
+    __ Bind(&not_stepping);
+  }
 
   // Load arguments descriptor into R10.
   __ movq(R10, FieldAddress(RBX, ICData::arguments_descriptor_offset()));
@@ -1449,18 +1452,20 @@
   }
 #endif  // DEBUG
 
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+  }
 
   // RBX: IC data object (preserved).
   __ movq(R12, FieldAddress(RBX, ICData::ic_data_offset()));
@@ -1542,17 +1547,19 @@
 
 // Called only from unoptimized code.
 void StubCode::GenerateDebugStepCheckStub(Assembler* assembler) {
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+    __ EnterStubFrame();
+    __ CallRuntime(kSingleStepHandlerRuntimeEntry, 0);
+    __ LeaveStubFrame();
+    __ Bind(&not_stepping);
+  }
   __ ret();
 }
 
@@ -1787,16 +1794,18 @@
 // Returns ZF set.
 void StubCode::GenerateUnoptimizedIdenticalWithNumberCheckStub(
     Assembler* assembler) {
-  // Check single stepping.
-  Label not_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);
+  if (FLAG_enable_debugger) {
+    // Check single stepping.
+    Label not_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);
+  }
 
   const Register left = RAX;
   const Register right = RDX;
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index a7eb3f0..ddfc19c 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -292,6 +292,7 @@
   V(DartTypedData, "dart:typed_data")                                          \
   V(DartVMService, "dart:vmservice")                                           \
   V(DartProfiler, "dart:profiler")                                             \
+  V(DartIOLibName, "dart.io")                                                  \
   V(_Random, "_Random")                                                        \
   V(_state, "_state")                                                          \
   V(_A, "_A")                                                                  \
diff --git a/runtime/vm/thread_interrupter.cc b/runtime/vm/thread_interrupter.cc
index c15e052..632688a 100644
--- a/runtime/vm/thread_interrupter.cc
+++ b/runtime/vm/thread_interrupter.cc
@@ -86,25 +86,28 @@
 
 
 void ThreadInterrupter::Shutdown() {
-  if (shutdown_) {
-    // Already shutdown.
-    return;
-  }
-  ASSERT(initialized_);
-  if (FLAG_trace_thread_interrupter) {
-    OS::Print("ThreadInterrupter shutting down.\n");
-  }
-  {
-    MonitorLocker ml(monitor_);
-    shutdown_ = true;
-  }
   {
     MonitorLocker shutdown_ml(monitor_);
+    if (shutdown_) {
+      // Already shutdown.
+      return;
+    }
+    shutdown_ = true;
+    ASSERT(initialized_);
+    if (FLAG_trace_thread_interrupter) {
+      OS::Print("ThreadInterrupter shutting down.\n");
+    }
     while (thread_running_) {
       shutdown_ml.Wait();
     }
+    // Join in the interrupter thread. On Windows, a thread's exit-code can
+    // leak into the process's exit-code, if exiting 'at same time' as the
+    // process ends.
+    if (interrupter_thread_id_ != Thread::kInvalidThreadId) {
+      Thread::Join(interrupter_thread_id_);
+      interrupter_thread_id_ = Thread::kInvalidThreadId;
+    }
   }
-  interrupter_thread_id_ = Thread::kInvalidThreadId;
   if (FLAG_trace_thread_interrupter) {
     OS::Print("ThreadInterrupter shut down.\n");
   }
@@ -234,8 +237,8 @@
   {
     // Signal to main thread we are ready.
     MonitorLocker startup_ml(monitor_);
-    thread_running_ = true;
     interrupter_thread_id_ = Thread::GetCurrentThreadId();
+    thread_running_ = true;
     startup_ml.Notify();
   }
   {
diff --git a/runtime/vm/thread_interrupter_win.cc b/runtime/vm/thread_interrupter_win.cc
index 4058da3..b39c188 100644
--- a/runtime/vm/thread_interrupter_win.cc
+++ b/runtime/vm/thread_interrupter_win.cc
@@ -16,11 +16,11 @@
 
 class ThreadInterrupterWin : public AllStatic {
  public:
-  static bool GrabRegisters(ThreadId thread, InterruptedThreadState* state) {
+  static bool GrabRegisters(HANDLE handle, InterruptedThreadState* state) {
     CONTEXT context;
     memset(&context, 0, sizeof(context));
-    context.ContextFlags = CONTEXT_FULL;
-    if (GetThreadContext(thread, &context) != 0) {
+    context.ContextFlags = CONTEXT_CONTROL;
+    if (GetThreadContext(handle, &context) != 0) {
 #if defined(TARGET_ARCH_IA32)
       state->pc = static_cast<uintptr_t>(context.Eip);
       state->fp = static_cast<uintptr_t>(context.Ebp);
@@ -39,33 +39,43 @@
 
 
   static void Interrupt(InterruptableThreadState* state) {
-    ASSERT(GetCurrentThread() != state->id);
-    DWORD result = SuspendThread(state->id);
+    ASSERT(!Thread::Compare(GetCurrentThreadId(), state->id));
+    HANDLE handle = OpenThread(THREAD_GET_CONTEXT |
+                               THREAD_QUERY_INFORMATION |
+                               THREAD_SUSPEND_RESUME,
+                               false,
+                               state->id);
+    ASSERT(handle != NULL);
+    DWORD result = SuspendThread(handle);
     if (result == kThreadError) {
       if (FLAG_trace_thread_interrupter) {
         OS::Print("ThreadInterrupted failed to suspend thread %p\n",
                   reinterpret_cast<void*>(state->id));
       }
+      CloseHandle(handle);
       return;
     }
     InterruptedThreadState its;
     its.tid = state->id;
-    if (!GrabRegisters(state->id, &its)) {
+    if (!GrabRegisters(handle, &its)) {
       // Failed to get thread registers.
-      ResumeThread(state->id);
+      ResumeThread(handle);
       if (FLAG_trace_thread_interrupter) {
         OS::Print("ThreadInterrupted failed to get registers for %p\n",
                   reinterpret_cast<void*>(state->id));
       }
+      CloseHandle(handle);
       return;
     }
     if (state->callback == NULL) {
       // No callback registered.
-      ResumeThread(state->id);
+      ResumeThread(handle);
+      CloseHandle(handle);
       return;
     }
     state->callback(its, state->data);
-    ResumeThread(state->id);
+    ResumeThread(handle);
+    CloseHandle(handle);
   }
 };
 
diff --git a/sdk/bin/dartanalyzer_developer b/sdk/bin/dartanalyzer_developer
index dcafe0c..db1b42d 100755
--- a/sdk/bin/dartanalyzer_developer
+++ b/sdk/bin/dartanalyzer_developer
@@ -65,4 +65,4 @@
   fi
 fi
 
-exec java $EXTRA_JVMARGS -jar $JAR_FILE --dart-sdk "$SDK_DIR" "$@"
+exec java $EXTRA_JVMARGS -jar "$JAR_FILE" --dart-sdk "$SDK_DIR" "$@"
diff --git a/sdk/bin/dartanalyzer_developer.bat b/sdk/bin/dartanalyzer_developer.bat
index 6ba62e0..fcea2aa 100644
--- a/sdk/bin/dartanalyzer_developer.bat
+++ b/sdk/bin/dartanalyzer_developer.bat
@@ -24,4 +24,4 @@
 
 set "JAR_FILE=%JAR_DIR%\dartanalyzer.jar"
 
-java -jar %JAR_FILE% --dart-sdk %SDK_DIR% %arguments%
+java -jar "%JAR_FILE%" --dart-sdk "%SDK_DIR%" %arguments%
diff --git a/sdk/lib/_internal/compiler/implementation/constants.dart b/sdk/lib/_internal/compiler/implementation/constants.dart
index 8fe7212..2aea6ff 100644
--- a/sdk/lib/_internal/compiler/implementation/constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/constants.dart
@@ -5,6 +5,8 @@
 part of dart2js;
 
 abstract class ConstantVisitor<R> {
+  const ConstantVisitor();
+
   R visitFunction(FunctionConstant constant);
   R visitNull(NullConstant constant);
   R visitInt(IntConstant constant);
diff --git a/sdk/lib/_internal/compiler/implementation/dart2js.dart b/sdk/lib/_internal/compiler/implementation/dart2js.dart
index f62b083..38e5db2 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2js.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2js.dart
@@ -7,7 +7,8 @@
 import 'dart:async'
     show Future, EventSink;
 import 'dart:io'
-    show exit, File, FileMode, Platform, RandomAccessFile, FileSystemException;
+    show exit, File, FileMode, Platform, RandomAccessFile, FileSystemException,
+         stdin, stderr;
 import 'dart:math' as math;
 
 import '../compiler.dart' as api;
@@ -16,6 +17,7 @@
 import 'filenames.dart';
 import 'util/uri_extras.dart';
 import 'util/util.dart' show stackTraceFilePrefix;
+import 'util/command_line.dart';
 import '../../libraries.dart';
 
 const String LIBRARY_ROOT = '../../../../..';
@@ -640,6 +642,12 @@
 }
 
 void main(List<String> arguments) {
+  // Since the sdk/bin/dart2js script adds its own arguments in front of
+  // user-supplied arguments we search for '--batch' at the end of the list.
+  if (arguments.length > 0 && arguments.last == "--batch") {
+    batchMain(arguments.sublist(0, arguments.length - 1));
+    return;
+  }
   internalMain(arguments);
 }
 
@@ -670,3 +678,43 @@
     return new Future.value();
   }
 }
+
+void batchMain(List<String> batchArguments) {
+  int exitCode;
+
+  exitFunc = (errorCode) {
+    // Crash shadows any other error code.
+    if (exitCode == 253) return;
+    exitCode = errorCode;
+  };
+
+  runJob() {
+    new Future.sync(() {
+      exitCode = 0;
+      String line = stdin.readLineSync();
+      if (line == null) exit(0);
+      List<String> args = <String>[];
+      args.addAll(batchArguments);
+      args.addAll(splitLine(line));
+      return internalMain(args);
+    })
+    .catchError((exception, trace) {
+      exitCode = 253;
+    })
+    .whenComplete(() {
+      // The testing framework waits for a status line on stdout and stderr
+      // before moving to the next test.
+      if (exitCode == 0){
+        print(">>> TEST OK");
+      } else if (exitCode == 253) {
+        print(">>> TEST CRASH");
+      } else {
+        print(">>> TEST FAIL");
+      }
+      stderr.writeln(">>> EOF STDERR");
+      runJob();
+    });
+  }
+
+  runJob();
+}
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
index bd243e5..2026ca8 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
@@ -190,18 +190,34 @@
     Expression condition = new Literal(new dart2js.BoolConstant(true));
     List<Statement> savedBuffer = statementBuffer;
     statementBuffer = <Statement>[];
+    tree.Statement savedFallthrough = fallthrough;
+    fallthrough = stmt.body;
     visitStatement(stmt.body);
     savedBuffer.add(
         new LabeledStatement(
             stmt.label.name,
             new While(condition, new Block(statementBuffer))));
     statementBuffer = savedBuffer;
+    fallthrough = savedFallthrough;
   }
 
   Expression visitConstant(tree.Constant exp) {
     return emitConstant(exp.value);
   }
 
+  Expression visitLiteralList(tree.LiteralList exp) {
+    return new LiteralList(
+        exp.values.map(visitExpression).toList(growable: false));
+  }
+
+  Expression visitLiteralMap(tree.LiteralMap exp) {
+    List<LiteralMapEntry> entries = new List<LiteralMapEntry>.generate(
+        exp.values.length,
+        (i) => new LiteralMapEntry(visitExpression(exp.keys[i]),
+                                   visitExpression(exp.values[i])));
+    return new LiteralMap(entries);
+  }
+
   List<Argument> emitArguments(tree.Invoke exp) {
     List<tree.Expression> args = exp.arguments;
     int positionalArgumentCount = exp.selector.positionalArgumentCount;
@@ -225,6 +241,9 @@
     List<Argument> args = emitArguments(exp);
     switch (exp.selector.kind) {
       case SelectorKind.CALL:
+        if (exp.selector.name == "call") {
+          return new CallFunction(receiver, args);
+        }
         return new CallMethod(receiver, exp.selector.name, args);
 
       case SelectorKind.OPERATOR:
@@ -325,7 +344,9 @@
     if (constant is dart2js.PrimitiveConstant) {
       return new Literal(constant);
     } else if (constant is dart2js.ListConstant) {
-      return new LiteralList(constant.entries.map(emitConstant), isConst: true);
+      return new LiteralList(
+          constant.entries.map(emitConstant).toList(growable: false),
+          isConst: true);
     } else if (constant is dart2js.MapConstant) {
       List<LiteralMapEntry> entries = <LiteralMapEntry>[];
       for (var i = 0; i < constant.keys.length; i++) {
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
index 4d93221..51eec0e 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
@@ -178,6 +178,23 @@
   accept(Visitor visitor) => visitor.visitConstant(this);
 }
 
+class LiteralList extends Expression {
+  final List<Expression> values;
+
+  LiteralList(this.values) ;
+
+  accept(Visitor visitor) => visitor.visitLiteralList(this);
+}
+
+class LiteralMap extends Expression {
+  final List<Expression> keys;
+  final List<Expression> values;
+
+  LiteralMap(this.keys, this.values) ;
+
+  accept(Visitor visitor) => visitor.visitLiteralMap(this);
+}
+
 /// A conditional expression.
 class Conditional extends Expression {
   Expression condition;
@@ -364,6 +381,8 @@
   E visitConditional(Conditional node);
   E visitLogicalOperator(LogicalOperator node);
   E visitNot(Not node);
+  E visitLiteralList(LiteralList node);
+  E visitLiteralMap(LiteralMap node);
 
   S visitStatement(Statement s) => s.accept(this);
   S visitLabeledStatement(LabeledStatement node);
@@ -631,6 +650,16 @@
     return new Constant(node.value);
   }
 
+  Expression visitLiteralList(ir.LiteralList node) {
+    return new LiteralList(translateArguments(node.values));
+  }
+
+  Expression visitLiteralMap(ir.LiteralMap node) {
+    return new LiteralMap(
+        translateArguments(node.keys),
+        translateArguments(node.values));
+  }
+
   Expression visitParameter(ir.Parameter node) {
     // Continuation parameters are not visited (continuations themselves are
     // not visited yet).
@@ -951,6 +980,23 @@
     return node;
   }
 
+  Expression visitLiteralList(LiteralList node) {
+    // Process values right-to-left, the opposite of evaluation order.
+    for (int i = node.values.length - 1; i >= 0; --i) {
+      node.values[i] = visitExpression(node.values[i]);
+    }
+    return node;
+  }
+
+  Expression visitLiteralMap(LiteralMap node) {
+    // Process arguments right-to-left, the opposite of evaluation order.
+    for (int i = node.values.length - 1; i >= 0; --i) {
+      node.values[i] = visitExpression(node.values[i]);
+      node.keys[i] = visitExpression(node.keys[i]);
+    }
+    return node;
+  }
+
   Statement visitExpressionStatement(ExpressionStatement node) {
     node.expression = visitExpression(node.expression);
     // Do not allow propagation of assignments past an expression evaluated
@@ -1280,31 +1326,34 @@
   }
 
   Expression visitInvokeStatic(InvokeStatic node) {
-    for (int i = 0; i < node.arguments.length; i++) {
-      node.arguments[i] = visitExpression(node.arguments[i]);
-    }
+    _rewriteList(node.arguments);
     return node;
   }
 
   Expression visitInvokeMethod(InvokeMethod node) {
     node.receiver = visitExpression(node.receiver);
-    for (int i = 0; i < node.arguments.length; i++) {
-      node.arguments[i] = visitExpression(node.arguments[i]);
-    }
+    _rewriteList(node.arguments);
     return node;
   }
 
   Expression visitInvokeConstructor(InvokeConstructor node) {
-    for (int i = 0; i < node.arguments.length; i++) {
-      node.arguments[i] = visitExpression(node.arguments[i]);
-    }
+    _rewriteList(node.arguments);
     return node;
   }
 
   Expression visitConcatenateStrings(ConcatenateStrings node) {
-    for (int i = 0; i < node.arguments.length; i++) {
-      node.arguments[i] = visitExpression(node.arguments[i]);
-    }
+    _rewriteList(node.arguments);
+    return node;
+  }
+
+  Expression visitLiteralList(LiteralList node) {
+    _rewriteList(node.values);
+    return node;
+  }
+
+  Expression visitLiteralMap(LiteralMap node) {
+    _rewriteList(node.keys);
+    _rewriteList(node.values);
     return node;
   }
 
@@ -1522,4 +1571,10 @@
     }
   }
 
+  /// Destructively updates each entry of [l] with the result of visiting it.
+  void _rewriteList(List<Expression> l) {
+    for (int i = 0; i < l.length; i++) {
+      l[i] = visitExpression(l[i]);
+    }
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
index 4e57587..b4069ec 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
@@ -285,8 +285,10 @@
       precedence = CALLEE;
       tree.Node selector;
       Expression callee = exp.callee;
+      elements.Element element;
       if (callee is Identifier) {
         selector = makeIdentifier(callee.name);
+        element = callee.element;
       } else {
         selector = makeExp(callee, CALLEE, beginStmt: beginStmt);
       }
@@ -294,6 +296,9 @@
           null,
           selector,
           argList(exp.arguments.map(makeArgument)));
+      if (callee is Identifier) {
+        setElement(result, element, exp);
+      }
     } else if (exp is CallMethod) {
       precedence = CALLEE;
       result = new tree.Send(
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
index fbeea76..79b3a84 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
@@ -51,6 +51,8 @@
   visitInvokeMethod(InvokeMethod node) {}
   visitInvokeConstructor(InvokeConstructor node) {}
   visitConcatenateStrings(ConcatenateStrings node) {}
+  visitLiteralList(LiteralList node) {}
+  visitLiteralMap(LiteralMap node) {}
   visitConstant(Constant node) {}
   visitConditional(Conditional node) {}
   visitLogicalOperator(LogicalOperator node) {}
@@ -199,6 +201,14 @@
     printStatement(null, expr(node));
   }
 
+  visitLiteralList(LiteralList node) {
+    printStatement(null, expr(node));
+  }
+
+  visitLiteralMap(LiteralMap node) {
+    printStatement(null, expr(node));
+  }
+
   visitConditional(Conditional node) {
     printStatement(null, expr(node));
   }
@@ -296,6 +306,21 @@
     return "concat [$args]";
   }
 
+  String visitLiteralList(LiteralList node) {
+    String values = node.values.map(visitExpression).join(', ');
+    return "list [$values]";
+  }
+
+  String visitLiteralMap(LiteralMap node) {
+    List<String> entries = new List<String>();
+    for (int i = 0; i < node.values.length; ++i) {
+      String key = visitExpression(node.keys[i]);
+      String value = visitExpression(node.values[i]);
+      entries.add("$key: $value");
+    }
+    return "map [${entries.join(', ')}]";
+  }
+
   String visitConstant(Constant node) {
     return "${node.value}";
   }
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index ba055a7..0fb0c59 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -81,7 +81,11 @@
         ? compiler.outputUri.path
         : "out";
     String outName = outPath.substring(outPath.lastIndexOf('/') + 1);
-    return "${outName}_$name";
+    if (this == compiler.deferredLoadTask.mainOutputUnit) {
+      return outName;
+    } else {
+      return "${outName}_$name";
+    }
   }
 
   String toString() => "OutputUnit($name)";
diff --git a/sdk/lib/_internal/compiler/implementation/dump_info.dart b/sdk/lib/_internal/compiler/implementation/dump_info.dart
index 84dbb51..f5c8f26 100644
--- a/sdk/lib/_internal/compiler/implementation/dump_info.dart
+++ b/sdk/lib/_internal/compiler/implementation/dump_info.dart
@@ -4,9 +4,10 @@
 
 library dump_info;
 
+import 'dart:convert' show HtmlEscape;
+
 import 'elements/elements.dart';
 import 'elements/visitor.dart';
-import 'dart:convert' show HtmlEscape;
 import 'dart2jslib.dart' show
     Compiler,
     CompilerTask,
@@ -14,6 +15,9 @@
 import 'dart_types.dart' show DartType;
 import 'types/types.dart' show TypeMask;
 import 'util/util.dart' show modifiersToString;
+import 'deferred_load.dart' show OutputUnit;
+import 'js_backend/js_backend.dart' show JavaScriptBackend;
+import 'js/js.dart' as jsAst;
 
 // TODO (sigurdm): A search function.
 // TODO (sigurdm): Output size of classes.
@@ -24,6 +28,21 @@
 // TODO (sigurdm): Write how much space the boilerplate takes.
 // TODO (sigurdm): Include javascript names of entities in the output.
 
+const List<String> COLORS = const [
+    "#fff",
+    "#8dd3c7",
+    "#ffffb3",
+    "#bebada",
+    "#fb8072",
+    "#80b1d3",
+    "#fdb462",
+    "#b3de69",
+    "#fccde5",
+    "#d9d9d9",
+    "#bc80bd",
+    "#ccebc5",
+    "#ffed6f"];
+
 class CodeSizeCounter {
   final Map<Element, int> generatedSize = new Map<Element, int>();
 
@@ -98,13 +117,18 @@
   /// [Element], and its members.
   List<InfoNode> contents;
 
+  /// Subnodes containing more detailed information about the represented
+  /// [Element], and its members.
+  int outputUnitId;
+
   ElementInfoNode({this.name: "",
       this.kind: "",
       this.type,
       this.modifiers: "",
       this.size,
       this.contents,
-      this.extra: ""});
+      this.extra: "",
+      this.outputUnitId});
 
   void emitHtml(ProgramInfo programInfo, StringSink buffer,
       [String indentation = '']) {
@@ -125,8 +149,11 @@
         extraString].join(' ');
 
     if (contents != null) {
+      String outputUnitClass = outputUnitId == null
+          ? ""
+          : " outputUnit${outputUnitId % COLORS.length}";
       buffer.write(indentation);
-      buffer.write('<div class="container">\n');
+      buffer.write('<div class="container$outputUnitClass">\n');
       buffer.write('$indentation  ');
       buffer.write(div('+$describe', cls: "details"));
       buffer.write('\n');
@@ -218,23 +245,62 @@
   /// The version of dart2js used to compile the program.
   final String dart2jsVersion;
 
+  final Map<OutputUnit, int> outputUnitNumbering;
+
   ProgramInfo({this.libraries,
                this.size,
                this.compilationMoment,
                this.compilationDuration,
-               this.dart2jsVersion});
+               this.dart2jsVersion,
+               this.outputUnitNumbering: null});
 }
 
 class InfoDumpVisitor extends ElementVisitor<InfoNode> {
   final Compiler compiler;
 
   /// Contains the elements visited on the path from the library to here.
-  List<Element> stack = new List<Element>();
+  final List<Element> stack = new List<Element>();
+
+  final Map<OutputUnit, int> outputUnitNumbering = new Map<OutputUnit, int>();
 
   Element get currentElement => stack.last;
 
   InfoDumpVisitor(Compiler this.compiler);
 
+  ProgramInfo collectDumpInfo() {
+    JavaScriptBackend backend = compiler.backend;
+
+    int counter = 0;
+    for (OutputUnit outputUnit in compiler.deferredLoadTask.allOutputUnits) {
+      outputUnitNumbering[outputUnit] = counter;
+      counter += 1;
+    }
+
+    List<LibraryElement> sortedLibraries = compiler.libraries.values.toList();
+    sortedLibraries.sort((LibraryElement l1, LibraryElement l2) {
+      if (l1.isPlatformLibrary && !l2.isPlatformLibrary) {
+        return 1;
+      } else if (!l1.isPlatformLibrary && l2.isPlatformLibrary) {
+        return -1;
+      }
+      return l1.getLibraryName().compareTo(l2.getLibraryName());
+    });
+
+    List<InfoNode> libraryInfos = new List<InfoNode>();
+    libraryInfos.addAll(sortedLibraries
+        .map((library) => visit(library))
+        .where((info) => info != null));
+
+    return new ProgramInfo(
+        compilationDuration: compiler.totalCompileTime.elapsed,
+        // TODO (sigurdm): Also count the size of deferred code
+        size: compiler.assembledCode.length,
+        libraries: libraryInfos,
+        compilationMoment: new DateTime.now(),
+        dart2jsVersion: compiler.hasBuildId ? compiler.buildId : null,
+        outputUnitNumbering: outputUnitNumbering);
+  }
+
   InfoNode visitElement(Element element) {
     compiler.internalError(element,
         "This element of kind ${element.kind} "
@@ -285,15 +351,16 @@
   }
 
   InfoNode visitFieldElement(FieldElement element) {
-    CodeBuffer emittedCode = compiler.backend.codeOf(element);
+    CodeBuffer emittedCode = compiler.dumpInfoTask.codeOf(element);
     TypeMask inferredType = compiler.typesTask
         .getGuaranteedTypeOfElement(element);
     // If a field has an empty inferred type it is never used.
-    if ((inferredType == null || inferredType.isEmpty) && emittedCode == null) {
+    // Also constant fields do not get output as fields.
+    if (inferredType == null || inferredType.isEmpty || element.isConst) {
       return null;
     }
     int size = 0;
-    DartType type = element.computeType(compiler);
+    DartType type = element.type;
     List<InfoNode> contents = new List<InfoNode>();
     if (emittedCode != null) {
       contents.add(new CodeInfoNode(
@@ -324,13 +391,20 @@
         modifiers: modifiersToString(isStatic: element.isStatic,
                                      isFinal: element.isFinal,
                                      isConst: element.isConst),
-        contents: contents);
+        contents: contents,
+        outputUnitId: outputUnitId(element));
+  }
+
+  int outputUnitId(Element element) {
+    OutputUnit outputUnit =
+            compiler.deferredLoadTask.outputUnitForElement(element);
+    return outputUnitNumbering[outputUnit];
   }
 
   InfoNode visitClassElement(ClassElement element) {
-    // If the element is not resolved it is not used in the program, and we omit
-    // it from the output.
-    if (!element.isResolved) return null;
+    // If the element is not emitted in the program, we omit it from the output.
+    JavaScriptBackend backend = compiler.backend;
+    if (!backend.emitter.neededClasses.contains(element)) return null;
     String modifiersString = modifiersToString(isAbstract: element.isAbstract);
     String supersString = element.allSupertypes == null ? "" :
         "implements ${element.allSupertypes}";
@@ -343,11 +417,6 @@
       }
     });
     stack.removeLast();
-    if (contents.isEmpty) {
-      // TODO (sigurdm): Only return here if the class is never used in type
-      // checks.
-      return null;
-    }
     contents.sort((InfoNode n1, InfoNode n2) {
       return n1.name.compareTo(n2.name);
     });
@@ -356,11 +425,12 @@
         name: element.name,
         extra: supersString,
         modifiers: modifiersString,
-        contents: contents);
+        contents: contents,
+        outputUnitId: outputUnitId(element));
   }
 
   InfoNode visitFunctionElement(FunctionElement element) {
-    CodeBuffer emittedCode = compiler.backend.codeOf(element);
+    CodeBuffer emittedCode = compiler.dumpInfoTask.codeOf(element);
     int size = 0;
     String nameString = element.name;
     String modifiersString = modifiersToString(
@@ -418,13 +488,15 @@
     if (size == 0) {
       return null;
     }
+
     return new ElementInfoNode(
         type: element.computeType(compiler).toString(),
         kind: kindString,
         name: nameString,
         size: size,
         modifiers: modifiersString,
-        contents: contents);
+        contents: contents,
+        outputUnitId: outputUnitId(element));
   }
 }
 
@@ -439,9 +511,27 @@
 
   final InfoDumpVisitor infoDumpVisitor;
 
+  final Map<Element, jsAst.Expression>_generatedCode =
+      new Map<Element, jsAst.Expression>();
+
+  /// Registers that [code] has been generated for [element] so that it can be
+  /// emitted in the info.html.
+  void registerGeneratedCode(Element element, jsAst.Expression code) {
+    if (compiler.dumpInfo) {
+      _generatedCode[element] = code;
+    }
+  }
+
+  CodeBuffer codeOf(Element element) {
+    jsAst.Expression code = _generatedCode[element];
+    return code != null
+        ? jsAst.prettyPrint(code, compiler)
+        : compiler.backend.codeOf(element);
+  }
+
   void dumpInfo() {
     measure(() {
-      ProgramInfo info = collectDumpInfo();
+      ProgramInfo info = infoDumpVisitor.collectDumpInfo();
       StringBuffer buffer = new StringBuffer();
       dumpInfoHtml(info, buffer);
       compiler.outputProvider('', 'info.html')
@@ -450,31 +540,6 @@
     });
   }
 
-  ProgramInfo collectDumpInfo() {
-    List<LibraryElement> sortedLibraries = compiler.libraries.values.toList();
-    sortedLibraries.sort((LibraryElement l1, LibraryElement l2) {
-      if (l1.isPlatformLibrary && !l2.isPlatformLibrary) {
-        return 1;
-      } else if (!l1.isPlatformLibrary && l2.isPlatformLibrary) {
-        return -1;
-      }
-      return l1.getLibraryName().compareTo(l2.getLibraryName());
-    });
-
-    List<InfoNode> libraryInfos = new List<InfoNode>();
-    libraryInfos.addAll(sortedLibraries
-        .map((library) => infoDumpVisitor.visit(library))
-        .where((info) => info != null));
-
-    return new ProgramInfo(
-        compilationDuration: compiler.totalCompileTime.elapsed,
-        // TODO (sigurdm): Also count the size of deferred code
-        size: compiler.assembledCode.length,
-        libraries: libraryInfos,
-        compilationMoment: new DateTime.now(),
-        dart2jsVersion: compiler.hasBuildId ? compiler.buildId : null);
-  }
-
   void dumpInfoHtml(ProgramInfo info, StringSink buffer) {
     int totalSize = info.size;
 
@@ -500,10 +565,27 @@
         span.modifiers {font-weight:bold;}
         span.name {font-weight:bold; font-family: monospace;}
         span.type {font-family: monospace; color:blue;}
+""");
+    for (int i = 0; i < COLORS.length; i++) {
+      buffer.writeln("        .outputUnit$i "
+          "{border-left: 4px solid ${COLORS[i]}}");
+    }
+    buffer.writeln("""
        </style>
      </head>
      <body>
        <h1>Dart2js compilation information</h1>""");
+    if (info.outputUnitNumbering.length > 1) {
+      for (OutputUnit outputUnit in info.outputUnitNumbering.keys) {
+        String color = COLORS[info.outputUnitNumbering[outputUnit]
+             % COLORS.length];
+        JavaScriptBackend backend = compiler.backend;
+        int size = backend.emitter.outputBuffers[outputUnit].length;
+        buffer.writeln('<div style='
+            '"background:$color;">'
+            '${outputUnit.partFileName(compiler)} $size bytes</div>');
+      }
+    }
     buffer.writeln(h2('Compilation took place: '
                       '${info.compilationMoment}'));
     buffer.writeln(h2('Compilation took: '
diff --git a/sdk/lib/_internal/compiler/implementation/helpers/expensive_set.dart b/sdk/lib/_internal/compiler/implementation/helpers/expensive_set.dart
index 61bad61..b57db8a 100644
--- a/sdk/lib/_internal/compiler/implementation/helpers/expensive_set.dart
+++ b/sdk/lib/_internal/compiler/implementation/helpers/expensive_set.dart
@@ -120,5 +120,13 @@
     retainWhere(retainSet.contains);
   }
 
+  Set<E> toSet() {
+    var result = new ExpensiveSet<E>(_sets.length);
+    for (int i = 0; i < _sets.length; i++) {
+      result._sets[i] = _sets[i].toSet();
+    }
+    return result;
+  }
+
   String toString() => "expensive(${_sets[0]}x${_sets.length})";
 }
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
index 1d5e07e..0152fe2 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -13,6 +13,7 @@
 import '../scanner/scannerlib.dart' show Token, isUserDefinableOperator;
 import '../dart_backend/dart_backend.dart' show DartBackend;
 import '../universe/universe.dart' show SelectorKind;
+import '../util/util.dart' show Link;
 
 /**
  * This task iterates through all resolved elements and builds [ir.Node]s. The
@@ -716,10 +717,59 @@
     return constant;
   }
 
+  Constant getConstantForNode(ast.Node node) {
+    Constant constant =
+        compiler.backend.constants.getConstantForNode(node, elements);
+    assert(invariant(node, constant != null,
+        message: 'No constant computed for $node'));
+    return constant;
+  }
+
+  bool isSupportedConst(Constant constant) {
+    return const SupportedConstantVisitor().visit(constant);
+  }
+
+  ir.Primitive visitLiteralList(ast.LiteralList node) {
+    assert(isOpen);
+    ir.Primitive result;
+    if (node.isConst) {
+      // TODO(sigurdm): Remove when all constants are supported.
+      Constant constant = getConstantForNode(node);
+      if (!isSupportedConst(constant)) return giveup();
+      result = new ir.Constant(constant);
+    } else {
+      List<ir.Primitive> values = new List<ir.Primitive>();
+      node.elements.nodes.forEach((ast.Node node) {
+        values.add(visit(node));
+      });
+      result = new ir.LiteralList(values);
+    }
+    add(new ir.LetPrim(result));
+    return result;
+  }
+
+  ir.Primitive visitLiteralMap(ast.LiteralMap node) {
+    assert(isOpen);
+    ir.Primitive result;
+    if (node.isConst) {
+      // TODO(sigurdm): Remove when all constants are supported.
+      Constant constant = getConstantForNode(node);
+      if (!isSupportedConst(constant)) return giveup();
+      result = new ir.Constant(constant);
+    } else {
+      List<ir.Primitive> keys = new List<ir.Primitive>();
+      List<ir.Primitive> values = new List<ir.Primitive>();
+      node.entries.nodes.forEach((ast.LiteralMapEntry node) {
+        keys.add(visit(node.key));
+        values.add(visit(node.value));
+      });
+      result = new ir.LiteralMap(keys, values);
+    }
+    add(new ir.LetPrim(result));
+    return result;
+  }
+
   // TODO(kmillikin): other literals.
-  //   LiteralList
-  //   LiteralMap
-  //   LiteralMapEntry
   //   LiteralSymbol
 
   ir.Primitive visitParenthesizedExpression(
@@ -748,6 +798,12 @@
     return receiver;
   }
 
+  ir.Primitive lookupLocal(Element element) {
+    int index = variableIndex[element];
+    ir.Primitive value = assignedVars[index];
+    return value == null ? freeVars[index] : value;
+  }
+
   // ==== Sends ====
   ir.Primitive visitAssert(ast.Send node) {
     assert(isOpen);
@@ -761,7 +817,31 @@
 
   ir.Primitive visitClosureSend(ast.Send node) {
     assert(isOpen);
-    return giveup();
+    Selector closureSelector = elements.getSelector(node);
+    Selector namedCallSelector = new Selector(closureSelector.kind,
+                     "call",
+                     closureSelector.library,
+                     closureSelector.argumentCount,
+                     closureSelector.namedArguments);
+    assert(node.receiver == null);
+    Element element = elements[node];
+    ir.Primitive closureTarget;
+    if (element == null) {
+      closureTarget = visit(node.selector);
+    } else {
+      assert(Elements.isLocal(element));
+      closureTarget = lookupLocal(element);
+    }
+    List<ir.Primitive> arguments = new List<ir.Primitive>();
+    for (ast.Node n in node.arguments) {
+      arguments.add(visit(n));
+    }
+    ir.Parameter v = new ir.Parameter(null);
+    ir.Continuation k = new ir.Continuation([v]);
+    ir.Expression invoke =
+        new ir.InvokeMethod(closureTarget, namedCallSelector, k, arguments);
+    add(new ir.LetCont(k, invoke));
+    return v;
   }
 
   ir.Primitive visitDynamicSend(ast.Send node) {
@@ -771,8 +851,10 @@
     }
     Selector selector = elements.getSelector(node);
     ir.Primitive receiver = visit(node.receiver);
-    List arguments = node.arguments.toList(growable:false)
-                         .map(visit).toList(growable:false);
+    List<ir.Primitive> arguments = new List<ir.Primitive>();
+    for (ast.Node n in node.arguments) {
+      arguments.add(visit(n));
+    }
     ir.Parameter v = new ir.Parameter(null);
     ir.Continuation k = new ir.Continuation([v]);
     ir.Expression invoke =
@@ -785,9 +867,7 @@
     assert(isOpen);
     Element element = elements[node];
     if (Elements.isLocal(element)) {
-      int index = variableIndex[element];
-      ir.Primitive value = assignedVars[index];
-      return value == null ? freeVars[index] : value;
+      return lookupLocal(element);
     } else if (element == null || Elements.isInstanceField(element)) {
       ir.Primitive receiver = visit(node.receiver);
       ir.Parameter v = new ir.Parameter(null);
@@ -1060,6 +1140,32 @@
   }
 }
 
+// While we don't support all constants we need to filter out the unsupported
+// ones:
+class SupportedConstantVisitor extends ConstantVisitor<bool> {
+  const SupportedConstantVisitor();
+
+  bool visit(Constant constant) => constant.accept(this);
+  bool visitFunction(FunctionConstant constant) => false;
+  bool visitNull(NullConstant constant) => true;
+  bool visitInt(IntConstant constant) => true;
+  bool visitDouble(DoubleConstant constant) => true;
+  bool visitTrue(TrueConstant constant) => true;
+  bool visitFalse(FalseConstant constant) => true;
+  bool visitString(StringConstant constant) => true;
+  bool visitList(ListConstant constant) {
+    return constant.entries.every(visit);
+  }
+  bool visitMap(MapConstant constant) {
+    return visit(constant.keys) && constant.values.every(visit);
+  }
+  bool visitConstructed(ConstructedConstant constant) => false;
+  bool visitType(TypeConstant constant) => false;
+  bool visitInterceptor(InterceptorConstant constant) => false;
+  bool visitDummy(DummyConstant constant) => false;
+  bool visitDeferred(DeferredConstant constant) => false;
+}
+
 // Verify that types are ones that can be reconstructed by the type emitter.
 class SupportedTypeVerifier extends DartTypeVisitor<bool, Null> {
   bool visit(DartType type, Null _) => type.accept(this, null);
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
index a9cabeb..6db0e8f 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
@@ -122,7 +122,7 @@
   InvokeStatic(this.target, this.selector, Continuation cont,
                List<Definition> args)
       : continuation = new Reference(cont),
-        arguments = args.map((t) => new Reference(t)).toList(growable: false) {
+        arguments = _referenceList(args) {
     assert(selector.kind == SelectorKind.CALL);
     assert(selector.name == target.name);
   }
@@ -144,7 +144,7 @@
                List<Definition> args)
       : receiver = new Reference(receiver),
         continuation = new Reference(cont),
-        arguments = args.map((t) => new Reference(t)).toList(growable: false) {
+        arguments = _referenceList(args) {
     assert(selector != null);
     assert(selector.kind == SelectorKind.CALL ||
            selector.kind == SelectorKind.OPERATOR ||
@@ -179,7 +179,7 @@
                     Continuation cont,
                     List<Definition> args)
       : continuation = new Reference(cont),
-        arguments = args.map((t) => new Reference(t)).toList(growable: false) {
+        arguments = _referenceList(args) {
     assert(target.isConstructor);
     assert(type.element == target.enclosingElement);
   }
@@ -194,7 +194,7 @@
 
   ConcatenateStrings(Continuation cont, List<Definition> args)
       : continuation = new Reference(cont),
-        arguments = args.map((t) => new Reference(t)).toList(growable: false);
+        arguments = _referenceList(args);
 
   accept(Visitor visitor) => visitor.visitConcatenateStrings(this);
 }
@@ -211,7 +211,7 @@
   InvokeContinuation(Continuation cont, List<Definition> args,
                      {recursive: false})
       : continuation = new Reference(cont),
-        arguments = args.map((t) => new Reference(t)).toList(growable: false),
+        arguments = _referenceList(args),
         isRecursive = recursive {
     if (recursive) cont.isRecursive = true;
   }
@@ -252,6 +252,26 @@
   accept(Visitor visitor) => visitor.visitConstant(this);
 }
 
+class LiteralList extends Primitive {
+  List<Reference> values;
+
+  LiteralList(List<Primitive> values)
+      : this.values = _referenceList(values);
+
+  accept(Visitor visitor) => visitor.visitLiteralList(this);
+}
+
+class LiteralMap extends Primitive {
+  List<Reference> keys;
+  List<Reference> values;
+
+  LiteralMap(List<Primitive> keys, List<Primitive> values)
+      : this.keys = _referenceList(keys),
+        this.values = _referenceList(values);
+
+  accept(Visitor visitor) => visitor.visitLiteralMap(this);
+}
+
 class Parameter extends Primitive {
   final ParameterElement element;
 
@@ -289,6 +309,10 @@
   accept(Visitor visitor) => visitor.visitFunctionDefinition(this);
 }
 
+List<Reference> _referenceList(List<Definition> definitions) {
+  return definitions.map((e) => new Reference(e)).toList(growable: false);
+}
+
 abstract class Visitor<T> {
   T visit(Node node) => node.accept(this);
   // Abstract classes.
@@ -312,6 +336,8 @@
   T visitBranch(Branch node) => visitExpression(node);
 
   // Definitions.
+  T visitLiteralList(LiteralList node) => visitPrimitive(node);
+  T visitLiteralMap(LiteralMap node) => visitPrimitive(node);
   T visitConstant(Constant node) => visitPrimitive(node);
   T visitParameter(Parameter node) => visitPrimitive(node);
   T visitContinuation(Continuation node) => visitDefinition(node);
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
index 7138191..38a4ae9 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
@@ -127,6 +127,23 @@
     printStmt(dummy, "ConcatenateStrings ($args) $kont");
   }
 
+  visitLiteralList(ir.LiteralList node) {
+    String dummy = names.name(node);
+    String values = node.values.map(formatReference).join(', ');
+    printStmt(dummy, "LiteralList ($values)");
+  }
+
+  visitLiteralMap(ir.LiteralMap node) {
+    String dummy = names.name(node);
+    List<String> entries = new List<String>();
+    for (int i = 0; i < node.values.length; ++i) {
+      String key = formatReference(node.keys[i]);
+      String value = formatReference(node.values[i]);
+      entries.add("$key: $value");
+    }
+    printStmt(dummy, "LiteralMap (${entries.join(', ')})");
+  }
+
   visitInvokeContinuation(ir.InvokeContinuation node) {
     String dummy = names.name(node);
     String kont = formatReference(node.continuation);
diff --git a/sdk/lib/_internal/compiler/implementation/js/template.dart b/sdk/lib/_internal/compiler/implementation/js/template.dart
index 6ac0024..94024d3 100644
--- a/sdk/lib/_internal/compiler/implementation/js/template.dart
+++ b/sdk/lib/_internal/compiler/implementation/js/template.dart
@@ -10,6 +10,11 @@
 
   TemplateManager();
 
+  // TODO(18886): Remove this function once the memory-leak in the VM is fixed.
+  void clear() {
+    expressionTemplates.clear();
+    statementTemplates.clear();
+  }
 
   Template lookupExpressionTemplate(String source) {
     return expressionTemplates[source];
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 6cf0863..6b2b84f 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
@@ -106,6 +106,9 @@
     typeTestEmitter.task = this;
     interceptorEmitter.task = this;
     metadataEmitter.task = this;
+    // TODO(18886): Remove this call (and the show in the import) once the
+    // memory-leak in the VM is fixed.
+    templateManager.clear();
   }
 
   void addComment(String comment, CodeBuffer buffer) {
@@ -852,6 +855,7 @@
                constantEmitter.referenceInInitializationContext(initialValue)]);
         buffer.write(jsAst.prettyPrint(init, compiler));
         buffer.write('$N');
+        compiler.dumpInfoTask.registerGeneratedCode(element, init);
       });
     }
   }
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 3ee8ac0..2df2853 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/js_emitter.dart
@@ -21,7 +21,7 @@
     ConstructorBodyElement;
 
 import '../js/js.dart' show
-    js;
+    js, templateManager;
 
 import '../js_backend/js_backend.dart' show
     CheckedModeHelper,
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index bf1cf22..2ffddf4 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -193,7 +193,7 @@
     return mutations;
   }
 
-  void setPotentiallyMutated(VariableElement element, Node mutationNode) {
+  void registerPotentialMutation(VariableElement element, Node mutationNode) {
     potentiallyMutated.putIfAbsent(element, () => <Node>[]).add(mutationNode);
   }
 
@@ -205,7 +205,7 @@
     return mutations;
   }
 
-  void registerPotentiallyMutatedIn(Node contextNode, VariableElement element,
+  void registerPotentialMutationIn(Node contextNode, VariableElement element,
                                     Node mutationNode) {
     Map<VariableElement, List<Node>> mutationMap =
       potentiallyMutatedIn.putIfAbsent(contextNode,
@@ -219,7 +219,7 @@
     return mutations;
   }
 
-  void registerPotentiallyMutatedInClosure(VariableElement element,
+  void registerPotentialMutationInClosure(VariableElement element,
                                            Node mutationNode) {
     potentiallyMutatedInClosure.putIfAbsent(
         element, () => <Node>[]).add(mutationNode);
@@ -451,18 +451,19 @@
       }
       if (element.isSynthesized) {
         if (isConstructor) {
+          ResolutionRegistry registry =
+              new ResolutionRegistry(compiler, element);
           ConstructorElement constructor = element.asFunctionElement();
-          TreeElements elements = _ensureTreeElements(element);
           ConstructorElement target = constructor.definingConstructor;
           // Ensure the signature of the synthesized element is
           // resolved. This is the only place where the resolver is
           // seeing this element.
           element.computeSignature(compiler);
           if (!target.isErroneous) {
-            compiler.enqueuer.resolution.registerStaticUse(target);
-            compiler.world.registerImplicitSuperCall(elements, target);
+            registry.registerStaticUse(target);
+            registry.registerImplicitSuperCall(target);
           }
-          return elements;
+          return registry.mapping;
         } else {
           assert(element.isDeferredLoaderGetter);
           return _ensureTreeElements(element);
@@ -497,7 +498,8 @@
         }
 
         ResolverVisitor visitor = visitorFor(element);
-        visitor.useElement(tree, element);
+        ResolutionRegistry registry = visitor.registry;
+        registry.useElement(tree, element);
         visitor.setupFunction(tree, element);
 
         if (isConstructor && !element.isForwardingConstructor) {
@@ -526,9 +528,10 @@
         // class. This is the part of the 'super' mixin check that
         // happens when a function is resolved after the mixin
         // application has been performed.
-        TreeElements resolutionTree = visitor.mapping;
+        TreeElements resolutionTree = registry.mapping;
         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) {
@@ -546,7 +549,8 @@
   /// This method should only be used by this library (or tests of
   /// this library).
   ResolverVisitor visitorFor(Element element) {
-    return new ResolverVisitor(compiler, element, _ensureTreeElements(element));
+    return new ResolverVisitor(compiler, element,
+        new ResolutionRegistry(compiler, element));
   }
 
   TreeElements resolveField(VariableElementX element) {
@@ -556,6 +560,7 @@
             MessageKind.TOP_LEVEL_VARIABLE_DECLARED_STATIC);
     }
     ResolverVisitor visitor = visitorFor(element);
+    ResolutionRegistry registry = visitor.registry;
     // TODO(johnniwinther): Share the resolved type between all variables
     // declared in the same declaration.
     if (tree.type != null) {
@@ -563,7 +568,7 @@
     } else {
       element.variables.type = compiler.types.dynamicType;
     }
-    visitor.useElement(tree, element);
+    registry.useElement(tree, element);
 
     Expression initializer = element.initializer;
     Modifiers modifiers = element.modifiers;
@@ -576,8 +581,7 @@
     } else if (modifiers.isFinal && !element.isInstanceMember) {
       compiler.reportError(element, MessageKind.FINAL_WITHOUT_INITIALIZER);
     } else {
-      compiler.enqueuer.resolution.registerInstantiatedClass(
-          compiler.nullClass, visitor.mapping);
+      registry.registerInstantiatedClass(compiler.nullClass);
     }
 
     if (Elements.isStaticOrTopLevelField(element)) {
@@ -592,7 +596,7 @@
         if (!element.modifiers.isConst) {
           // TODO(johnniwinther): Determine the const-ness eagerly to avoid
           // unnecessary registrations.
-          compiler.backend.registerLazyField(visitor.mapping);
+          registry.registerLazyField();
         }
       }
     }
@@ -600,7 +604,7 @@
     // Perform various checks as side effect of "computing" the type.
     element.computeType(compiler);
 
-    return visitor.mapping;
+    return registry.mapping;
   }
 
   DartType resolveTypeAnnotation(Element element, TypeAnnotation annotation) {
@@ -768,7 +772,8 @@
   TreeElements resolveClass(BaseClassElementX element) {
     return _resolveTypeDeclaration(element, () {
       // TODO(johnniwinther): Store the mapping in the resolution enqueuer.
-      resolveClassInternal(element, _ensureTreeElements(element));
+      ResolutionRegistry registry = new ResolutionRegistry(compiler, element);
+      resolveClassInternal(element, registry);
       return element.treeElements;
     });
   }
@@ -782,7 +787,7 @@
   }
 
   void resolveClassInternal(BaseClassElementX element,
-                            TreeElementMapping mapping) {
+                            ResolutionRegistry registry) {
     if (!element.isPatch) {
       compiler.withCurrentElement(element, () => measure(() {
         assert(element.resolutionState == STATE_NOT_STARTED);
@@ -791,7 +796,7 @@
         loadSupertypes(element, tree);
 
         ClassResolverVisitor visitor =
-            new ClassResolverVisitor(compiler, element, mapping);
+            new ClassResolverVisitor(compiler, element, registry);
         visitor.visit(tree);
         element.resolutionState = STATE_DONE;
         compiler.onClassResolved(element);
@@ -903,6 +908,8 @@
         // doesn't use 'super'. This is the part of the 'super' mixin
         // check that happens when a function is resolved before the
         // mixin application has been performed.
+        // TODO(johnniwinther): Obtain the [TreeElements] for [member]
+        // differently.
         checkMixinSuperUses(
             compiler.enqueuer.resolution.resolvedElements[member],
             mixinApplication,
@@ -914,6 +921,7 @@
   void checkMixinSuperUses(TreeElements resolutionTree,
                            MixinApplicationElement mixinApplication,
                            ClassElement mixin) {
+    // TODO(johnniwinther): Avoid the use of [TreeElements] here.
     if (resolutionTree == null) return;
     Setlet<Node> superUses = resolutionTree.superUses;
     if (superUses.isEmpty) return;
@@ -1156,7 +1164,7 @@
           compiler.parser.measure(() => element.parseNode(compiler));
       return measure(() => SignatureResolver.analyze(
           compiler, node.parameters, node.returnType, element,
-          _ensureTreeElements(element),
+          new ResolutionRegistry(compiler, element),
           defaultValuesError: defaultValuesError));
     });
   }
@@ -1164,16 +1172,16 @@
   TreeElements resolveTypedef(TypedefElementX element) {
     if (element.isResolved) return element.treeElements;
     return _resolveTypeDeclaration(element, () {
-      TreeElementMapping mapping = _ensureTreeElements(element);
+      ResolutionRegistry registry = new ResolutionRegistry(compiler, element);
       return compiler.withCurrentElement(element, () {
         return measure(() {
           Typedef node =
             compiler.parser.measure(() => element.parseNode(compiler));
           TypedefResolverVisitor visitor =
-            new TypedefResolverVisitor(compiler, element, mapping);
+            new TypedefResolverVisitor(compiler, element, registry);
           visitor.visit(node);
 
-          return mapping;
+          return registry.mapping;
         });
       });
     });
@@ -1193,15 +1201,17 @@
         context = annotatedElement;
       }
       ResolverVisitor visitor = visitorFor(context);
+      ResolutionRegistry registry = visitor.registry;
       node.accept(visitor);
+      // TODO(johnniwinther): Avoid passing the [TreeElements] to
+      // [compileMetadata].
       annotation.value =
-          constantCompiler.compileMetadata(annotation, node, visitor.mapping);
+          constantCompiler.compileMetadata(annotation, node, registry.mapping);
       // TODO(johnniwinther): Register the relation between the annotation
       // and the annotated element instead. This will allow the backed to
       // retrieve the backend constant and only registered metadata on the
       // elements for which it is needed. (Issue 17732).
-      compiler.backend.registerMetadataConstant(
-          annotation.value, visitor.mapping);
+      registry.registerMetadataConstant(annotation.value);
       annotation.resolutionState = STATE_DONE;
     }));
   }
@@ -1234,6 +1244,8 @@
   InitializerResolver(this.visitor)
     : initialized = new Map<Element, Node>(), hasSuper = false;
 
+  ResolutionRegistry get registry => visitor.registry;
+
   error(Node node, MessageKind kind, [arguments = const {}]) {
     visitor.error(node, kind, arguments);
   }
@@ -1292,8 +1304,8 @@
     } else {
       error(init, MessageKind.INVALID_RECEIVER_IN_INITIALIZER);
     }
-    visitor.useElement(init, target);
-    visitor.world.registerStaticUse(target);
+    registry.useElement(init, target);
+    registry.registerStaticUse(target);
     checkForDuplicateInitializers(target, init);
     // Resolve initializing value.
     visitor.visitInStaticContext(init.arguments.head);
@@ -1323,7 +1335,7 @@
       visitor.resolveSelector(call, null);
       visitor.resolveArguments(call.argumentsNode);
     });
-    Selector selector = visitor.mapping.getSelector(call);
+    Selector selector = registry.getSelector(call);
     bool isSuperCall = Initializers.isSuperConstructorCall(call);
 
     ClassElement lookupTarget = getSuperOrThisLookupTarget(constructor,
@@ -1344,8 +1356,8 @@
                                      className,
                                      constructorSelector);
 
-    visitor.useElement(call, calledConstructor);
-    visitor.world.registerStaticUse(calledConstructor);
+    registry.useElement(call, calledConstructor);
+    registry.registerStaticUse(calledConstructor);
     return calledConstructor;
   }
 
@@ -1381,9 +1393,8 @@
                                        functionNode,
                                        className,
                                        constructorSelector);
-      visitor.compiler.world
-         .registerImplicitSuperCall(visitor.mapping, calledConstructor);
-      visitor.world.registerStaticUse(calledConstructor);
+      registry.registerImplicitSuperCall(calledConstructor);
+      registry.registerStaticUse(calledConstructor);
     }
   }
 
@@ -1674,6 +1685,8 @@
   DartType resolveTypeAnnotation(MappingVisitor visitor, TypeAnnotation node,
                                  {bool malformedIsError: false,
                                   bool deferredIsMalformed: true}) {
+    ResolutionRegistry registry = visitor.registry;
+
     Identifier typeName;
     DartType type;
 
@@ -1701,7 +1714,7 @@
       if (identical(typeName.source, 'void')) {
         type = const VoidType();
         checkNoTypeArguments(type);
-        visitor.useType(node, type);
+        registry.useType(node, type);
         return type;
       }
     }
@@ -1716,7 +1729,7 @@
       if (malformedIsError) {
         visitor.error(node, messageKind, messageArguments);
       } else {
-        compiler.backend.registerThrowRuntimeError(visitor.mapping);
+        registry.registerThrowRuntimeError();
         visitor.warning(node, messageKind, messageArguments);
       }
       if (erroneousElement == null) {
@@ -1738,7 +1751,7 @@
       AmbiguousElement ambiguous = element;
       type = reportFailureAndCreateType(
           ambiguous.messageKind, ambiguous.messageArguments);
-      ambiguous.diagnose(visitor.mapping.currentElement, compiler);
+      ambiguous.diagnose(registry.currentElement, compiler);
     } else if (element.isErroneous) {
       ErroneousElement erroneousElement = element;
       type = reportFailureAndCreateType(
@@ -1798,7 +1811,7 @@
             !outer.isTypedef &&
             !isInFactoryConstructor &&
             Elements.isInStaticContext(visitor.enclosingElement)) {
-          compiler.backend.registerThrowRuntimeError(visitor.mapping);
+          registry.registerThrowRuntimeError();
           type = reportFailureAndCreateType(
               MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER,
               {'typeVariableName': node},
@@ -1812,22 +1825,21 @@
             "Unexpected element kind ${element.kind}.");
       }
       if (addTypeVariableBoundsCheck) {
+        registry.registerTypeVariableBoundCheck();
         visitor.addDeferredAction(
             visitor.enclosingElement,
-            () => checkTypeVariableBounds(visitor.mapping, node, type));
+            () => checkTypeVariableBounds(node, type));
       }
     }
-    visitor.useType(node, type);
+    registry.useType(node, type);
     return type;
   }
 
   /// Checks the type arguments of [type] against the type variable bounds.
-  void checkTypeVariableBounds(TreeElements elements,
-                               TypeAnnotation node, GenericType type) {
+  void checkTypeVariableBounds(TypeAnnotation node, GenericType type) {
     void checkTypeVariableBound(_, DartType typeArgument,
                                    TypeVariableType typeVariable,
                                    DartType bound) {
-      compiler.backend.registerTypeVariableBoundCheck(elements);
       if (!compiler.types.isSubtype(typeArgument, bound)) {
         compiler.reportWarning(node,
             MessageKind.INVALID_TYPE_VARIABLE_BOUND,
@@ -1881,37 +1893,24 @@
 
 /**
  * Common supertype for resolver visitors that record resolutions in a
- * [TreeElements] mapping.
+ * [ResolutionRegistry].
  */
 abstract class MappingVisitor<T> extends CommonResolverVisitor<T> {
-  final TreeElementMapping mapping;
+  final ResolutionRegistry registry;
   final TypeResolver typeResolver;
   /// The current enclosing element for the visited AST nodes.
   Element get enclosingElement;
   /// The current scope of the visitor.
   Scope get scope;
 
-  MappingVisitor(Compiler compiler, TreeElementMapping this.mapping)
+  MappingVisitor(Compiler compiler, ResolutionRegistry this.registry)
       : typeResolver = new TypeResolver(compiler),
         super(compiler);
 
-  Element useElement(Node node, Element element) {
-    if (element == null) return null;
-    return mapping[node] = element;
-  }
-
-  DartType useType(Node annotation, DartType type) {
-    if (type != null) {
-      mapping.setType(annotation, type);
-      useElement(annotation, type.element);
-    }
-    return type;
-  }
-
   Element defineElement(Node node, Element element,
                         {bool doAddToScope: true}) {
     invariant(node, element != null);
-    mapping[node] = element;
+    registry.defineElement(node, element);
     if (doAddToScope) {
       Element existing = scope.add(element);
       if (existing != element) {
@@ -2003,7 +2002,7 @@
 
   ResolverVisitor(Compiler compiler,
                   Element element,
-                  TreeElementMapping mapping)
+                  ResolutionRegistry registry)
     : this.enclosingElement = element,
       // When the element is a field, we are actually resolving its
       // initial value, which should not have access to instance
@@ -2021,9 +2020,7 @@
           !element.isTypedef &&
           !element.enclosingElement.isTypedef,
       inCatchBlock = false,
-      super(compiler, mapping);
-
-  ResolutionEnqueuer get world => compiler.enqueuer.resolution;
+      super(compiler, registry);
 
   Element reportLookupErrorIfAny(Element result, Node node, String name) {
     if (!Elements.isUnresolved(result)) {
@@ -2046,14 +2043,14 @@
     return result;
   }
 
-  // Create, or reuse an already created, statement element for a statement.
-  TargetElement getOrCreateTargetElement(Node statement) {
-    TargetElement element = mapping[statement];
+  // Create, or reuse an already created, target element for a statement.
+  TargetElement getOrDefineTarget(Node statement) {
+    TargetElement element = registry.getTargetDefinition(statement);
     if (element == null) {
       element = new TargetElementX(statement,
                                    statementScope.nestingLevel,
                                    enclosingElement);
-      mapping[statement] = element;
+      registry.defineTarget(statement, element);
     }
     return element;
   }
@@ -2117,7 +2114,7 @@
           element = warnAndCreateErroneousElement(
               node, node.source, MessageKind.CANNOT_RESOLVE,
               {'name': node});
-          compiler.backend.registerThrowNoSuchMethod(mapping);
+          registry.registerThrowNoSuchMethod();
         }
       } else if (element.isErroneous) {
         // Use the erroneous element.
@@ -2132,7 +2129,7 @@
         ClassElement classElement = element;
         classElement.ensureResolved(compiler);
       }
-      return useElement(node, element);
+      return registry.useElement(node, element);
     }
   }
 
@@ -2140,7 +2137,7 @@
     DartType type = resolveTypeAnnotation(node);
     if (type != null) {
       if (inCheckContext) {
-        compiler.enqueuer.resolution.registerIsCheck(type, mapping);
+        registry.registerIsCheck(type);
       }
       return type.element;
     }
@@ -2201,7 +2198,7 @@
       // Field parameters (this.x) are not visible inside the constructor. The
       // fields they reference are visible, but must be resolved independently.
       if (element.kind == ElementKind.FIELD_PARAMETER) {
-        useElement(parameterNode, element);
+        registry.useElement(parameterNode, element);
       } else {
         defineElement(parameterNode, element);
       }
@@ -2213,9 +2210,8 @@
       });
     });
     if (inCheckContext) {
-      functionParameters.forEachParameter((Element element) {
-        compiler.enqueuer.resolution.registerIsCheck(
-            element.computeType(compiler), mapping);
+      functionParameters.forEachParameter((ParameterElement element) {
+        registry.registerIsCheck(element.type);
       });
     }
   }
@@ -2244,13 +2240,13 @@
    * Introduces new default targets for break and continue
    * before visiting the body of the loop
    */
-  visitLoopBodyIn(Node loop, Node body, Scope bodyScope) {
-    TargetElement element = getOrCreateTargetElement(loop);
+  visitLoopBodyIn(Loop loop, Node body, Scope bodyScope) {
+    TargetElement element = getOrDefineTarget(loop);
     statementScope.enterLoop(element);
     visitIn(body, bodyScope);
     statementScope.exitLoop();
     if (!element.isTarget) {
-      mapping.remove(loop);
+      registry.undefineTarget(loop);
     }
   }
 
@@ -2283,7 +2279,7 @@
   visitFunctionDeclaration(FunctionDeclaration node) {
     assert(node.function.name != null);
     visit(node.function);
-    FunctionElement functionElement = mapping[node.function];
+    FunctionElement functionElement = registry.getDefinition(node.function);
     // TODO(floitsch): this might lead to two errors complaining about
     // shadowing.
     defineElement(node, functionElement);
@@ -2302,7 +2298,7 @@
         enclosingElement);
     function.functionSignatureCache =
         SignatureResolver.analyze(compiler, node.parameters, node.returnType,
-            function, mapping);
+            function, registry);
     Scope oldScope = scope; // The scope is modified by [setupFunction].
     setupFunction(node, function);
     defineElement(node, function, doAddToScope: node.name != null);
@@ -2318,8 +2314,8 @@
     scope = oldScope;
     enclosingElement = previousEnclosingElement;
 
-    world.registerClosure(function, mapping);
-    world.registerInstantiatedClass(compiler.functionClass, mapping);
+    registry.registerClosure(function);
+    registry.registerInstantiatedClass(compiler.functionClass);
   }
 
   visitIf(If node) {
@@ -2331,7 +2327,7 @@
 
   Element resolveSend(Send node) {
     Selector selector = resolveSelector(node, null);
-    if (node.isSuperCall) mapping.superUses.add(node);
+    if (node.isSuperCall) registry.registerSuperUse(node);
 
     if (node.receiver == null) {
       // If this send is of the form "assert(expr);", then
@@ -2393,8 +2389,8 @@
         // We still need to register the invocation, because we might
         // call [:super.noSuchMethod:] which calls
         // [JSInvocationMirror._invokeOn].
-        world.registerDynamicInvocation(selector);
-        compiler.backend.registerSuperNoSuchMethod(mapping);
+        registry.registerDynamicInvocation(selector);
+        registry.registerSuperNoSuchMethod();
       }
     } else if (Elements.isUnresolved(resolvedReceiver)) {
       return null;
@@ -2414,7 +2410,7 @@
           compiler, receiverClass.declaration, name);
       target = receiverClass.lookupLocalMember(name);
       if (target == null || target.isInstanceMember) {
-        compiler.backend.registerThrowNoSuchMethod(mapping);
+        registry.registerThrowNoSuchMethod();
         // TODO(johnniwinther): With the simplified [TreeElements] invariant,
         // try to resolve injected elements if [currentClass] is in the patch
         // library of [receiverClass].
@@ -2433,7 +2429,7 @@
       PrefixElement prefix = resolvedReceiver;
       target = prefix.lookupLocalMember(name);
       if (Elements.isUnresolved(target)) {
-        compiler.backend.registerThrowNoSuchMethod(mapping);
+        registry.registerThrowNoSuchMethod();
         return warnAndCreateErroneousElement(
             node, name, MessageKind.NO_SUCH_LIBRARY_MEMBER,
             {'libraryName': prefix.name, 'memberName': name});
@@ -2515,7 +2511,7 @@
   Selector resolveSelector(Send node, Element element) {
     LibraryElement library = enclosingElement.library;
     Selector selector = computeSendSelector(node, library, element);
-    if (selector != null) mapping.setSelector(node, selector);
+    if (selector != null) registry.setSelector(node, selector);
     return selector;
   }
 
@@ -2570,7 +2566,7 @@
         AbstractFieldElement field = target;
         target = field.getter;
         if (target == null && !inInstanceContext) {
-          compiler.backend.registerThrowNoSuchMethod(mapping);
+          registry.registerThrowNoSuchMethod();
           target =
               warnAndCreateErroneousElement(node.selector, field.name,
                                             MessageKind.CANNOT_RESOLVE_GETTER);
@@ -2578,17 +2574,17 @@
       } else if (target.isTypeVariable) {
         ClassElement cls = target.enclosingClass;
         assert(enclosingElement.enclosingClass == cls);
-        compiler.backend.registerClassUsingVariableExpression(cls);
-        compiler.backend.registerTypeVariableExpression(mapping);
+        registry.registerClassUsingVariableExpression(cls);
+        registry.registerTypeVariableExpression();
         // Set the type of the node to [Type] to mark this send as a
         // type variable expression.
-        mapping.setType(node, compiler.typeClass.computeType(compiler));
-        world.registerTypeLiteral(target, mapping);
+        registry.setType(node, compiler.typeClass.computeType(compiler));
+        registry.registerTypeLiteral(target);
       } else if (target.impliesType && (!sendIsMemberAccess || node.isCall)) {
         // Set the type of the node to [Type] to mark this send as a
         // type literal.
-        mapping.setType(node, compiler.typeClass.computeType(compiler));
-        world.registerTypeLiteral(target, mapping);
+        registry.setType(node, compiler.typeClass.computeType(compiler));
+        registry.registerTypeLiteral(target);
 
         // Don't try to make constants of calls to type literals.
         if (!node.isCall) {
@@ -2602,7 +2598,7 @@
       if (isPotentiallyMutableTarget(target)) {
         if (enclosingElement != target.enclosingElement) {
           for (Node scope in promotionScope) {
-            mapping.setAccessedByClosureIn(scope, target, node);
+            registry.setAccessedByClosureIn(scope, target, node);
           }
         }
       }
@@ -2617,13 +2613,13 @@
         DartType type =
             resolveTypeAnnotation(node.typeAnnotationFromIsCheckOrCast);
         if (type != null) {
-          compiler.enqueuer.resolution.registerIsCheck(type, mapping);
+          registry.registerIsCheck(type);
         }
         resolvedArguments = true;
       } else if (identical(operatorString, 'as')) {
         DartType type = resolveTypeAnnotation(node.arguments.head);
         if (type != null) {
-          compiler.enqueuer.resolution.registerAsCheck(type, mapping);
+          registry.registerAsCheck(type);
         }
         resolvedArguments = true;
       } else if (identical(operatorString, '&&')) {
@@ -2639,7 +2635,7 @@
 
     // If the selector is null, it means that we will not be generating
     // code for this as a send.
-    Selector selector = mapping.getSelector(node);
+    Selector selector = registry.getSelector(node);
     if (selector == null) return null;
 
     if (node.isCall) {
@@ -2651,7 +2647,7 @@
         // we need to register that fact that we may be calling a closure
         // with the same arguments.
         Selector call = new Selector.callClosureFrom(selector);
-        world.registerDynamicInvocation(call);
+        registry.registerDynamicInvocation(call);
       } else if (target.impliesType) {
         // We call 'call()' on a Type instance returned from the reference to a
         // class or typedef literal. We do not need to register this call as a
@@ -2663,14 +2659,14 @@
           // in [resolveSend] above, we still need to register the invocation,
           // because we might call [:super.noSuchMethod:] which calls
           // [JSInvocationMirror._invokeOn].
-          world.registerDynamicInvocation(selector);
-          compiler.backend.registerSuperNoSuchMethod(mapping);
+          registry.registerDynamicInvocation(selector);
+          registry.registerSuperNoSuchMethod();
         }
       }
 
       if (target != null && target.isForeign(compiler)) {
         if (selector.name == 'JS') {
-          world.registerJsCall(node, this);
+          registry.registerJsCall(node, this);
         } else if (selector.name == 'JS_INTERCEPTOR_CONSTANT') {
           if (!node.argumentsNode.isEmpty) {
             Node argument = node.argumentsNode.nodes.head;
@@ -2683,16 +2679,16 @@
       }
     }
 
-    useElement(node, target);
+    registry.useElement(node, target);
     registerSend(selector, target);
     if (node.isPropertyAccess && Elements.isStaticOrTopLevelFunction(target)) {
-      world.registerGetOfStaticFunction(target.declaration);
+      registry.registerGetOfStaticFunction(target.declaration);
     }
     return node.isPropertyAccess ? target : null;
   }
 
   void warnArgumentMismatch(Send node, Element target) {
-    compiler.backend.registerThrowNoSuchMethod(mapping);
+    registry.registerThrowNoSuchMethod();
     // TODO(karlklose): we can be more precise about the reason of the
     // mismatch.
     warning(node.argumentsNode, MessageKind.INVALID_ARGUMENTS,
@@ -2728,17 +2724,17 @@
         if (setter == null && !inInstanceContext) {
           setter = warnAndCreateErroneousElement(
               node.selector, field.name, MessageKind.CANNOT_RESOLVE_SETTER);
-          compiler.backend.registerThrowNoSuchMethod(mapping);
+          registry.registerThrowNoSuchMethod();
         }
         if (isComplex && getter == null && !inInstanceContext) {
           getter = warnAndCreateErroneousElement(
               node.selector, field.name, MessageKind.CANNOT_RESOLVE_GETTER);
-          compiler.backend.registerThrowNoSuchMethod(mapping);
+          registry.registerThrowNoSuchMethod();
         }
       } else if (target.impliesType) {
         setter = warnAndCreateErroneousElement(
             node.selector, target.name, MessageKind.ASSIGNING_TYPE);
-        compiler.backend.registerThrowNoSuchMethod(mapping);
+        registry.registerThrowNoSuchMethod();
       } else if (target.isFinal ||
                  target.isConst ||
                  (target.isFunction &&
@@ -2751,22 +2747,22 @@
           setter = warnAndCreateErroneousElement(
               node.selector, target.name, MessageKind.CANNOT_RESOLVE_SETTER);
         }
-        compiler.backend.registerThrowNoSuchMethod(mapping);
+        registry.registerThrowNoSuchMethod();
       }
       if (isPotentiallyMutableTarget(target)) {
-        mapping.setPotentiallyMutated(target, node);
+        registry.registerPotentialMutation(target, node);
         if (enclosingElement != target.enclosingElement) {
-          mapping.registerPotentiallyMutatedInClosure(target, node);
+          registry.registerPotentialMutationInClosure(target, node);
         }
         for (Node scope in promotionScope) {
-          mapping.registerPotentiallyMutatedIn(scope, target, node);
+          registry.registerPotentialMutationIn(scope, target, node);
         }
       }
     }
 
     resolveArguments(node.argumentsNode);
 
-    Selector selector = mapping.getSelector(node);
+    Selector selector = registry.getSelector(node);
     if (isComplex) {
       Selector getterSelector;
       if (selector.isSetter) {
@@ -2776,48 +2772,48 @@
         getterSelector = new Selector.index();
       }
       registerSend(getterSelector, getter);
-      mapping.setGetterSelectorInComplexSendSet(node, getterSelector);
+      registry.setGetterSelectorInComplexSendSet(node, getterSelector);
       if (node.isSuperCall) {
         getter = currentClass.lookupSuperSelector(getterSelector, compiler);
         if (getter == null) {
           target = warnAndCreateErroneousElement(
               node, selector.name, MessageKind.NO_SUCH_SUPER_MEMBER,
               {'className': currentClass, 'memberName': selector.name});
-          compiler.backend.registerSuperNoSuchMethod(mapping);
+          registry.registerSuperNoSuchMethod();
         }
       }
-      useElement(node.selector, getter);
+      registry.useElement(node.selector, getter);
 
       // Make sure we include the + and - operators if we are using
       // the ++ and -- ones.  Also, if op= form is used, include op itself.
       void registerBinaryOperator(String name) {
         Selector binop = new Selector.binaryOperator(name);
-        world.registerDynamicInvocation(binop);
-        mapping.setOperatorSelectorInComplexSendSet(node, binop);
+        registry.registerDynamicInvocation(binop);
+        registry.setOperatorSelectorInComplexSendSet(node, binop);
       }
       if (identical(source, '++')) {
         registerBinaryOperator('+');
-        world.registerInstantiatedClass(compiler.intClass, mapping);
+        registry.registerInstantiatedClass(compiler.intClass);
       } else if (identical(source, '--')) {
         registerBinaryOperator('-');
-        world.registerInstantiatedClass(compiler.intClass, mapping);
+        registry.registerInstantiatedClass(compiler.intClass);
       } else if (source.endsWith('=')) {
         registerBinaryOperator(Elements.mapToUserOperator(operatorName));
       }
     }
 
     registerSend(selector, setter);
-    return useElement(node, setter);
+    return registry.useElement(node, setter);
   }
 
   void registerSend(Selector selector, Element target) {
     if (target == null || target.isInstanceMember) {
       if (selector.isGetter) {
-        world.registerDynamicGetter(selector);
+        registry.registerDynamicGetter(selector);
       } else if (selector.isSetter) {
-        world.registerDynamicSetter(selector);
+        registry.registerDynamicSetter(selector);
       } else {
-        world.registerDynamicInvocation(selector);
+        registry.registerDynamicInvocation(selector);
       }
     } else if (Elements.isStaticOrTopLevel(target)) {
       // Avoid registration of type variables since they are not analyzable but
@@ -2825,35 +2821,35 @@
       if (!target.isTypeVariable) {
         // [target] might be the implementation element and only declaration
         // elements may be registered.
-        world.registerStaticUse(target.declaration);
+        registry.registerStaticUse(target.declaration);
       }
     }
   }
 
   visitLiteralInt(LiteralInt node) {
-    world.registerInstantiatedClass(compiler.intClass, mapping);
+    registry.registerInstantiatedClass(compiler.intClass);
   }
 
   visitLiteralDouble(LiteralDouble node) {
-    world.registerInstantiatedClass(compiler.doubleClass, mapping);
+    registry.registerInstantiatedClass(compiler.doubleClass);
   }
 
   visitLiteralBool(LiteralBool node) {
-    world.registerInstantiatedClass(compiler.boolClass, mapping);
+    registry.registerInstantiatedClass(compiler.boolClass);
   }
 
   visitLiteralString(LiteralString node) {
-    world.registerInstantiatedClass(compiler.stringClass, mapping);
+    registry.registerInstantiatedClass(compiler.stringClass);
   }
 
   visitLiteralNull(LiteralNull node) {
-    world.registerInstantiatedClass(compiler.nullClass, mapping);
+    registry.registerInstantiatedClass(compiler.nullClass);
   }
 
   visitLiteralSymbol(LiteralSymbol node) {
-    world.registerInstantiatedClass(compiler.symbolClass, mapping);
-    world.registerStaticUse(compiler.symbolConstructor.declaration);
-    world.registerConstSymbol(node.slowNameString, mapping);
+    registry.registerInstantiatedClass(compiler.symbolClass);
+    registry.registerStaticUse(compiler.symbolConstructor.declaration);
+    registry.registerConstSymbol(node.slowNameString);
     if (!validateSymbol(node, node.slowNameString, reportError: false)) {
       compiler.reportError(node,
           MessageKind.UNSUPPORTED_LITERAL_SYMBOL,
@@ -2863,7 +2859,7 @@
   }
 
   visitStringJuxtaposition(StringJuxtaposition node) {
-    world.registerInstantiatedClass(compiler.stringClass, mapping);
+    registry.registerInstantiatedClass(compiler.stringClass);
     node.visitChildren(this);
   }
 
@@ -2913,9 +2909,9 @@
     ConstructorElement redirectionTarget = resolveRedirectingFactory(
         node, inConstContext: isConstConstructor);
     constructor.immediateRedirectionTarget = redirectionTarget;
-    useElement(node.expression, redirectionTarget);
+    registry.useElement(node.expression, redirectionTarget);
     if (Elements.isUnresolved(redirectionTarget)) {
-      compiler.backend.registerThrowNoSuchMethod(mapping);
+      registry.registerThrowNoSuchMethod();
       return;
     } else {
       if (isConstConstructor &&
@@ -2931,7 +2927,7 @@
     // Check that the target constructor is type compatible with the
     // redirecting constructor.
     ClassElement targetClass = redirectionTarget.enclosingClass;
-    InterfaceType type = mapping.getType(node.expression);
+    InterfaceType type = registry.getType(node.expression);
     FunctionType targetType = redirectionTarget.computeType(compiler)
         .subst(type.typeArguments, targetClass.typeVariables);
     FunctionType constructorType = constructor.computeType(compiler);
@@ -2947,7 +2943,7 @@
         constructor.computeSignature(compiler);
     if (!targetSignature.isCompatibleWith(constructorSignature)) {
       assert(!isSubtype);
-      compiler.backend.registerThrowNoSuchMethod(mapping);
+      registry.registerThrowNoSuchMethod();
     }
 
     // Register a post process to check for cycles in the redirection chain and
@@ -2956,16 +2952,16 @@
       compiler.resolver.resolveRedirectionChain(constructor, node);
     });
 
-    world.registerStaticUse(redirectionTarget);
-    world.registerInstantiatedClass(
-        redirectionTarget.enclosingElement.declaration, mapping);
+    registry.registerStaticUse(redirectionTarget);
+    registry.registerInstantiatedClass(
+        redirectionTarget.enclosingElement.declaration);
     if (isSymbolConstructor) {
-      compiler.backend.registerSymbolConstructor(mapping);
+      registry.registerSymbolConstructor();
     }
   }
 
   visitThrow(Throw node) {
-    compiler.backend.registerThrowExpression(mapping);
+    registry.registerThrowExpression();
     visit(node.expression);
   }
 
@@ -3034,39 +3030,38 @@
     final bool isSymbolConstructor = constructor == compiler.symbolConstructor;
     final bool isMirrorsUsedConstant =
         node.isConst && (constructor == compiler.mirrorsUsedConstructor);
-    resolveSelector(node.send, constructor);
+    Selector callSelector = resolveSelector(node.send, constructor);
     resolveArguments(node.send.argumentsNode);
-    useElement(node.send, constructor);
+    registry.useElement(node.send, constructor);
     if (Elements.isUnresolved(constructor)) return constructor;
-    Selector callSelector = mapping.getSelector(node.send);
     if (!callSelector.applies(constructor, compiler)) {
       warnArgumentMismatch(node.send, constructor);
-      compiler.backend.registerThrowNoSuchMethod(mapping);
+      registry.registerThrowNoSuchMethod();
     }
 
     // [constructor] might be the implementation element
     // and only declaration elements may be registered.
-    world.registerStaticUse(constructor.declaration);
+    registry.registerStaticUse(constructor.declaration);
     ClassElement cls = constructor.enclosingClass;
-    InterfaceType type = mapping.getType(node);
+    InterfaceType type = registry.getType(node);
     if (node.isConst && type.containsTypeVariables) {
       compiler.reportError(node.send.selector,
                            MessageKind.TYPE_VARIABLE_IN_CONSTANT);
     }
-    world.registerInstantiatedType(type, mapping);
+    registry.registerInstantiatedType(type);
     if (constructor.isFactoryConstructor && !type.typeArguments.isEmpty) {
-      world.registerFactoryWithTypeArguments(mapping);
+      registry.registerFactoryWithTypeArguments();
     }
     if (constructor.isGenerativeConstructor && cls.isAbstract) {
       warning(node, MessageKind.ABSTRACT_CLASS_INSTANTIATION);
-      compiler.backend.registerAbstractClassInstantiation(mapping);
+      registry.registerAbstractClassInstantiation();
     }
 
     if (isSymbolConstructor) {
       if (node.isConst) {
         Node argumentNode = node.send.arguments.head;
         Constant name = compiler.resolver.constantCompiler.compileNode(
-            argumentNode, mapping);
+            argumentNode, registry.mapping);
         if (!name.isString) {
           DartType type = name.computeType(compiler);
           compiler.reportError(argumentNode, MessageKind.STRING_EXPECTED,
@@ -3075,7 +3070,7 @@
           StringConstant stringConstant = name;
           String nameString = stringConstant.toDartString().slowToString();
           if (validateSymbol(argumentNode, nameString)) {
-            world.registerConstSymbol(nameString, mapping);
+            registry.registerConstSymbol(nameString);
           }
         }
       } else {
@@ -3085,10 +3080,10 @@
               node.newToken, MessageKind.NON_CONST_BLOAT,
               {'name': compiler.symbolClass.name});
         }
-        world.registerNewSymbol(mapping);
+        registry.registerNewSymbol();
       }
     } else if (isMirrorsUsedConstant) {
-      compiler.mirrorUsageAnalyzerTask.validate(node, mapping);
+      compiler.mirrorUsageAnalyzerTask.validate(node, registry.mapping);
     }
     if (node.isConst) {
       analyzeConstant(node);
@@ -3116,8 +3111,8 @@
 
   void analyzeConstant(Node node) {
     addDeferredAction(enclosingElement, () {
-      Constant constant =
-          compiler.resolver.constantCompiler.compileNode(node, mapping);
+      Constant constant = compiler.resolver.constantCompiler.compileNode(
+          node, registry.mapping);
 
       if (constant.isMap) {
         checkConstMapKeysDontOverrideEquals(node, constant);
@@ -3131,8 +3126,7 @@
         if (constant.isType) {
           TypeConstant typeConstant = constant;
           if (typeConstant.representedType is InterfaceType) {
-            world.registerInstantiatedType(typeConstant.representedType,
-                mapping);
+            registry.registerInstantiatedType(typeConstant.representedType);
           } else {
             compiler.reportError(node,
                 MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT);
@@ -3187,8 +3181,8 @@
         deferredIsMalformed: deferredIsMalformed);
     if (type == null) return null;
     if (inCheckContext) {
-      compiler.enqueuer.resolution.registerIsCheck(type, mapping);
-      compiler.backend.registerRequiredType(type, enclosingElement);
+      registry.registerIsCheck(type);
+      registry.registerRequiredType(type, enclosingElement);
     }
     return type;
   }
@@ -3228,9 +3222,9 @@
       compiler.listClass.computeType(compiler);
       listType = compiler.listClass.rawType;
     }
-    mapping.setType(node, listType);
-    world.registerInstantiatedType(listType, mapping);
-    compiler.backend.registerRequiredType(listType, enclosingElement);
+    registry.setType(node, listType);
+    registry.registerInstantiatedType(listType);
+    registry.registerRequiredType(listType, enclosingElement);
     visit(node.elements);
     if (node.isConst) {
       analyzeConstant(node);
@@ -3246,8 +3240,8 @@
   }
 
   visitStringInterpolation(StringInterpolation node) {
-    world.registerInstantiatedClass(compiler.stringClass, mapping);
-    compiler.backend.registerStringInterpolation(mapping);
+    registry.registerInstantiatedClass(compiler.stringClass);
+    registry.registerStringInterpolation();
     node.visitChildren(this);
   }
 
@@ -3278,15 +3272,14 @@
         return;
       }
       label.setBreakTarget();
-      mapping[node.target] = label;
+      registry.useLabel(node, label);
     }
-    if (mapping[node] != null) {
-      // TODO(ahe): I'm not sure why this node already has an element
-      // that is different from target.  I will talk to Lasse and
-      // figure out what is going on.
-      mapping.remove(node);
+    if (registry.getTargetDefinition(node) != null) {
+      // This is need for code like `L: break L;` where the definition and
+      // target are the same node.
+      registry.undefineTarget(node);
     }
-    mapping[node] = target;
+    registry.registerTargetOf(node, target);
   }
 
   visitContinueStatement(ContinueStatement node) {
@@ -3310,24 +3303,24 @@
         error(node.target, MessageKind.INVALID_CONTINUE);
       }
       label.setContinueTarget();
-      mapping[node.target] = label;
+      registry.useLabel(node, label);
     }
-    mapping[node] = target;
+    registry.registerTargetOf(node, target);
   }
 
   registerImplicitInvocation(String name, int arity) {
     Selector selector = new Selector.call(name, null, arity);
-    world.registerDynamicInvocation(selector);
+    registry.registerDynamicInvocation(selector);
   }
 
   visitForIn(ForIn node) {
     LibraryElement library = enclosingElement.library;
-    mapping.setIteratorSelector(node, compiler.iteratorSelector);
-    world.registerDynamicGetter(compiler.iteratorSelector);
-    mapping.setCurrentSelector(node, compiler.currentSelector);
-    world.registerDynamicGetter(compiler.currentSelector);
-    mapping.setMoveNextSelector(node, compiler.moveNextSelector);
-    world.registerDynamicInvocation(compiler.moveNextSelector);
+    registry.setIteratorSelector(node, compiler.iteratorSelector);
+    registry.registerDynamicGetter(compiler.iteratorSelector);
+    registry.setCurrentSelector(node, compiler.currentSelector);
+    registry.registerDynamicGetter(compiler.currentSelector);
+    registry.setMoveNextSelector(node, compiler.moveNextSelector);
+    registry.registerDynamicInvocation(compiler.moveNextSelector);
 
     visit(node.expression);
     Scope blockScope = new BlockScope(scope);
@@ -3344,7 +3337,7 @@
     Element loopVariable;
     Selector loopVariableSelector;
     if (send != null) {
-      loopVariable = mapping[send];
+      loopVariable = registry.getDefinition(send);
       Identifier identifier = send.selector.asIdentifier();
       if (identifier == null) {
         compiler.reportError(send.selector, MessageKind.INVALID_FOR_IN);
@@ -3365,13 +3358,13 @@
         compiler.reportError(first, MessageKind.INVALID_FOR_IN);
       } else {
         loopVariableSelector = new Selector.setter(identifier.source, library);
-        loopVariable = mapping[identifier];
+        loopVariable = registry.getDefinition(identifier);
       }
     } else {
       compiler.reportError(declaration, MessageKind.INVALID_FOR_IN);
     }
     if (loopVariableSelector != null) {
-      mapping.setSelector(declaration, loopVariableSelector);
+      registry.setSelector(declaration, loopVariableSelector);
       registerSend(loopVariableSelector, loopVariable);
     } else {
       // The selector may only be null if we reported an error.
@@ -3379,7 +3372,7 @@
     }
     if (loopVariable != null) {
       // loopVariable may be null if it could not be resolved.
-      mapping[declaration] = loopVariable;
+      registry.defineElement(declaration, loopVariable);
     }
     visitLoopBodyIn(node, node.body, blockScope);
   }
@@ -3390,7 +3383,7 @@
 
   visitLabeledStatement(LabeledStatement node) {
     Statement body = node.statement;
-    TargetElement targetElement = getOrCreateTargetElement(body);
+    TargetElement targetElement = getOrDefineTarget(body);
     Map<String, LabelElement> labelElements = <String, LabelElement>{};
     for (Label label in node.labels) {
       String labelName = label.labelName;
@@ -3403,16 +3396,17 @@
     statementScope.exitLabelScope();
     labelElements.forEach((String labelName, LabelElement element) {
       if (element.isTarget) {
-        mapping[element.label] = element;
+        registry.defineLabel(element.label, element);
       } else {
         warning(element.label, MessageKind.UNUSED_LABEL,
                 {'labelName': labelName});
       }
     });
-    if (!targetElement.isTarget && identical(mapping[body], targetElement)) {
+    if (!targetElement.isTarget &&
+        registry.getTargetOf(body) == targetElement) {
       // If the body is itself a break or continue for another target, it
       // might have updated its mapping to the target it actually does target.
-      mapping.remove(body);
+      registry.undefineTarget(body);
     }
   }
 
@@ -3454,12 +3448,12 @@
       compiler.reportError(arguments,
           MessageKind.TYPE_VARIABLE_IN_CONSTANT);
     }
-    mapping.setType(node, mapType);
-    world.registerInstantiatedType(mapType, mapping);
+    registry.setType(node, mapType);
+    registry.registerInstantiatedType(mapType);
     if (node.isConst) {
-      compiler.backend.registerConstantMap(mapping);
+      registry.registerConstantMap();
     }
-    compiler.backend.registerRequiredType(mapType, enclosingElement);
+    registry.registerRequiredType(mapType, enclosingElement);
     node.visitChildren(this);
     if (node.isConst) {
       analyzeConstant(node);
@@ -3495,7 +3489,7 @@
   }
 
   void checkCaseExpressions(SwitchStatement node) {
-    TargetElement breakElement = getOrCreateTargetElement(node);
+    TargetElement breakElement = getOrDefineTarget(node);
     Map<String, LabelElement> continueLabels = <String, LabelElement>{};
 
     Link<Node> cases = node.cases.nodes;
@@ -3514,7 +3508,7 @@
         if (caseMatch == null) continue;
 
         // Analyze the constant.
-        Constant constant = mapping.getConstant(caseMatch.expression);
+        Constant constant = registry.getConstant(caseMatch.expression);
         assert(invariant(node, constant != null,
             message: 'No constant computed for $node'));
 
@@ -3564,7 +3558,7 @@
   visitSwitchStatement(SwitchStatement node) {
     node.expression.accept(this);
 
-    TargetElement breakElement = getOrCreateTargetElement(node);
+    TargetElement breakElement = getOrDefineTarget(node);
     Map<String, LabelElement> continueLabels = <String, LabelElement>{};
     Link<Node> cases = node.cases.nodes;
     while (!cases.isEmpty) {
@@ -3600,9 +3594,9 @@
           }
         }
 
-        TargetElement targetElement = getOrCreateTargetElement(switchCase);
+        TargetElement targetElement = getOrDefineTarget(switchCase);
         LabelElement labelElement = targetElement.addLabel(label, labelName);
-        mapping[label] = labelElement;
+        registry.defineLabel(label, labelElement);
         continueLabels[labelName] = labelElement;
       }
       cases = cases.tail;
@@ -3625,13 +3619,13 @@
       if (!label.isContinueTarget) {
         TargetElement targetElement = label.target;
         SwitchCase switchCase = targetElement.statement;
-        mapping.remove(switchCase);
-        mapping.remove(label.label);
+        registry.undefineTarget(switchCase);
+        registry.undefineLabel(label.label);
       }
     });
     // TODO(15575): We should warn if we can detect a fall through
     // error.
-    compiler.backend.registerFallThroughError(mapping);
+    registry.registerFallThroughError();
   }
 
   visitSwitchCase(SwitchCase node) {
@@ -3653,7 +3647,7 @@
   }
 
   visitCatchBlock(CatchBlock node) {
-    compiler.backend.registerCatchStatement(world, mapping);
+    registry.registerCatchStatement();
     // Check that if catch part is present, then
     // it has one or two formal parameters.
     VariableDefinitions exceptionDefinition;
@@ -3673,7 +3667,7 @@
               error(extra, MessageKind.EXTRA_CATCH_DECLARATION);
             }
           }
-          compiler.backend.registerStackTraceInCatch(mapping);
+          registry.registerStackTraceInCatch();
         }
       }
 
@@ -3709,15 +3703,17 @@
     inCatchBlock = oldInCatchBlock;
 
     if (node.type != null && exceptionDefinition != null) {
-      DartType exceptionType = mapping.getType(node.type);
+      DartType exceptionType = registry.getType(node.type);
       Node exceptionVariable = exceptionDefinition.definitions.nodes.head;
-      VariableElementX exceptionElement = mapping[exceptionVariable];
+      VariableElementX exceptionElement =
+          registry.getDefinition(exceptionVariable);
       exceptionElement.variables.type = exceptionType;
     }
     if (stackTraceDefinition != null) {
       Node stackTraceVariable = stackTraceDefinition.definitions.nodes.head;
-      VariableElementX stackTraceElement = mapping[stackTraceVariable];
-      world.registerInstantiatedClass(compiler.stackTraceClass, mapping);
+      VariableElementX stackTraceElement =
+          registry.getDefinition(stackTraceVariable);
+      registry.registerInstantiatedClass(compiler.stackTraceClass);
       stackTraceElement.variables.type = compiler.stackTraceClass.rawType;
     }
   }
@@ -3734,10 +3730,10 @@
 
   TypeDefinitionVisitor(Compiler compiler,
                         TypeDeclarationElement element,
-                        TreeElementMapping mapping)
+                        ResolutionRegistry registry)
       : this.enclosingElement = element,
         scope = Scope.buildEnclosingScope(element),
-        super(compiler, mapping);
+        super(compiler, registry);
 
   DartType get objectType => compiler.objectClass.rawType;
 
@@ -3752,7 +3748,7 @@
       TypeVariableType typeVariable = typeLink.head;
       String typeName = typeVariable.name;
       TypeVariable typeNode = nodeLink.head;
-      useType(typeNode, typeVariable);
+      registry.useType(typeNode, typeVariable);
       if (nameSet.contains(typeName)) {
         error(typeNode, MessageKind.DUPLICATE_TYPE_VARIABLE_NAME,
               {'typeVariableName': typeName});
@@ -3801,8 +3797,8 @@
 
   TypedefResolverVisitor(Compiler compiler,
                          TypedefElement typedefElement,
-                         TreeElementMapping mapping)
-      : super(compiler, typedefElement, mapping);
+                         ResolutionRegistry registry)
+      : super(compiler, typedefElement, registry);
 
   visitTypedef(Typedef node) {
     TypedefType type = element.computeType(compiler);
@@ -3810,7 +3806,7 @@
     resolveTypeVariableBounds(node.typeParameters);
 
     FunctionSignature signature = SignatureResolver.analyze(
-        compiler, node.formals, node.returnType, element, mapping,
+        compiler, node.formals, node.returnType, element, registry,
         defaultValuesError: MessageKind.TYPEDEF_FORMAL_WITH_DEFAULT);
     element.functionSignature = signature;
 
@@ -3933,8 +3929,8 @@
 
   ClassResolverVisitor(Compiler compiler,
                        ClassElement classElement,
-                       TreeElementMapping mapping)
-    : super(compiler, classElement, mapping);
+                       ResolutionRegistry registry)
+    : super(compiler, classElement, registry);
 
   DartType visitClassNode(ClassNode node) {
     invariant(node, element != null);
@@ -3970,7 +3966,7 @@
     // of Object - the JavaScript backend chooses between Object and
     // Interceptor.
     if (element.supertype == null) {
-      ClassElement superElement = compiler.backend.defaultSuperclass(element);
+      ClassElement superElement = registry.defaultSuperclass(element);
       // Avoid making the superclass (usually Object) extend itself.
       if (element != superElement) {
         if (superElement == null) {
@@ -4000,7 +3996,7 @@
         compiler.reportError(node, kind, arguments);
         superMember = new ErroneousElementX(
             kind, arguments, '', element);
-        compiler.backend.registerThrowNoSuchMethod(mapping);
+        registry.registerThrowNoSuchMethod();
       } else {
         Selector callToMatch = new Selector.call("", element.library, 0);
         if (!callToMatch.applies(superMember, compiler)) {
@@ -4193,7 +4189,7 @@
       previous = current;
       current = currentMixinApplication.mixin;
     }
-    compiler.world.registerMixinUse(mixinApplication, mixin);
+    registry.registerMixinUse(mixinApplication, mixin);
     return mixinType;
   }
 
@@ -4430,6 +4426,8 @@
       : super(compiler) {
   }
 
+  ResolutionRegistry get registry => resolver.registry;
+
   Identifier visitSendSet(SendSet node) {
     assert(node.arguments.tail.isEmpty); // Sanity check
     Identifier identifier = node.selector;
@@ -4447,8 +4445,7 @@
 
   Identifier visitIdentifier(Identifier node) {
     // The variable is initialized to null.
-    resolver.world.registerInstantiatedClass(compiler.nullClass,
-                                             resolver.mapping);
+    registry.registerInstantiatedClass(compiler.nullClass);
     if (definitions.modifiers.isConst) {
       compiler.reportError(node, MessageKind.CONST_WITHOUT_INITIALIZER);
     }
@@ -4484,6 +4481,8 @@
                       {bool this.inConstContext: false})
       : super(compiler);
 
+  ResolutionRegistry get registry => resolver.registry;
+
   visitNode(Node node) {
     throw 'not supported';
   }
@@ -4492,9 +4491,9 @@
                                String targetName, MessageKind kind,
                                Map arguments) {
     if (kind == MessageKind.CANNOT_FIND_CONSTRUCTOR) {
-      compiler.backend.registerThrowNoSuchMethod(resolver.mapping);
+      registry.registerThrowNoSuchMethod();
     } else {
-      compiler.backend.registerThrowRuntimeError(resolver.mapping);
+      registry.registerThrowRuntimeError();
     }
     if (inConstContext) {
       compiler.reportError(diagnosticNode, kind, arguments);
@@ -4573,7 +4572,7 @@
         type = element.enclosingClass.rawType;
       }
     }
-    resolver.mapping.setType(expression, type);
+    resolver.registry.setType(expression, type);
     return element;
   }
 
@@ -4584,7 +4583,7 @@
     type = resolver.resolveTypeAnnotation(node,
                                           malformedIsError: inConstContext,
                                           deferredIsMalformed: false);
-    compiler.backend.registerRequiredType(type, resolver.enclosingElement);
+    registry.registerRequiredType(type, resolver.enclosingElement);
     return type.element;
   }
 
@@ -4623,7 +4622,7 @@
     String name = node.source;
     Element element = resolver.reportLookupErrorIfAny(
         lookupInScope(compiler, node, resolver.scope, name), node, name);
-    resolver.useElement(node, element);
+    registry.useElement(node, element);
     // TODO(johnniwinther): Change errors to warnings, cf. 11.11.1.
     if (element == null) {
       return failOrReturnErroneousElement(resolver.enclosingElement, node, name,
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/registry.dart b/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
new file mode 100644
index 0000000..01ef096
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
@@ -0,0 +1,332 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 resolution;
+
+/// [ResolutionRegistry] collects all resolution information. It stores node
+/// related information in a [TreeElements] mapping and registers calls with
+/// [Backend], [World] and [Enqueuer].
+// TODO(johnniwinther): Split this into an interface and implementation class.
+class ResolutionRegistry {
+  final Compiler compiler;
+  final TreeElementMapping mapping;
+
+  ResolutionRegistry(Compiler compiler, Element element)
+      : this.internal(compiler, _ensureTreeElements(element));
+
+  ResolutionRegistry.internal(this.compiler, this.mapping);
+
+  Element get currentElement => mapping.currentElement;
+
+  ResolutionEnqueuer get world => compiler.enqueuer.resolution;
+
+  World get universe => compiler.world;
+
+  Backend get backend => compiler.backend;
+
+  //////////////////////////////////////////////////////////////////////////////
+  //  Node-to-Element mapping functionality.
+  //////////////////////////////////////////////////////////////////////////////
+
+  /// Register [node] as a reference to [element].
+  Element useElement(Node node, Element element) {
+    if (element == null) return null;
+    return mapping[node] = element;
+  }
+
+  /// Register [node] as a declaration of [element].
+  void defineElement(Node node, Element element) {
+    mapping[node] = element;
+  }
+
+  /// Unregister the element declared by [node].
+  // TODO(johnniwinther): Try to remove this.
+  void undefineElement(Node node) {
+    mapping.remove(node);
+  }
+
+  /// Returns the [Element] defined by [node].
+  Element getDefinition(Node node) {
+    return mapping[node];
+  }
+
+  //////////////////////////////////////////////////////////////////////////////
+  //  Node-to-Selector mapping functionality.
+  //////////////////////////////////////////////////////////////////////////////
+
+  void setSelector(Node node, Selector selector) {
+    mapping.setSelector(node, selector);
+  }
+
+  Selector getSelector(Node node) => mapping.getSelector(node);
+
+  void setGetterSelectorInComplexSendSet(SendSet node, Selector selector) {
+    mapping.setGetterSelectorInComplexSendSet(node, selector);
+  }
+
+  void setOperatorSelectorInComplexSendSet(SendSet node, Selector selector) {
+    mapping.setOperatorSelectorInComplexSendSet(node, selector);
+  }
+
+  void setIteratorSelector(ForIn node, Selector selector) {
+    mapping.setIteratorSelector(node, selector);
+  }
+
+  void setMoveNextSelector(ForIn node, Selector selector) {
+    mapping.setMoveNextSelector(node, selector);
+  }
+
+  void setCurrentSelector(ForIn node, Selector selector) {
+    mapping.setCurrentSelector(node, selector);
+  }
+
+  //////////////////////////////////////////////////////////////////////////////
+  //  Node-to-Type mapping functionality.
+  //////////////////////////////////////////////////////////////////////////////
+
+  DartType useType(Node annotation, DartType type) {
+    if (type != null) {
+      mapping.setType(annotation, type);
+      useElement(annotation, type.element);
+    }
+    return type;
+  }
+
+  void setType(Node node, DartType type) => mapping.setType(node, type);
+
+  DartType getType(Node node) => mapping.getType(node);
+
+  //////////////////////////////////////////////////////////////////////////////
+  //  Node-to-Constant mapping functionality.
+  //////////////////////////////////////////////////////////////////////////////
+
+  Constant getConstant(Node node) => mapping.getConstant(node);
+
+  //////////////////////////////////////////////////////////////////////////////
+  //  Target/Label functionality.
+  //////////////////////////////////////////////////////////////////////////////
+
+  /// Register [node] to be the declaration of [label].
+  void defineLabel(Label node, LabelElement label) {
+    defineElement(node, label);
+  }
+
+  /// Undefine the label of [node].
+  /// This is used to cleanup and detect unused labels.
+  void undefineLabel(Label node) {
+    undefineElement(node);
+  }
+
+  /// Register the target of [node] as reference to [label].
+  void useLabel(GotoStatement node, LabelElement label) {
+    mapping[node.target] = label;
+  }
+
+  /// Register [node] to be the declaration of [target].
+  void defineTarget(Node node, TargetElement target) {
+    assert(invariant(node, node is Statement || node is SwitchCase,
+        message: "Only statements and switch cases can define targets."));
+    defineElement(node, target);
+  }
+
+  /// Returns the [TargetElement] defined by [node].
+  TargetElement getTargetDefinition(Node node) {
+    assert(invariant(node, node is Statement || node is SwitchCase,
+        message: "Only statements and switch cases can define targets."));
+    return getDefinition(node);
+  }
+
+  /// Undefine the target of [node]. This is used to cleanup unused targets.
+  void undefineTarget(Node node) {
+    assert(invariant(node, node is Statement || node is SwitchCase,
+        message: "Only statements and switch cases can define targets."));
+    undefineElement(node);
+  }
+
+  /// Register the target of [node] to be [target].
+  void registerTargetOf(GotoStatement node, TargetElement target) {
+    mapping[node] = target;
+  }
+
+  /// Returns the target of [node].
+  // TODO(johnniwinther): Change [Node] to [GotoStatement] when we store
+  // target def and use in separate locations.
+  TargetElement getTargetOf(Node node) {
+    return mapping[node];
+  }
+
+  //////////////////////////////////////////////////////////////////////////////
+  //  Potential access registration.
+  //////////////////////////////////////////////////////////////////////////////
+
+  void setAccessedByClosureIn(Node contextNode, VariableElement element,
+                              Node accessNode) {
+    mapping.setAccessedByClosureIn(contextNode, element, accessNode);
+  }
+
+  void registerPotentialMutation(VariableElement element, Node mutationNode) {
+    mapping.registerPotentialMutation(element, mutationNode);
+  }
+
+  void registerPotentialMutationInClosure(VariableElement element,
+                                           Node mutationNode) {
+    mapping.registerPotentialMutationInClosure(element, mutationNode);
+  }
+
+  void registerPotentialMutationIn(Node contextNode, VariableElement element,
+                                    Node mutationNode) {
+    mapping.registerPotentialMutationIn(contextNode, element, mutationNode);
+  }
+
+  //////////////////////////////////////////////////////////////////////////////
+  //  Various Backend/Enqueuer/World registration.
+  //////////////////////////////////////////////////////////////////////////////
+
+  void registerStaticUse(Element element) {
+    world.registerStaticUse(element);
+  }
+
+  void registerImplicitSuperCall(FunctionElement superConstructor) {
+    universe.registerImplicitSuperCall(mapping, superConstructor);
+  }
+
+  void registerInstantiatedClass(ClassElement element) {
+    world.registerInstantiatedClass(element, mapping);
+  }
+
+  void registerLazyField() {
+    backend.registerLazyField(mapping);
+  }
+
+  void registerMetadataConstant(Constant constant) {
+    backend.registerMetadataConstant(constant, mapping);
+  }
+
+  void registerThrowRuntimeError() {
+    backend.registerThrowRuntimeError(mapping);
+  }
+
+  void registerTypeVariableBoundCheck() {
+    backend.registerTypeVariableBoundCheck(mapping);
+  }
+
+  void registerThrowNoSuchMethod() {
+    backend.registerThrowNoSuchMethod(mapping);
+  }
+
+  void registerIsCheck(DartType type) {
+    world.registerIsCheck(type, mapping);
+  }
+
+  void registerAsCheck(DartType type) {
+    world.registerAsCheck(type, mapping);
+  }
+
+  void registerClosure(Element element) {
+    world.registerClosure(element, mapping);
+  }
+
+  void registerSuperUse(Node node) {
+    mapping.superUses.add(node);
+  }
+
+  void registerDynamicInvocation(Selector selector) {
+    world.registerDynamicInvocation(selector);
+  }
+
+  void registerSuperNoSuchMethod() {
+    backend.registerSuperNoSuchMethod(mapping);
+  }
+
+  void registerClassUsingVariableExpression(ClassElement element) {
+    backend.registerClassUsingVariableExpression(element);
+  }
+
+  void registerTypeVariableExpression() {
+    backend.registerTypeVariableExpression(mapping);
+  }
+
+  void registerTypeLiteral(Element element) {
+    world.registerTypeLiteral(element, mapping);
+  }
+
+  // TODO(johnniwinther): Remove the [ResolverVisitor] dependency. Its only
+  // needed to lookup types in the current scope.
+  void registerJsCall(Node node, ResolverVisitor visitor) {
+    world.registerJsCall(node, visitor);
+  }
+
+  void registerGetOfStaticFunction(FunctionElement element) {
+    world.registerGetOfStaticFunction(element);
+  }
+
+  void registerDynamicGetter(Selector selector) {
+    world.registerDynamicGetter(selector);
+  }
+
+  void registerDynamicSetter(Selector selector) {
+    world.registerDynamicSetter(selector);
+  }
+
+  void registerConstSymbol(String name) {
+    world.registerConstSymbol(name, mapping);
+  }
+
+  void registerSymbolConstructor() {
+    backend.registerSymbolConstructor(mapping);
+  }
+
+  void registerInstantiatedType(InterfaceType type) {
+    world.registerInstantiatedType(type, mapping);
+  }
+
+  void registerFactoryWithTypeArguments() {
+    world.registerFactoryWithTypeArguments(mapping);
+  }
+
+  void registerAbstractClassInstantiation() {
+    backend.registerAbstractClassInstantiation(mapping);
+  }
+
+  void registerNewSymbol() {
+    world.registerNewSymbol(mapping);
+  }
+
+  void registerRequiredType(DartType type, Element enclosingElement) {
+    backend.registerRequiredType(type, enclosingElement);
+  }
+
+  void registerStringInterpolation() {
+    backend.registerStringInterpolation(mapping);
+  }
+
+  void registerConstantMap() {
+    backend.registerConstantMap(mapping);
+  }
+
+  void registerFallThroughError() {
+    backend.registerFallThroughError(mapping);
+  }
+
+  void registerCatchStatement() {
+    backend.registerCatchStatement(world, mapping);
+  }
+
+  void registerStackTraceInCatch() {
+    backend.registerStackTraceInCatch(mapping);
+  }
+
+  ClassElement defaultSuperclass(ClassElement element) {
+    return backend.defaultSuperclass(element);
+  }
+
+  void registerMixinUse(MixinApplicationElement mixinApplication,
+                        ClassElement mixin) {
+    universe.registerMixinUse(mixinApplication, mixin);
+  }
+
+  void registerThrowExpression() {
+    backend.registerThrowExpression(mapping);
+  }
+}
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart b/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
index 975d897..1c06c20 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/resolution.dart
@@ -38,5 +38,6 @@
 import '../dart_backend/dart_backend.dart' show DartBackend;
 
 part 'members.dart';
+part 'registry.dart';
 part 'scope.dart';
 part 'signatures.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
index 22b7a8b..7467418 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
@@ -20,13 +20,13 @@
 
   SignatureResolver(Compiler compiler,
                     Element enclosingElement,
-                    TreeElementMapping treeElements,
+                    ResolutionRegistry registry,
                     {this.defaultValuesError})
       : this.enclosingElement = enclosingElement,
         this.scope = enclosingElement.buildScope(),
         this.resolver =
-            new ResolverVisitor(compiler, enclosingElement, treeElements),
-        super(compiler, treeElements);
+            new ResolverVisitor(compiler, enclosingElement, registry),
+        super(compiler, registry);
 
   bool get defaultValuesAllowed => defaultValuesError == null;
 
@@ -90,7 +90,7 @@
     void computeFunctionType(FunctionExpression functionExpression) {
       FunctionSignature functionSignature = SignatureResolver.analyze(
           compiler, functionExpression.parameters,
-          functionExpression.returnType, element, mapping,
+          functionExpression.returnType, element, registry,
           defaultValuesError: MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT);
       element.functionSignatureCache = functionSignature;
       element.typeCache = functionSignature.type;
@@ -244,10 +244,10 @@
                                    NodeList formalParameters,
                                    Node returnNode,
                                    Element element,
-                                   TreeElementMapping mapping,
+                                   ResolutionRegistry registry,
                                    {MessageKind defaultValuesError}) {
     SignatureResolver visitor = new SignatureResolver(compiler, element,
-        mapping, defaultValuesError: defaultValuesError);
+        registry, defaultValuesError: defaultValuesError);
     Link<Element> parameters = const Link<Element>();
     int requiredParameterCount = 0;
     if (formalParameters == null) {
@@ -274,7 +274,7 @@
       // Because there is no type annotation for the return type of
       // this element, we explicitly add one.
       if (compiler.enableTypeAssertions) {
-        compiler.enqueuer.resolution.registerIsCheck(returnType, mapping);
+        registry.registerIsCheck(returnType);
       }
     } else {
       returnType = visitor.resolveReturnType(returnNode);
diff --git a/sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart b/sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart
index c7c1a32..d995f44 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/prettyprint.dart
@@ -286,7 +286,7 @@
 
   visitNodeList(NodeList node) {
     var params = { "delimiter" : node.delimiter };
-    if (node.nodes.toList().length == 0) {
+    if (node.isEmpty) {
       openAndCloseNode(node, "NodeList", params);
     } else {
       openNode(node, "NodeList", params);
diff --git a/sdk/lib/_internal/compiler/implementation/util/command_line.dart b/sdk/lib/_internal/compiler/implementation/util/command_line.dart
new file mode 100644
index 0000000..1a938cd
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/util/command_line.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.
+
+library dart2js.util.command_line;
+
+/// The accepted escapes in the input of the --batch processor.
+///
+/// Contrary to Dart strings it does not contain hex escapes (\u or \x).
+Map<String, String> ESCAPE_MAPPING =
+    const {
+      "n": "\n",
+      "r": "\r",
+      "t": "\t",
+      "b": "\b",
+      "f": "\f",
+      "v": "\v",
+      "\\": "\\",
+    };
+
+/// Splits the line similar to how a shell would split arguments.
+///
+/// Example:
+///
+///     splitline("""--args "ab"c 'with " \'spaces'""").forEach(print);
+///     // --args
+///     // abc
+///     // with " 'spaces
+List<String> splitLine(String line) {
+  List<String> result = <String>[];
+  bool inQuotes = false;
+  String openingQuote;
+  StringBuffer buffer = new StringBuffer();
+  for (int i = 0; i < line.length; i++) {
+    String c = line[i];
+    if (inQuotes && c == openingQuote) {
+      inQuotes = false;
+      continue;
+    }
+    if (!inQuotes && (c == "'" || c == '"')) {
+      inQuotes = true;
+      openingQuote = c;
+      continue;
+    }
+    if (c == '\\') {
+      if (i == line.length - 1) {
+        throw new FormatException("Unfinished escape: $line");
+      }
+      i++;
+
+      c = line[i];
+      String mapped = ESCAPE_MAPPING[c];
+      if (mapped == null) mapped = c;
+      buffer.write(mapped);
+      continue;
+    }
+    if (!inQuotes && c == " ") {
+      if (buffer.isNotEmpty) result.add(buffer.toString());
+      buffer.clear();
+      continue;
+    }
+    buffer.write(c);
+  }
+  if (inQuotes) throw new FormatException("Unclosed quotes: $line");
+  if (buffer.isNotEmpty) result.add(buffer.toString());
+  return result;
+}
+
diff --git a/sdk/lib/_internal/compiler/implementation/util/setlet.dart b/sdk/lib/_internal/compiler/implementation/util/setlet.dart
index 0d4571b..10c0224 100644
--- a/sdk/lib/_internal/compiler/implementation/util/setlet.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/setlet.dart
@@ -249,6 +249,20 @@
 
   Setlet<E> difference(Set<E> other) =>
       new Setlet<E>.from(this.where((e) => !other.contains(e)));
+
+  Setlet<E> toSet() {
+    Setlet<E> result = new Setlet<E>();
+    if (_extra == null) {
+      result._contents = _contents;
+    } else if (_extra == _MARKER) {
+      result._extra = _MARKER;
+      result._contents = _contents.toSet();
+    } else {
+      result._extra = _extra;
+      result._contents = _contents.toList();
+    }
+    return result;
+  }
 }
 
 class _SetletMarker {
diff --git a/sdk/lib/_internal/lib/collection_patch.dart b/sdk/lib/_internal/lib/collection_patch.dart
index 463fab9..0c19fdb 100644
--- a/sdk/lib/_internal/lib/collection_patch.dart
+++ b/sdk/lib/_internal/lib/collection_patch.dart
@@ -1126,24 +1126,6 @@
     return true;
   }
 
-  void removeAll(Iterable<Object> objectsToRemove) {
-    for (var each in objectsToRemove) {
-      remove(each);
-    }
-  }
-
-  void retainAll(Iterable<Object> elements) {
-    super._retainAll(elements, (o) => o is E);
-  }
-
-  void removeWhere(bool test(E element)) {
-    removeAll(_computeElements().where(test));
-  }
-
-  void retainWhere(bool test(E element)) {
-    removeAll(_computeElements().where((E element) => !test(element)));
-  }
-
   void clear() {
     if (_length > 0) {
       _strings = _nums = _rest = _elements = null;
@@ -1347,25 +1329,6 @@
     if (!_validKey(object)) return false;
     return super._remove(object);
   }
-
-  bool containsAll(Iterable<Object> elements) {
-    for (Object element in elements) {
-      if (!_validKey(element) || !this.contains(element)) return false;
-    }
-    return true;
-  }
-
-  void removeAll(Iterable<Object> elements) {
-    for (Object element in elements) {
-      if (_validKey(element)) {
-        super._remove(element);
-      }
-    }
-  }
-
-  void retainAll(Iterable<Object> elements) {
-    super._retainAll(elements, _validKey);
-  }
 }
 
 // TODO(kasperl): Share this code with HashMapKeyIterator<E>?
@@ -1568,12 +1531,6 @@
     return true;
   }
 
-  void addAll(Iterable<E> objects) {
-    for (E object in objects) {
-      add(object);
-    }
-  }
-
   bool remove(Object object) {
     if (_isStringElement(object)) {
       return _removeHashTableEntry(_strings, object);
@@ -1597,16 +1554,6 @@
     return true;
   }
 
-  void removeAll(Iterable objectsToRemove) {
-    for (var each in objectsToRemove) {
-      remove(each);
-    }
-  }
-
-  void retainAll(Iterable<Object> elements) {
-    super._retainAll(elements, (o) => o is E);
-  }
-
   void removeWhere(bool test(E element)) {
     _filterWhere(test, true);
   }
@@ -1839,10 +1786,6 @@
       }
     }
   }
-
-  void retainAll(Iterable<Object> elements) {
-    super._retainAll(elements, _validKey);
-  }
 }
 
 class LinkedHashSetCell {
diff --git a/sdk/lib/_internal/lib/isolate_helper.dart b/sdk/lib/_internal/lib/isolate_helper.dart
index 0a6bcb7..cfb0a96 100644
--- a/sdk/lib/_internal/lib/isolate_helper.dart
+++ b/sdk/lib/_internal/lib/isolate_helper.dart
@@ -956,6 +956,8 @@
       throw new UnsupportedError(
           "Currently spawnUri is not supported without web workers.");
     }
+    message = _serializeMessage(message);
+    args = _serializeMessage(args);  // Or just args.toList() ?
     _globalState.topEventLoop.enqueue(new _IsolateContext(), () {
       final func = _getJSFunctionFromName(functionName);
       _startIsolate(func, args, message, isSpawnUri, startPaused, replyPort);
diff --git a/sdk/lib/_internal/lib/js_array.dart b/sdk/lib/_internal/lib/js_array.dart
index 730d063..42ee248 100644
--- a/sdk/lib/_internal/lib/js_array.dart
+++ b/sdk/lib/_internal/lib/js_array.dart
@@ -326,7 +326,7 @@
 
   bool get isNotEmpty => !isEmpty;
 
-  String toString() => IterableMixinWorkaround.toStringIterable(this, '[', ']');
+  String toString() => ListBase.listToString(this);
 
   List<E> toList({ bool growable: true }) {
     if (growable) {
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index 2592a72..d4c7fa4 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -108,10 +108,6 @@
       "because it is not included in a @MirrorsUsed annotation.");
 }
 
-bool hasReflectableProperty(var jsFunction) {
-  return JS('bool', '# in #', JS_GET_NAME("REFLECTABLE"), jsFunction);
-}
-
 class JSInvocationMirror implements Invocation {
   static const METHOD = 0;
   static const GETTER = 1;
@@ -217,14 +213,6 @@
       isCatchAll = true;
     }
     if (JS('bool', 'typeof # == "function"', method)) {
-      // TODO(floitsch): bound or tear-off closure does not guarantee that the
-      // function is reflectable.
-      bool isReflectable = hasReflectableProperty(method) ||
-          object is BoundClosure ||
-          object is TearOffClosure;
-      if (!isReflectable) {
-        throwInvalidReflectionError(_symbol_dev.Symbol.getName(memberName));
-      }
       if (isCatchAll) {
         return new CachedCatchAllInvocation(
             name, method, isIntercepted, interceptor);
diff --git a/sdk/lib/_internal/lib/js_mirrors.dart b/sdk/lib/_internal/lib/js_mirrors.dart
index fdf7393..dca0d98 100644
--- a/sdk/lib/_internal/lib/js_mirrors.dart
+++ b/sdk/lib/_internal/lib/js_mirrors.dart
@@ -22,6 +22,7 @@
 
 import 'dart:_js_helper' show
     BoundClosure,
+    CachedInvocation,
     Closure,
     JSInvocationMirror,
     JsCache,
@@ -29,6 +30,7 @@
     Primitives,
     ReflectionInfo,
     RuntimeError,
+    TearOffClosure,
     TypeVariable,
     UnimplementedNoSuchMethodError,
     createRuntimeType,
@@ -36,7 +38,6 @@
     getMangledTypeName,
     getMetadata,
     getRuntimeType,
-    hasReflectableProperty,
     runtimeTypeToString,
     setRuntimeTypeInfo,
     throwInvalidReflectionError;
@@ -51,6 +52,10 @@
 
 const String METHODS_WITH_OPTIONAL_ARGUMENTS = r'$methodsWithOptionalArguments';
 
+bool hasReflectableProperty(var jsFunction) {
+  return JS('bool', '# in #', JS_GET_NAME("REFLECTABLE"), jsFunction);
+}
+
 /// No-op method that is called to inform the compiler that tree-shaking needs
 /// to be disabled.
 disableTreeShaking() => preserveNames();
@@ -941,6 +946,13 @@
     return cacheEntry;
   }
 
+  bool _isReflectable(CachedInvocation cachedInvocation) {
+    // TODO(floitsch): tear-off closure does not guarantee that the
+    // function is reflectable.
+    var method = cachedInvocation.jsFunction;
+    return hasReflectableProperty(method) || reflectee is TearOffClosure;
+  }
+
   /// Invoke the member specified through name and type on the reflectee.
   /// As a side-effect, this populates the class-specific invocation cache
   /// for the reflectee.
@@ -959,7 +971,7 @@
     var cacheEntry = _getCachedInvocation(
         name, type, reflectiveName, positionalArguments, namedArguments);
 
-    if (cacheEntry.isNoSuchMethod) {
+    if (cacheEntry.isNoSuchMethod || !_isReflectable(cacheEntry)) {
       // Could be that we want to invoke a getter, or get a method.
       if (type == JSInvocationMirror.METHOD && _instanceFieldExists(name)) {
         return getField(name).invoke(
@@ -971,6 +983,11 @@
         name = s("${n(name)}=");
       }
 
+      if (!cacheEntry.isNoSuchMethod) {
+        // Not reflectable.
+        throwInvalidReflectionError(reflectiveName);
+      }
+
       String mangledName = reflectiveNames[reflectiveName];
       // TODO(ahe): Get the argument names.
       List<String> argumentNames = [];
diff --git a/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
index 2d5d8cb..1a6c2cb 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
@@ -59,7 +59,7 @@
       if (error.type != 'IsolateSpawnException') throw error;
       // TODO(nweiz): don't parse this as a string once issues 12617 and 12689
       // are fixed.
-      if (!error.message.split('\n')[1].endsWith("import '$uri';")) {
+      if (!error.message.split('\n')[1].startsWith("Failure getting $uri:")) {
         throw error;
       }
 
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_an_import_error_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_an_import_error_test.dart
index 5e68175..6f91042 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_an_import_error_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_with_an_import_error_test.dart
@@ -28,7 +28,8 @@
 
     createLockFile('myapp', pkg: ['barback']);
     var pub = startPubServe();
-    pub.stderr.expect(endsWith("error: line 1 pos 1: library handler failed"));
+    pub.stderr.expect("'Unhandled exception:");
+    pub.stderr.expect(startsWith("Failure getting "));
     pub.shouldExit(1);
   });
 }
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index a3b266f..87e107f 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -49,8 +49,11 @@
  *
  * Broadcast streams are used for independent events/observers.
  *
- * Stream transformations, such as [where] and [skip], always return
- * non-broadcast streams. If several listeners want to listen to the returned
+ * Stream transformations, such as [where] and [skip],
+ * return the same type of stream as the one the method was called on,
+ * unless otherwise noted.
+ *
+ * If several listeners want to listen to the returned
  * stream, use [asBroadcastStream] to create a broadcast stream on top of the
  * non-broadcast stream.
  *
@@ -203,10 +206,7 @@
   /**
    * Returns a multi-subscription stream that produces the same events as this.
    *
-   * If this stream is already a broadcast stream, it is returned unmodified.
-   *
-   * If this stream is single-subscription, return a new stream that allows
-   * multiple subscribers. It will subscribe to this stream when its first
+   * The returned stream will subscribe to this stream when its first
    * subscriber is added, and will stay subscribed until this stream ends,
    * or a callback cancels the subscription.
    *
@@ -227,7 +227,6 @@
   Stream<T> asBroadcastStream({
       void onListen(StreamSubscription<T> subscription),
       void onCancel(StreamSubscription<T> subscription) }) {
-    if (isBroadcast) return this;
     return new _AsBroadcastStream<T>(this, onListen, onCancel);
   }
 
@@ -262,7 +261,7 @@
    * The new stream sends the same error and done events as this stream,
    * but it only sends the data events that satisfy the [test].
    *
-   * The returned stream is not a broadcast stream, even if this stream is.
+   * The returned stream is a broadcast stream if this stream is.
    */
   Stream<T> where(bool test(T event)) {
     return new _WhereStream<T>(this, test);
@@ -272,7 +271,7 @@
    * Creates a new stream that converts each element of this stream
    * to a new value using the [convert] function.
    *
-   * The returned stream is not a broadcast stream, even if this stream is.
+   * The returned stream is a broadcast stream if this stream is.
    */
   Stream map(convert(T event)) {
     return new _MapStream<T, dynamic>(this, convert);
@@ -285,40 +284,51 @@
    * This acts like [map], except that [convert] may return a [Future],
    * and in that case, the stream waits for that future to complete before
    * continuing with its result.
+   *
+   * The returned stream is a broadcast stream if this stream is.
    */
   Stream asyncMap(convert(T event)) {
     StreamController controller;
     StreamSubscription subscription;
-    controller = new StreamController(
-      onListen: () {
-        var add = controller.add;
-        var addError = controller.addError;
-        subscription = this.listen(
-            (T event) {
-              var newValue;
-              try {
-                newValue = convert(event);
-              } catch (e, s) {
-                controller.addError(e, s);
-                return;
-              }
-              if (newValue is Future) {
-                subscription.pause();
-                newValue.then(add, onError: addError)
-                        .whenComplete(subscription.resume);
-              } else {
-                controller.add(newValue);
-              }
-            },
-            onError: addError,
-            onDone: controller.close
-        );
-      },
-      onPause: () { subscription.pause(); },
-      onResume: () { subscription.resume(); },
-      onCancel: () { subscription.cancel(); },
-      sync: true
-    );
+    void onListen () {
+      var add = controller.add;
+      var addError = controller.addError;
+      subscription = this.listen(
+          (T event) {
+            var newValue;
+            try {
+              newValue = convert(event);
+            } catch (e, s) {
+              controller.addError(e, s);
+              return;
+            }
+            if (newValue is Future) {
+              subscription.pause();
+              newValue.then(add, onError: addError)
+                      .whenComplete(subscription.resume);
+            } else {
+              controller.add(newValue);
+            }
+          },
+          onError: addError,
+          onDone: controller.close
+      );
+    }
+    if (this.isBroadcast) {
+      controller = new StreamController.broadcast(
+        onListen: onListen,
+        onCancel: () { subscription.cancel(); },
+        sync: true
+      );
+    } else {
+      controller = new StreamController(
+        onListen: onListen,
+        onPause: () { subscription.pause(); },
+        onResume: () { subscription.resume(); },
+        onCancel: () { subscription.cancel(); },
+        sync: true
+      );
+    }
     return controller.stream;
   }
 
@@ -332,36 +342,47 @@
    *
    * If [convert] returns `null`, no value is put on the output stream,
    * just as if it returned an empty stream.
+   *
+   * The returned stream is a broadcast stream if this stream is.
    */
   Stream asyncExpand(Stream convert(T event)) {
     StreamController controller;
     StreamSubscription subscription;
-    controller = new StreamController(
-      onListen: () {
-        subscription = this.listen(
-            (T event) {
-              Stream newStream;
-              try {
-                newStream = convert(event);
-              } catch (e, s) {
-                controller.addError(e, s);
-                return;
-              }
-              if (newStream != null) {
-                subscription.pause();
-                controller.addStream(newStream)
-                          .whenComplete(subscription.resume);
-              }
-            },
-            onError: controller.addError,
-            onDone: controller.close
-        );
-      },
-      onPause: () { subscription.pause(); },
-      onResume: () { subscription.resume(); },
-      onCancel: () { subscription.cancel(); },
-      sync: true
-    );
+    void onListen() {
+      subscription = this.listen(
+          (T event) {
+            Stream newStream;
+            try {
+              newStream = convert(event);
+            } catch (e, s) {
+              controller.addError(e, s);
+              return;
+            }
+            if (newStream != null) {
+              subscription.pause();
+              controller.addStream(newStream)
+                        .whenComplete(subscription.resume);
+            }
+          },
+          onError: controller.addError,
+          onDone: controller.close
+      );
+    }
+    if (this.isBroadcast) {
+      controller = new StreamController.broadcast(
+        onListen: onListen,
+        onCancel: () { subscription.cancel(); },
+        sync: true
+      );
+    } else {
+      controller = new StreamController(
+        onListen: onListen,
+        onPause: () { subscription.pause(); },
+        onResume: () { subscription.resume(); },
+        onCancel: () { subscription.cancel(); },
+        sync: true
+      );
+    }
     return controller.stream;
   }
 
@@ -388,7 +409,7 @@
    * [Stream.transform] to handle the event by writing a data event to
    * the output sink
    *
-   * The returned stream is not a broadcast stream, even if this stream is.
+   * The returned stream is a broadcast stream if this stream is.
    */
   Stream<T> handleError(Function onError, { bool test(error) }) {
     return new _HandleErrorStream<T>(this, onError, test);
@@ -402,7 +423,7 @@
    * and each of these new events are then sent by the returned stream
    * in order.
    *
-   * The returned stream is not a broadcast stream, even if this stream is.
+   * The returned stream is a broadcast stream if this stream is.
    */
   Stream expand(Iterable convert(T value)) {
     return new _ExpandStream<T, dynamic>(this, convert);
@@ -419,6 +440,9 @@
    * Chains this stream as the input of the provided [StreamTransformer].
    *
    * Returns the result of [:streamTransformer.bind:] itself.
+   *
+   * The `streamTransformer` can decide whether it wants to return a
+   * broadcast stream or not.
    */
   Stream transform(StreamTransformer<T, dynamic> streamTransformer) {
     return streamTransformer.bind(this);
@@ -738,7 +762,7 @@
    * means that single-subscription (non-broadcast) streams are closed and
    * cannot be reused after a call to this method.
    *
-   * The returned stream is not a broadcast stream, even if this stream is.
+   * The returned stream is a broadcast stream if this stream is.
    */
   Stream<T> take(int count) {
     return new _TakeStream(this, count);
@@ -758,7 +782,7 @@
    * means that single-subscription (non-broadcast) streams are closed and
    * cannot be reused after a call to this method.
    *
-   * The returned stream is not a broadcast stream, even if this stream is.
+   * The returned stream is a broadcast stream if this stream is.
    */
   Stream<T> takeWhile(bool test(T element)) {
     return new _TakeWhileStream(this, test);
@@ -767,7 +791,7 @@
   /**
    * Skips the first [count] data events from this stream.
    *
-   * The returned stream is not a broadcast stream, even if this stream is.
+   * The returned stream is a broadcast stream if this stream is.
    */
   Stream<T> skip(int count) {
     return new _SkipStream(this, count);
@@ -781,7 +805,7 @@
    * Starting with the first data event where [test] returns false for the
    * event data, the returned stream will have the same events as this stream.
    *
-   * The returned stream is not a broadcast stream, even if this stream is.
+   * The returned stream is a broadcast stream if this stream is.
    */
   Stream<T> skipWhile(bool test(T element)) {
     return new _SkipWhileStream(this, test);
@@ -796,7 +820,7 @@
    * Equality is determined by the provided [equals] method. If that is
    * omitted, the '==' operator on the last provided data element is used.
    *
-   * The returned stream is not a broadcast stream, even if this stream is.
+   * The returned stream is a broadcast stream if this stream is.
    */
   Stream<T> distinct([bool equals(T previous, T next)]) {
     return new _DistinctStream(this, equals);
@@ -1088,12 +1112,12 @@
    * If `onTimeout` is omitted, a timeout will just put a [TimeoutException]
    * into the error channel of the returned stream.
    *
-   * The returned stream is not a broadcast stream, even if this stream is.
+   * The returned stream is a broadcast stream if this stream is.
    */
   Stream timeout(Duration timeLimit, {void onTimeout(EventSink sink)}) {
-    StreamSubscription<T> subscription;
-    _StreamController controller;
+    StreamController controller;
     // The following variables are set on listen.
+    StreamSubscription<T> subscription;
     Timer timer;
     Zone zone;
     Function timeout;
@@ -1112,46 +1136,51 @@
       timer.cancel();
       controller.close();
     }
-    controller = new _SyncStreamController(
-        () {
-          // This is the onListen callback for of controller.
-          // It runs in the same zone that the subscription was created in.
-          // Use that zone for creating timers and running the onTimeout
-          // callback.
-          zone = Zone.current;
-          if (onTimeout == null) {
-            timeout = () {
-              controller.addError(new TimeoutException("No stream event",
-                                                       timeLimit));
-            };
-          } else {
-            onTimeout = zone.registerUnaryCallback(onTimeout);
-            _ControllerEventSinkWrapper wrapper =
-                new _ControllerEventSinkWrapper(null);
-            timeout = () {
-              wrapper._sink = controller;  // Only valid during call.
-              zone.runUnaryGuarded(onTimeout, wrapper);
-              wrapper._sink = null;
-            };
-          }
+    void onListen() {
+      // This is the onListen callback for of controller.
+      // It runs in the same zone that the subscription was created in.
+      // Use that zone for creating timers and running the onTimeout
+      // callback.
+      zone = Zone.current;
+      if (onTimeout == null) {
+        timeout = () {
+          controller.addError(new TimeoutException("No stream event",
+                                                   timeLimit));
+        };
+      } else {
+        onTimeout = zone.registerUnaryCallback(onTimeout);
+        _ControllerEventSinkWrapper wrapper =
+            new _ControllerEventSinkWrapper(null);
+        timeout = () {
+          wrapper._sink = controller;  // Only valid during call.
+          zone.runUnaryGuarded(onTimeout, wrapper);
+          wrapper._sink = null;
+        };
+      }
 
-          subscription = this.listen(onData, onError: onError, onDone: onDone);
-          timer = zone.createTimer(timeLimit, timeout);
-        },
-        () {
-          timer.cancel();
-          subscription.pause();
-        },
-        () {
-          subscription.resume();
-          timer = zone.createTimer(timeLimit, timeout);
-        },
-        () {
-          timer.cancel();
-          Future result = subscription.cancel();
-          subscription = null;
-          return result;
-        });
+      subscription = this.listen(onData, onError: onError, onDone: onDone);
+      timer = zone.createTimer(timeLimit, timeout);
+    }
+    Future onCancel() {
+      timer.cancel();
+      Future result = subscription.cancel();
+      subscription = null;
+      return result;
+    }
+    controller = isBroadcast
+        ? new _SyncBroadcastStreamController(onListen, onCancel)
+        : new _SyncStreamController(
+              onListen,
+              () {
+                // Don't null the timer, onCancel may call cancel again.
+                timer.cancel();
+                subscription.pause();
+              },
+              () {
+                subscription.resume();
+                timer = zone.createTimer(timeLimit, timeout);
+              },
+              onCancel);
     return controller.stream;
   }
 }
diff --git a/sdk/lib/async/stream_transformers.dart b/sdk/lib/async/stream_transformers.dart
index 832c395..e869486 100644
--- a/sdk/lib/async/stream_transformers.dart
+++ b/sdk/lib/async/stream_transformers.dart
@@ -171,6 +171,8 @@
   final _SinkMapper<S, T> _sinkMapper;
   final Stream<S> _stream;
 
+  bool get isBroadcast => _stream.isBroadcast;
+
   _BoundSinkStream(this._stream, this._sinkMapper);
 
   StreamSubscription<T> listen(void onData(T event),
diff --git a/sdk/lib/collection/collection.dart b/sdk/lib/collection/collection.dart
index 4620bc0..4e93785 100644
--- a/sdk/lib/collection/collection.dart
+++ b/sdk/lib/collection/collection.dart
@@ -11,14 +11,15 @@
 import 'dart:math' show Random;  // Used by ListMixin.shuffle.
 
 part 'collections.dart';
+part 'hash_map.dart';
+part 'hash_set.dart';
 part 'iterable.dart';
 part 'iterator.dart';
+part 'linked_hash_map.dart';
+part 'linked_hash_set.dart';
+part 'linked_list.dart';
+part 'list.dart';
 part 'maps.dart';
 part 'queue.dart';
+part 'set.dart';
 part 'splay_tree.dart';
-part 'linked_list.dart';
-part 'hash_set.dart';
-part 'hash_map.dart';
-part 'list.dart';
-part 'linked_hash_set.dart';
-part 'linked_hash_map.dart';
diff --git a/sdk/lib/collection/collection_sources.gypi b/sdk/lib/collection/collection_sources.gypi
index 5f2ab98..3656895 100644
--- a/sdk/lib/collection/collection_sources.gypi
+++ b/sdk/lib/collection/collection_sources.gypi
@@ -18,6 +18,7 @@
     'list.dart',
     'maps.dart',
     'queue.dart',
+    'set.dart',
     'splay_tree.dart',
   ],
 }
diff --git a/sdk/lib/collection/hash_set.dart b/sdk/lib/collection/hash_set.dart
index ff95b43..9cd24a0 100644
--- a/sdk/lib/collection/hash_set.dart
+++ b/sdk/lib/collection/hash_set.dart
@@ -5,19 +5,20 @@
 part of dart.collection;
 
 /** Common parts of [HashSet] and [LinkedHashSet] implementations. */
-abstract class _HashSetBase<E> extends IterableBase<E> implements Set<E> {
+abstract class _HashSetBase<E> extends SetBase<E> {
 
-  // Set.
-  bool containsAll(Iterable<Object> other) {
-    for (Object object in other) {
-      if (!this.contains(object)) return false;
+  // The following two methods override the ones in SetBase.
+  // It's possible to be more efficient if we have a way to create an empty
+  // set of the correct type.
+
+  Set<E> difference(Set<Object> other) {
+    Set<E> result = _newSet();
+    for (var element in this) {
+      if (!other.contains(element)) result.add(element);
     }
-    return true;
+    return result;
   }
 
-  /** Create a new Set of the same type as this. */
-  HashSet<E> _newSet();
-
   Set<E> intersection(Set<Object> other) {
     Set<E> result = _newSet();
     for (var element in this) {
@@ -26,41 +27,10 @@
     return result;
   }
 
-  Set<E> union(Set<E> other) {
-    return _newSet()..addAll(this)..addAll(other);
-  }
+  Set<E> _newSet();
 
-  Set<E> difference(Set<E> other) {
-    HashSet<E> result = _newSet();
-    for (E element in this) {
-      if (!other.contains(element)) result.add(element);
-    }
-    return result;
-  }
-
-  void _retainAll(Iterable objectsToRetain, bool isValidKey(Object o)) {
-    // TODO(lrn): Consider optimizing table based versions by
-    // building a new table of the entries to retain.
-    Set retainSet = _newSet();
-    for (Object o in objectsToRetain) {
-      if (isValidKey(o)) {
-        retainSet.add(o);
-      }
-    }
-    retainWhere(retainSet.contains);
-  }
-
-  List<E> toList({bool growable: true}) {
-    List<E> result = growable ? (new List<E>()..length = this.length)
-                              : new List<E>(this.length);
-    int i = 0;
-    for (E element in this) result[i++] = element;
-    return result;
-  }
-
+  // Subclasses can optimize this further.
   Set<E> toSet() => _newSet()..addAll(this);
-
-  String toString() => IterableMixinWorkaround.toStringIterable(this, '{', '}');
 }
 
 /**
diff --git a/sdk/lib/collection/iterable.dart b/sdk/lib/collection/iterable.dart
index 7c8ec70..1ae7b97 100644
--- a/sdk/lib/collection/iterable.dart
+++ b/sdk/lib/collection/iterable.dart
@@ -10,6 +10,11 @@
  * All other methods are implemented in terms of `iterator`.
  */
 abstract class IterableMixin<E> implements Iterable<E> {
+  // This class has methods copied verbatim into:
+  // - IterableBase
+  // - SetMixin
+  // If changing a method here, also change the other copies.
+
   Iterable map(f(E element)) => new MappedIterable<E, dynamic>(this, f);
 
   Iterable<E> where(bool f(E element)) => new WhereIterable<E>(this, f);
@@ -190,7 +195,7 @@
     throw new RangeError.value(index);
   }
 
-  String toString() => _iterableToString(this);
+  String toString() => IterableBase.iterableToShortString(this, '(', ')');
 }
 
 /**
@@ -397,129 +402,186 @@
    * included from the start of the iterable.
    *
    * The conversion may omit calling `toString` on some elements if they
-   * are known to now occur in the output, and it may stop iterating after
+   * are known to not occur in the output, and it may stop iterating after
    * a hundred elements.
    */
-  String toString() => _iterableToString(this);
-}
+  String toString() => iterableToShortString(this, '(', ')');
 
-String _iterableToString(Iterable iterable) {
-  if (_toStringVisiting.contains(iterable)) return "(...)";
-  _toStringVisiting.add(iterable);
-  List parts = [];
-  try {
-    _iterablePartsToStrings(iterable, parts);
-  } finally {
-    _toStringVisiting.remove(iterable);
-  }
-  return (new StringBuffer("(")..writeAll(parts, ", ")..write(")")).toString();
-}
-
-/** Convert elments of [iterable] to strings and store them in [parts]. */
-void _iterablePartsToStrings(Iterable iterable, List parts) {
-  /// Try to stay below this many characters.
-  const int LENGTH_LIMIT = 80;
-  /// Always at least this many elements at the start.
-  const int HEAD_COUNT = 3;
-  /// Always at least this many elements at the end.
-  const int TAIL_COUNT = 2;
-  /// Stop iterating after this many elements. Iterables can be infinite.
-  const int MAX_COUNT = 100;
-  // Per entry length overhead. It's for ", " for all after the first entry,
-  // and for "(" and ")" for the initial entry. By pure luck, that's the same
-  // number.
-  const int OVERHEAD = 2;
-  const int ELLIPSIS_SIZE = 3;  // "...".length.
-
-  int length = 0;
-  int count = 0;
-  Iterator it = iterable.iterator;
-  // Initial run of elements, at least HEAD_COUNT, and then continue until
-  // passing at most LENGTH_LIMIT characters.
-  while (length < LENGTH_LIMIT || count < HEAD_COUNT) {
-    if (!it.moveNext()) return;
-    String next = "${it.current}";
-    parts.add(next);
-    length += next.length + OVERHEAD;
-    count++;
-  }
-
-  String penultimateString;
-  String ultimateString;
-
-  // Find last two elements. One or more of them may already be in the
-  // parts array. Include their length in `length`.
-  var penultimate = null;
-  var ultimate = null;
-  if (!it.moveNext()) {
-    if (count <= HEAD_COUNT + TAIL_COUNT) return;
-    ultimateString = parts.removeLast();
-    penultimateString = parts.removeLast();
-  } else {
-    penultimate = it.current;
-    count++;
-    if (!it.moveNext()) {
-      if (count <= HEAD_COUNT + 1) {
-        parts.add("$penultimate");
-        return;
+  /**
+   * Convert an `Iterable` to a string like [IterableBase.toString].
+   *
+   * Allows using other delimiters than '(' and ')'.
+   *
+   * Handles circular references where converting one of the elements
+   * to a string ends up converting [iterable] to a string again.
+   */
+  static String iterableToShortString(Iterable iterable,
+                                      [String leftDelimiter = '(',
+                                       String rightDelimiter = ')']) {
+    if (_toStringVisiting.contains(iterable)) {
+      if (leftDelimiter == "(" && rightDelimiter == ")") {
+        // Avoid creating a new string in the "common" case.
+        return "(...)";
       }
-      ultimateString = "$penultimate";
-      penultimateString = parts.removeLast();
-      length += ultimateString.length + OVERHEAD;
-    } else {
-      ultimate = it.current;
-      count++;
-      // Then keep looping, keeping the last two elements in variables.
-      assert(count < MAX_COUNT);
-      while (it.moveNext()) {
-        penultimate = ultimate;
-        ultimate = it.current;
-        count++;
-        if (count > MAX_COUNT) {
-          // If we haven't found the end before MAX_COUNT, give up.
-          // This cannot happen in the code above because each entry
-          // increases length by at least two, so there is no way to
-          // visit more than ~40 elements before this loop.
+      return "$leftDelimiter...$rightDelimiter";
+    }
+    List parts = [];
+    _toStringVisiting.add(iterable);
+    try {
+      _iterablePartsToStrings(iterable, parts);
+    } finally {
+      _toStringVisiting.remove(iterable);
+    }
+    return (new StringBuffer(leftDelimiter)
+                ..writeAll(parts, ", ")
+                ..write(rightDelimiter)).toString();
+  }
 
-          // Remove any surplus elements until length, including ", ...)",
-          // is at most LENGTH_LIMIT.
-          while (length > LENGTH_LIMIT - ELLIPSIS_SIZE - OVERHEAD &&
-                 count > HEAD_COUNT) {
-            length -= parts.removeLast().length + OVERHEAD;
-            count--;
-          }
-          parts.add("...");
+  /**
+   * Converts an `Iterable` to a string.
+   *
+   * Converts each elements to a string, and separates the results by ", ".
+   * Then wraps the result in [leftDelimiter] and [rightDelimiter].
+   *
+   * Unlike [iterableToShortString], this conversion doesn't omit any
+   * elements or puts any limit on the size of the result.
+   *
+   * Handles circular references where converting one of the elements
+   * to a string ends up converting [iterable] to a string again.
+   */
+  static String iterableToFullString(Iterable iterable,
+                                     [String leftDelimiter = '(',
+                                      String rightDelimiter = ')']) {
+    if (_toStringVisiting.contains(iterable)) {
+      return "$leftDelimiter...$rightDelimiter";
+    }
+    StringBuffer buffer = new StringBuffer(leftDelimiter);
+    _toStringVisiting.add(iterable);
+    try {
+      buffer.writeAll(iterable, ", ");
+    } finally {
+      _toStringVisiting.remove(iterable);
+    }
+    buffer.write(rightDelimiter);
+    return buffer.toString();
+  }
+
+  /** A set used to identify cyclic lists during toString() calls. */
+  static Set _toStringVisiting = new HashSet.identity();
+
+  /**
+   * Convert elments of [iterable] to strings and store them in [parts].
+   */
+  static void _iterablePartsToStrings(Iterable iterable, List parts) {
+    /*
+     * This is the complicated part of [iterableToShortString].
+     * It is extracted as a separate function to avoid having too much code
+     * inside the try/finally.
+     */
+    /// Try to stay below this many characters.
+    const int LENGTH_LIMIT = 80;
+    /// Always at least this many elements at the start.
+    const int HEAD_COUNT = 3;
+    /// Always at least this many elements at the end.
+    const int TAIL_COUNT = 2;
+    /// Stop iterating after this many elements. Iterables can be infinite.
+    const int MAX_COUNT = 100;
+    // Per entry length overhead. It's for ", " for all after the first entry,
+    // and for "(" and ")" for the initial entry. By pure luck, that's the same
+    // number.
+    const int OVERHEAD = 2;
+    const int ELLIPSIS_SIZE = 3;  // "...".length.
+
+    int length = 0;
+    int count = 0;
+    Iterator it = iterable.iterator;
+    // Initial run of elements, at least HEAD_COUNT, and then continue until
+    // passing at most LENGTH_LIMIT characters.
+    while (length < LENGTH_LIMIT || count < HEAD_COUNT) {
+      if (!it.moveNext()) return;
+      String next = "${it.current}";
+      parts.add(next);
+      length += next.length + OVERHEAD;
+      count++;
+    }
+
+    String penultimateString;
+    String ultimateString;
+
+    // Find last two elements. One or more of them may already be in the
+    // parts array. Include their length in `length`.
+    var penultimate = null;
+    var ultimate = null;
+    if (!it.moveNext()) {
+      if (count <= HEAD_COUNT + TAIL_COUNT) return;
+      ultimateString = parts.removeLast();
+      penultimateString = parts.removeLast();
+    } else {
+      penultimate = it.current;
+      count++;
+      if (!it.moveNext()) {
+        if (count <= HEAD_COUNT + 1) {
+          parts.add("$penultimate");
           return;
         }
+        ultimateString = "$penultimate";
+        penultimateString = parts.removeLast();
+        length += ultimateString.length + OVERHEAD;
+      } else {
+        ultimate = it.current;
+        count++;
+        // Then keep looping, keeping the last two elements in variables.
+        assert(count < MAX_COUNT);
+        while (it.moveNext()) {
+          penultimate = ultimate;
+          ultimate = it.current;
+          count++;
+          if (count > MAX_COUNT) {
+            // If we haven't found the end before MAX_COUNT, give up.
+            // This cannot happen in the code above because each entry
+            // increases length by at least two, so there is no way to
+            // visit more than ~40 elements before this loop.
+
+            // Remove any surplus elements until length, including ", ...)",
+            // is at most LENGTH_LIMIT.
+            while (length > LENGTH_LIMIT - ELLIPSIS_SIZE - OVERHEAD &&
+                   count > HEAD_COUNT) {
+              length -= parts.removeLast().length + OVERHEAD;
+              count--;
+            }
+            parts.add("...");
+            return;
+          }
+        }
+        penultimateString = "$penultimate";
+        ultimateString = "$ultimate";
+        length +=
+            ultimateString.length + penultimateString.length + 2 * OVERHEAD;
       }
-      penultimateString = "$penultimate";
-      ultimateString = "$ultimate";
-      length +=
-          ultimateString.length + penultimateString.length + 2 * OVERHEAD;
     }
-  }
 
-  // If there is a gap between the initial run and the last two,
-  // prepare to add an ellipsis.
-  String elision = null;
-  if (count > parts.length + TAIL_COUNT) {
-    elision = "...";
-    length += ELLIPSIS_SIZE + OVERHEAD;
-  }
-
-  // If the last two elements were very long, and we have more than
-  // HEAD_COUNT elements in the initial run, drop some to make room for
-  // the last two.
-  while (length > LENGTH_LIMIT && parts.length > HEAD_COUNT) {
-    length -= parts.removeLast().length + OVERHEAD;
-    if (elision == null) {
+    // If there is a gap between the initial run and the last two,
+    // prepare to add an ellipsis.
+    String elision = null;
+    if (count > parts.length + TAIL_COUNT) {
       elision = "...";
       length += ELLIPSIS_SIZE + OVERHEAD;
     }
+
+    // If the last two elements were very long, and we have more than
+    // HEAD_COUNT elements in the initial run, drop some to make room for
+    // the last two.
+    while (length > LENGTH_LIMIT && parts.length > HEAD_COUNT) {
+      length -= parts.removeLast().length + OVERHEAD;
+      if (elision == null) {
+        elision = "...";
+        length += ELLIPSIS_SIZE + OVERHEAD;
+      }
+    }
+    if (elision != null) {
+      parts.add(elision);
+    }
+    parts.add(penultimateString);
+    parts.add(ultimateString);
   }
-  if (elision != null) {
-    parts.add(elision);
-  }
-  parts.add(penultimateString);
-  parts.add(ultimateString);
 }
diff --git a/sdk/lib/collection/list.dart b/sdk/lib/collection/list.dart
index 7669a70a5..b6e1a11 100644
--- a/sdk/lib/collection/list.dart
+++ b/sdk/lib/collection/list.dart
@@ -4,9 +4,6 @@
 
 part of dart.collection;
 
-/** A reusable set used to identify cyclic lists during toString() calls. */
-Set _toStringVisiting = new HashSet.identity();
-
 /**
  * Abstract implementation of a list.
  *
@@ -22,7 +19,16 @@
  * to the growable list, or, preferably, use `DelegatingList` from
  * "package:collection/wrappers.dart" instead.
  */
-abstract class ListBase<E> = Object with ListMixin<E>;
+abstract class ListBase<E> extends Object with ListMixin<E> {
+  /**
+   * Convert a `List` to a string as `[each, element, as, string]`.
+   *
+   * Handles circular references where converting one of the elements
+   * to a string ends up converting [list] to a string again.
+   */
+  static String listToString(List list) =>
+      IterableBase.iterableToFullString(list, '[', ']');
+}
 
 /**
  * Base implementation of a [List] class.
@@ -501,21 +507,5 @@
 
   Iterable<E> get reversed => new ReversedListIterable(this);
 
-  String toString() {
-    if (_toStringVisiting.contains(this)) {
-      return '[...]';
-    }
-
-    var result = new StringBuffer();
-    try {
-      _toStringVisiting.add(this);
-      result.write('[');
-      result.writeAll(this, ', ');
-      result.write(']');
-     } finally {
-       _toStringVisiting.remove(this);
-     }
-
-    return result.toString();
-  }
+  String toString() => IterableBase.iterableToFullString(this, '[', ']');
 }
diff --git a/sdk/lib/collection/queue.dart b/sdk/lib/collection/queue.dart
index 5dfe170..72c4e95 100644
--- a/sdk/lib/collection/queue.dart
+++ b/sdk/lib/collection/queue.dart
@@ -31,14 +31,16 @@
   factory Queue.from(Iterable<E> other) = ListQueue<E>.from;
 
   /**
-   * Removes and returns the first element of this queue. Throws an
-   * [StateError] exception if this queue is empty.
+   * Removes and returns the first element of this queue.
+   *
+   * The queue must not be empty when this method is called.
    */
   E removeFirst();
 
   /**
-   * Removes and returns the last element of the queue. Throws an
-   * [StateError] exception if this queue is empty.
+   * Removes and returns the last element of the queue.
+   *
+   * The queue must not be empty when this method is called.
    */
   E removeLast();
 
@@ -162,7 +164,7 @@
   }
 
   E remove() {
-    throw new StateError("Empty queue");
+    throw IterableElementError.noElement();
   }
 
   DoubleLinkedQueueEntry<E> _asNonSentinelEntry() {
@@ -176,7 +178,7 @@
   }
 
   E get element {
-    throw new StateError("Empty queue");
+    throw IterableElementError.noElement();
   }
 }
 
@@ -279,11 +281,11 @@
   }
 
   E get single {
-    // Note that this also covers the case where the queue is empty.
+    // Note that this throws correctly if the queue is empty.
     if (identical(_sentinel._next, _sentinel._previous)) {
       return _sentinel._next.element;
     }
-    throw new StateError("More than one element");
+    throw IterableElementError.tooMany();
   }
 
   DoubleLinkedQueueEntry<E> lastEntry() {
@@ -317,8 +319,7 @@
     return new _DoubleLinkedQueueIterator<E>(_sentinel);
   }
 
-  // TODO(zarah)  Remove this, and let it be inherited by IterableBase
-  String toString() => IterableMixinWorkaround.toStringIterable(this, '{', '}');
+  String toString() => IterableBase.iterableToFullString(this, '{', '}');
 }
 
 class _DoubleLinkedQueueIterator<E> implements Iterator<E> {
@@ -410,18 +411,18 @@
   int get length => (_tail - _head) & (_table.length - 1);
 
   E get first {
-    if (_head == _tail) throw new StateError("No elements");
+    if (_head == _tail) throw IterableElementError.noElement();
     return _table[_head];
   }
 
   E get last {
-    if (_head == _tail) throw new StateError("No elements");
+    if (_head == _tail) throw IterableElementError.noElement();
     return _table[(_tail - 1) & (_table.length - 1)];
   }
 
   E get single {
-    if (_head == _tail) throw new StateError("No elements");
-    if (length > 1) throw new StateError("Too many elements");
+    if (_head == _tail) throw IterableElementError.noElement();
+    if (length > 1) throw IterableElementError.tooMany();
     return _table[_head];
   }
 
@@ -537,8 +538,7 @@
     }
   }
 
-  // TODO(zarah)  Remove this, and let it be inherited by IterableBase
-  String toString() => IterableMixinWorkaround.toStringIterable(this, '{', '}');
+  String toString() => IterableBase.iterableToFullString(this, "{", "}");
 
   // Queue interface.
 
@@ -552,7 +552,7 @@
   }
 
   E removeFirst() {
-    if (_head == _tail) throw new StateError("No elements");
+    if (_head == _tail) throw IterableElementError.noElement();
     _modificationCount++;
     E result = _table[_head];
     _table[_head] = null;
@@ -561,7 +561,7 @@
   }
 
   E removeLast() {
-    if (_head == _tail) throw new StateError("No elements");
+    if (_head == _tail) throw IterableElementError.noElement();
     _modificationCount++;
     _tail = (_tail - 1) & (_table.length - 1);
     E result = _table[_tail];
diff --git a/sdk/lib/collection/set.dart b/sdk/lib/collection/set.dart
new file mode 100644
index 0000000..906312a
--- /dev/null
+++ b/sdk/lib/collection/set.dart
@@ -0,0 +1,310 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/**
+ * Base implementations of [Set].
+ */
+part of dart.collection;
+
+/**
+ * Mixin implementation of [Set].
+ *
+ * This class provides a base implementation of a `Set` that depends only
+ * on the abstract members: [add], [contains], [lookup], [remove],
+ * [iterator], [length] and [toSet].
+ *
+ * Some of the methods assume that `toSet` creates a modifiable set.
+ * If using this mixin for an unmodifiable set,
+ * where `toSet` should return an unmodifiable set,
+ * it's necessary to reimplement
+ * [retainAll], [union], [intersection] and [difference].
+ *
+ * Implementations of `Set` using this mixin should consider also implementing
+ * `clear` in constant time. The default implementation works by removing every
+ * element.
+ */
+abstract class SetMixin<E> implements Set<E> {
+  // This class reimplements all of [IterableMixin].
+  // If/when Dart mixins get more powerful, we should just create a single
+  // Mixin class from IterableMixin and the new methods of thisclass.
+
+  bool add(E element);
+
+  bool contains(Object element);
+
+  E lookup(E element);
+
+  bool remove(Object element);
+
+  Iterator<E> get iterator;
+
+  Set<E> toSet();
+
+  int get length;
+
+  bool get isEmpty => length == 0;
+
+  bool get isNotEmpty => length != 0;
+
+  void clear() {
+    removeAll(toList());
+  }
+
+  void addAll(Iterable<E> elements) {
+    for (E element in elements) add(element);
+  }
+
+  void removeAll(Iterable<Object> elements) {
+    for (Object element in elements) remove(element);
+  }
+
+  void retainAll(Iterable<Object> elements) {
+    // Create a copy of the set, remove all of elements from the copy,
+    // then remove all remaining elements in copy from this.
+    Set<E> toRemove = toSet();
+    for (Object o in elements) {
+      toRemove.remove(o);
+    }
+    removeAll(toRemove);
+  }
+
+  void removeWhere(bool test(E element)) {
+    List toRemove = [];
+    for (E element in this) {
+      if (test(element)) toRemove.add(element);
+    }
+    removeAll(toRemove);
+  }
+
+  void retainWhere(bool test(E element)) {
+    List toRemove = [];
+    for (E element in this) {
+      if (!test(element)) toRemove.add(element);
+    }
+    removeAll(toRemove);
+  }
+
+  bool containsAll(Iterable<Object> other) {
+    for (Object o in other) {
+      if (!contains(o)) return false;
+    }
+    return true;
+  }
+
+  Set<E> union(Set<E> other) {
+    return toSet()..addAll(other);
+  }
+
+  Set<E> intersection(Set<Object> other) {
+    Set<E> result = toSet();
+    for (E element in this) {
+      if (!other.contains(element)) result.remove(element);
+    }
+    return result;
+  }
+
+  Set<E> difference(Set<Object> other) {
+    Set<E> result = toSet();
+    for (E element in this) {
+      if (other.contains(element)) result.remove(element);
+    }
+    return result;
+  }
+
+  List<E> toList({bool growable: true}) {
+    List<E> result = growable ? (new List<E>()..length = length)
+                              : new List<E>(length);
+    int i = 0;
+    for (E element in this) result[i++] = element;
+    return result;
+  }
+
+  Iterable map(f(E element)) =>
+      new EfficientLengthMappedIterable<E, dynamic>(this, f);
+
+  E get single {
+    if (length > 1) throw IterableElementError.tooMany();
+    Iterator it = iterator;
+    if (!it.moveNext()) throw IterableElementError.noElement();
+    E result = it.current;
+    return result;
+  }
+
+  String toString() => IterableBase.iterableToFullString(this, '{', '}');
+
+  // Copied from IterableMixin.
+  // Should be inherited if we had multi-level mixins.
+
+  Iterable<E> where(bool f(E element)) => new WhereIterable<E>(this, f);
+
+  Iterable expand(Iterable f(E element)) =>
+      new ExpandIterable<E, dynamic>(this, f);
+
+  void forEach(void f(E element)) {
+    for (E element in this) f(element);
+  }
+
+  E reduce(E combine(E value, E element)) {
+    Iterator<E> iterator = this.iterator;
+    if (!iterator.moveNext()) {
+      throw IterableElementError.noElement();
+    }
+    E value = iterator.current;
+    while (iterator.moveNext()) {
+      value = combine(value, iterator.current);
+    }
+    return value;
+  }
+
+  dynamic fold(var initialValue,
+               dynamic combine(var previousValue, E element)) {
+    var value = initialValue;
+    for (E element in this) value = combine(value, element);
+    return value;
+  }
+
+  bool every(bool f(E element)) {
+    for (E element in this) {
+      if (!f(element)) return false;
+    }
+    return true;
+  }
+
+  String join([String separator = ""]) {
+    Iterator<E> iterator = this.iterator;
+    if (!iterator.moveNext()) return "";
+    StringBuffer buffer = new StringBuffer();
+    if (separator == null || separator == "") {
+      do {
+        buffer.write("${iterator.current}");
+      } while (iterator.moveNext());
+    } else {
+      buffer.write("${iterator.current}");
+      while (iterator.moveNext()) {
+        buffer.write(separator);
+        buffer.write("${iterator.current}");
+      }
+    }
+    return buffer.toString();
+  }
+
+  bool any(bool test(E element)) {
+    for (E element in this) {
+      if (test(element)) return true;
+    }
+    return false;
+  }
+
+  Iterable<E> take(int n) {
+    return new TakeIterable<E>(this, n);
+  }
+
+  Iterable<E> takeWhile(bool test(E value)) {
+    return new TakeWhileIterable<E>(this, test);
+  }
+
+  Iterable<E> skip(int n) {
+    return new SkipIterable<E>(this, n);
+  }
+
+  Iterable<E> skipWhile(bool test(E value)) {
+    return new SkipWhileIterable<E>(this, test);
+  }
+
+  E get first {
+    Iterator it = iterator;
+    if (!it.moveNext()) {
+      throw IterableElementError.noElement();
+    }
+    return it.current;
+  }
+
+  E get last {
+    Iterator it = iterator;
+    if (!it.moveNext()) {
+      throw IterableElementError.noElement();
+    }
+    E result;
+    do {
+      result = it.current;
+    } while(it.moveNext());
+    return result;
+  }
+
+  dynamic firstWhere(bool test(E value), { Object orElse() }) {
+    for (E element in this) {
+      if (test(element)) return element;
+    }
+    if (orElse != null) return orElse();
+    throw IterableElementError.noElement();
+  }
+
+  dynamic lastWhere(bool test(E value), { Object orElse() }) {
+    E result = null;
+    bool foundMatching = false;
+    for (E element in this) {
+      if (test(element)) {
+        result = element;
+        foundMatching = true;
+      }
+    }
+    if (foundMatching) return result;
+    if (orElse != null) return orElse();
+    throw IterableElementError.noElement();
+  }
+
+  E singleWhere(bool test(E value)) {
+    E result = null;
+    bool foundMatching = false;
+    for (E element in this) {
+      if (test(element)) {
+        if (foundMatching) {
+          throw IterableElementError.tooMany();
+        }
+        result = element;
+        foundMatching = true;
+      }
+    }
+    if (foundMatching) return result;
+    throw IterableElementError.noElement();
+  }
+
+  E elementAt(int index) {
+    if (index is! int || index < 0) throw new RangeError.value(index);
+    int remaining = index;
+    for (E element in this) {
+      if (remaining == 0) return element;
+      remaining--;
+    }
+    throw new RangeError.value(index);
+  }
+}
+
+/**
+ * Base implementation of [Set].
+ *
+ * This class provides a base implementation of a `Set` that depends only
+ * on the abstract members: [add], [contains], [lookup], [remove],
+ * [iterator], [length] and [toSet].
+ *
+ * Some of the methods assume that `toSet` creates a modifiable set.
+ * If using this base class for an unmodifiable set,
+ * where `toSet` should return an unmodifiable set,
+ * it's necessary to reimplement
+ * [retainAll], [union], [intersection] and [difference].
+ *
+ * Implementations of `Set` using this base should consider also implementing
+ * `clear` in constant time. The default implementation works by removing every
+ * element.
+ */
+abstract class SetBase<E> extends SetMixin<E> {
+  /**
+   * Convert a `Set` to a string as `{each, element, as, string}`.
+   *
+   * Handles circular references where converting one of the elements
+   * to a string ends up converting [set] to a string again.
+   */
+  static String setToString(Set set) =>
+      IterableBase.iterableToFullString(set, '{', '}');
+}
diff --git a/sdk/lib/collection/splay_tree.dart b/sdk/lib/collection/splay_tree.dart
index 8e2f593..ccd5636 100644
--- a/sdk/lib/collection/splay_tree.dart
+++ b/sdk/lib/collection/splay_tree.dart
@@ -639,8 +639,7 @@
  * method. Non-comparable objects (including `null`) will not work as an element
  * in that case.
  */
-class SplayTreeSet<E> extends _SplayTree<E> with IterableMixin<E>
-                      implements Set<E> {
+class SplayTreeSet<E> extends _SplayTree<E> with IterableMixin<E>, SetMixin<E> {
   Comparator _comparator;
   _Predicate _validKey;
 
@@ -683,18 +682,18 @@
   bool get isNotEmpty => _root != null;
 
   E get first {
-    if (_count == 0) throw new StateError("no such element");
+    if (_count == 0) throw IterableElementError.noElement();
     return _first.key;
   }
 
   E get last {
-    if (_count == 0) throw new StateError("no such element");
+    if (_count == 0) throw IterableElementError.noElement();
     return _last.key;
   }
 
   E get single {
-    if (_count == 0) throw new StateError("no such element");
-    if (_count > 1) throw new StateError("too many elements");
+    if (_count == 0) throw IterableElementError.noElement();
+    if (_count > 1) throw IterableElementError.tooMany();
     return _root.key;
   }
 
@@ -730,9 +729,6 @@
     }
   }
 
-  /**
-   * Removes all elements not in [elements].
-   */
   void retainAll(Iterable<Object> elements) {
     // Build a set with the same sense of equality as this set.
     SplayTreeSet<E> retainSet = new SplayTreeSet<E>(_comparator, _validKey);
@@ -753,30 +749,6 @@
     }
   }
 
-  void _filterWhere(bool test(E element), bool removeMatching) {
-    _SplayTreeNodeIterator it = new _SplayTreeNodeIterator(this);
-    while (it.moveNext()) {
-      _SplayTreeNode node = it.current;
-      int modificationCount = _modificationCount;
-      bool matches = test(node.key);
-      if (modificationCount != _modificationCount) {
-        throw new ConcurrentModificationError(this);
-      }
-      if (matches == removeMatching) {
-        _remove(node.key);
-        it = new _SplayTreeNodeIterator.startAt(this, node.key);
-      }
-    }
-  }
-
-  void removeWhere(bool test(E element)) {
-    _filterWhere(test, true);
-  }
-
-  void retainWhere(bool test(E element)) {
-    _filterWhere(test, false);
-  }
-
   E lookup(Object object) {
     if (!_validKey(object)) return null;
     int comp = _splay(object);
@@ -785,7 +757,7 @@
   }
 
   Set<E> intersection(Set<E> other) {
-    Set<E> result = new SplayTreeSet<E>(_compare, _validKey);
+    Set<E> result = new SplayTreeSet<E>(_comparator, _validKey);
     for (E element in this) {
       if (other.contains(element)) result.add(element);
     }
@@ -793,7 +765,7 @@
   }
 
   Set<E> difference(Set<E> other) {
-    Set<E> result = new SplayTreeSet<E>(_compare, _validKey);
+    Set<E> result = new SplayTreeSet<E>(_comparator, _validKey);
     for (E element in this) {
       if (!other.contains(element)) result.add(element);
     }
@@ -805,7 +777,7 @@
   }
 
   SplayTreeSet<E> _clone() {
-    var set = new SplayTreeSet<E>(_compare, _validKey);
+    var set = new SplayTreeSet<E>(_comparator, _validKey);
     set._count = _count;
     set._root = _cloneNode(_root);
     return set;
@@ -817,12 +789,9 @@
                                           ..right = _cloneNode(node.right);
   }
 
-  bool containsAll(Iterable<Object> other) {
-    for (var element in other) {
-      if (!this.contains(element)) return false;
-    }
-    return true;
-  }
-
   void clear() { _clear(); }
+
+  Set<E> toSet() => _clone();
+
+  String toString() => IterableBase.iterableToFullString(this, '{', '}');
 }
diff --git a/sdk/lib/core/iterable.dart b/sdk/lib/core/iterable.dart
index 7d0ff16..f9d3a3f 100644
--- a/sdk/lib/core/iterable.dart
+++ b/sdk/lib/core/iterable.dart
@@ -95,6 +95,13 @@
 
   /**
    * Returns true if the collection contains an element equal to [element].
+   *
+   * The equality used to determine wheter [element] is equal to an element of
+   * the iterable, depends on the type of iterable.
+   * For example, a [Set] may have a custom equality
+   * (see, e.g., [Set.identical]) that its `contains` uses.
+   * Likewise the `Iterable` returned by a [Map.keys] call
+   * will likely use the same equality that the `Map` uses for keys.
    */
   bool contains(Object element);
 
@@ -164,7 +171,13 @@
   List<E> toList({ bool growable: true });
 
   /**
-   * Creates a [Set] containing the elements of this [Iterable].
+   * Creates a [Set] containing the same elements as this iterable.
+   *
+   * The returned `Set` will have the same `Set.length`
+   * as the `length` of this iterable,
+   * and its `Set.contains` will return the same result
+   * as the `contains` of this iterable.
+   * The order of the elements may be different.
    */
   Set<E> toSet();
 
diff --git a/sdk/lib/core/set.dart b/sdk/lib/core/set.dart
index 271b389..2440c69 100644
--- a/sdk/lib/core/set.dart
+++ b/sdk/lib/core/set.dart
@@ -166,4 +166,14 @@
    * Removes all elements in the set.
    */
   void clear();
+
+  /* Creates a [Set] with the same elements and behavior as this `Set`.
+   *
+   * The returned set behaves the same as this set
+   * with regard to adding and removing elements.
+   * It initially contains the same elements.
+   * If this set specifies an ordering of the elements,
+   * the returned set will have the same order.
+   */
+  Set<E> toSet();
 }
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index 38591f3..fa292d5 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -35344,9 +35344,12 @@
 
   void postMessage(var message, String targetOrigin, [List messagePorts = null]) {
     if (messagePorts == null) {
-      JS('void', '#.postMessage(#,#)', _window, message, targetOrigin);
+      JS('void', '#.postMessage(#,#)', _window,
+          convertDartToNative_SerializedScriptValue(message), targetOrigin);
     } else {
-      JS('void', '#.postMessage(#,#,#)', _window, message, targetOrigin, messagePorts);
+      JS('void', '#.postMessage(#,#,#)', _window,
+          convertDartToNative_SerializedScriptValue(message), targetOrigin,
+          messagePorts);
     }
   }
 
diff --git a/sdk/lib/internal/iterable.dart b/sdk/lib/internal/iterable.dart
index 6149cb9..4cf8418 100644
--- a/sdk/lib/internal/iterable.dart
+++ b/sdk/lib/internal/iterable.dart
@@ -741,9 +741,6 @@
  * The uses of this class will be replaced by mixins.
  */
 class IterableMixinWorkaround {
-  // A list to identify cyclic collections during toString() calls.
-  static List _toStringList = new List();
-
   static bool contains(Iterable iterable, var element) {
     for (final e in iterable) {
       if (e == element) return true;
@@ -937,27 +934,6 @@
     return buffer.toString();
   }
 
-  static String toStringIterable(Iterable iterable, String leftDelimiter,
-                                 String rightDelimiter) {
-    for (int i = 0; i < _toStringList.length; i++) {
-      if (identical(_toStringList[i], iterable)) {
-        return '$leftDelimiter...$rightDelimiter';
-      }
-    }
-
-    StringBuffer result = new StringBuffer();
-    try {
-      _toStringList.add(iterable);
-      result.write(leftDelimiter);
-      result.writeAll(iterable, ', ');
-      result.write(rightDelimiter);
-    } finally {
-      assert(identical(_toStringList.last, iterable));
-      _toStringList.removeLast();
-    }
-    return result.toString();
-  }
-
   static Iterable where(Iterable iterable, bool f(var element)) {
     return new WhereIterable(iterable, f);
   }
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 2401404..2561cc9 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -42,6 +42,14 @@
 # co19 issue #685: Non-bool operand of && and || produces a static type warning
 Language/12_Expressions/04_Booleans/1_Boolean_Conversion_A01_t02: Fail, OK
 
+# co19 issue #686: Abstract methods are allowed in concrete classes if they override a concrete method
+Language/07_Classes/07_Classes_A03_t06: Fail, OK
+Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A03_t04: Fail, OK
+Language/12_Expressions/16_Getter_Lookup_A02_t05: Fail, OK
+Language/12_Expressions/16_Getter_Lookup_A02_t06: Fail, OK
+
+Language/07_Classes/4_Abstract_Instance_Members_A07_t02: Fail # Issue 18914
+
 LibTest/isolate/IsolateStream/any_A01_t01: Fail # co19-roll r706: Please triage this failure.
 LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail # co19-roll r706: Please triage this failure.
 LibTest/isolate/IsolateStream/contains_A01_t01: Fail # co19-roll r706: Please triage this failure.
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index cbc5bea..c532b40 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -17,6 +17,9 @@
 
 [ $compiler != dartanalyzer && $compiler != dart2analyzer ]
 # Tests that fail on every runtime, but not on the analyzer.
+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
 
@@ -83,3 +86,6 @@
 LibTest/math/MutableRectangle/boundingBox_A01_t01: RuntimeError # co19 issue 675
 LibTest/math/MutableRectangle/boundingBox_A01_t02: RuntimeError # co19 issue 675
 LibTest/math/MutableRectangle/intersection_A01_t01: RuntimeError # co19 issue 675
+
+[ $compiler == dart2js ]
+LibTest/isolate/Isolate/spawn_A01_t04: RuntimeError # co19 issue 688
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 4fdf01d..c866076 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -109,7 +109,7 @@
 LibTest/core/int/remainder_A01_t01: Fail # Issue: 8920
 LibTest/core/int/remainder_A01_t03: Fail # Issue: 8920
 LibTest/core/int/toRadixString_A01_t01: Fail # Issue: 8920
-LibTest/core/Map/Map_class_A01_t04: Pass, Timeout # Issue 8096
+LibTest/core/Map/Map_class_A01_t04: Skip # Issue 8096
 LibTest/core/RegExp/Pattern_semantics/firstMatch_CharacterEscape_A06_t02: Fail # Issue: 8920
 LibTest/core/RegExp/Pattern_semantics/firstMatch_DecimalEscape_A01_t02: Fail # Issue: 8920
 LibTest/core/RegExp/Pattern_semantics/firstMatch_NonEmptyClassRanges_A01_t01: Fail # Issue: 8920
@@ -121,15 +121,15 @@
 LibTest/core/Stopwatch/elapsedTicks_A01_t01: Fail, Pass # Issue 16106
 LibTest/async/Timer/Timer.periodic_A01_t01: Fail, Pass # Issue 16110
 LibTest/async/Timer/Timer_A01_t01: Fail, Pass # Issue 16110
-LibTest/collection/LinkedList/add_A01_t01: Pass, Slow, Timeout # Slow tests that needs extra time to finish.
-LibTest/core/Uri/Uri_A06_t03: Timeout, Pass # Issue 13511
+LibTest/collection/LinkedList/add_A01_t01: Skip # Slow tests that needs extra time to finish.
+LibTest/core/Uri/Uri_A06_t03: Skip # Issue 13511
 LibTest/math/cos_A01_t01: Fail # co19 issue 44
 
 
 # co19 roll untriaged failures.  Please triage these.
 Language/12_Expressions/00_Object_Identity/1_Object_Identity_A05_t02: RuntimeError # co19-roll r607: Please triage this failure
 Language/12_Expressions/17_Getter_Invocation_A07_t02: RuntimeError # co19-roll r607: Please triage this failure
-LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue_class_A01_t01: Pass, Timeout # co19-roll r651: Please triage this failure
+LibTest/collection/DoubleLinkedQueue/DoubleLinkedQueue_class_A01_t01: Skip # co19-roll r651: Please triage this failure
 LayoutTests/fast/dom/DOMException/XPathException_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/dom/DOMException/dispatch-event-exception_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/dom/DOMException/prototype-object_t01: RuntimeError # co19-roll r706: Please triage this failure.
@@ -151,11 +151,11 @@
 LayoutTests/fast/dom/Element/attribute-uppercase_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/dom/Element/class-name_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/dom/Element/client-rect-list-argument_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Element/getClientRects_t01: RuntimeError, Timeout # co19-roll r706: Please triage this failure.
+LayoutTests/fast/dom/Element/getClientRects_t01: Skip # co19-roll r706: Please triage this failure.
 LayoutTests/fast/dom/Element/hostname-host_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/dom/Element/id-in-insert-hr_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/dom/Element/offsetTop-table-cell_t01: Timeout # co19-roll r607: Please triage this failure
-LayoutTests/fast/dom/Element/scrollWidth_t01: Timeout # co19-roll r607: Please triage this failure
+LayoutTests/fast/dom/Element/offsetTop-table-cell_t01: Skip # co19-roll r607: Please triage this failure
+LayoutTests/fast/dom/Element/scrollWidth_t01: Skip # co19-roll r607: Please triage this failure
 LayoutTests/fast/dom/Element/setAttributeNS-namespace-err_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/html/adjacent-html-context-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/html/article-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
@@ -174,19 +174,19 @@
 LayoutTests/fast/html/header-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/html/hgroup-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/html/hidden-attr-dom_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/hidden-attr_t01: RuntimeError, Timeout # co19-roll r706: Please triage this failure.
+LayoutTests/fast/html/hidden-attr_t01: Skip # co19-roll r706: Please triage this failure.
 LayoutTests/fast/html/main-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/html/mark-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/html/range-point-in-range-for-different-documents_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/html/section-element_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/html/text-field-input-types_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/html/unknown-tag_t01: Timeout # co19-roll r607: Please triage this failure
+LayoutTests/fast/html/unknown-tag_t01: Skip # co19-roll r607: Please triage this failure
 LayoutTests/fast/innerHTML/innerHTML-case_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/innerHTML/innerHTML-custom-tag_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/innerHTML/innerHTML-svg-read_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/innerHTML/innerHTML-svg-write_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LayoutTests/fast/innerHTML/innerHTML-uri-resolution_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LayoutTests/fast/innerHTML/javascript-url_t01: RuntimeError, Timeout # co19-roll r706: Please triage this failure.
+LayoutTests/fast/innerHTML/javascript-url_t01: Skip # co19-roll r706: Please triage this failure.
 LibTest/core/double/roundToDouble_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/Document/childNodes_A01_t01: Pass, RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/Document/clone_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
@@ -199,7 +199,7 @@
 LibTest/html/Element/appendHtml_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/Element/appendText_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/Element/attributeChanged_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/Element/blur_A01_t01: Pass, Timeout # co19-roll r607: Please triage this failure
+LibTest/html/Element/blur_A01_t01: Skip # co19-roll r607: Please triage this failure
 LibTest/html/Element/contentEditable_A01_t02: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/Element/dataset_A02_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/Element/draggable_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
@@ -221,15 +221,15 @@
 LibTest/html/HttpRequest/getAllResponseHeaders_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/HttpRequest/getResponseHeader_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/HttpRequest/getString_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/HttpRequest/onAbort_A01_t01: Timeout # co19-roll r607: Please triage this failure
-LibTest/html/HttpRequest/onError_A01_t02: Timeout # co19-roll r607: Please triage this failure
-LibTest/html/HttpRequest/onLoadEnd_A01_t01: Timeout # co19-roll r607: Please triage this failure
-LibTest/html/HttpRequest/onLoadStart_A01_t01: Timeout # co19-roll r607: Please triage this failure
+LibTest/html/HttpRequest/onAbort_A01_t01: Skip # co19-roll r607: Please triage this failure
+LibTest/html/HttpRequest/onError_A01_t02: Skip # co19-roll r607: Please triage this failure
+LibTest/html/HttpRequest/onLoadEnd_A01_t01: Skip # co19-roll r607: Please triage this failure
+LibTest/html/HttpRequest/onLoadStart_A01_t01: Skip # co19-roll r607: Please triage this failure
 LibTest/html/HttpRequest/overrideMimeType_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/HttpRequest/readyStateChangeEvent_A01_t01: Pass, RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/HttpRequest/request_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/HttpRequest/responseText_A01_t01: Pass, RuntimeError # co19-roll r706: Please triage this failure
-LibTest/html/HttpRequest/responseText_A01_t02: Timeout # co19-roll r607: Please triage this failure
+LibTest/html/HttpRequest/responseText_A01_t02: Skip # co19-roll r607: Please triage this failure
 LibTest/html/HttpRequest/responseType_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/HttpRequest/setRequestHeader_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/HttpRequest/statusText_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
@@ -257,7 +257,7 @@
 LibTest/html/IFrameElement/hidden_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/IFrameElement/leftView_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/IFrameElement/offsetTo_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
-LibTest/html/IFrameElement/onClick_A01_t01: Timeout # co19-roll r607: Please triage this failure
+LibTest/html/IFrameElement/onClick_A01_t01: Skip # co19-roll r607: Please triage this failure
 LibTest/html/Window/close_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/Window/document_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
 LibTest/html/Window/find_A01_t01: RuntimeError # co19-roll r706: Please triage this failure.
@@ -462,7 +462,7 @@
 
 LayoutTests/fast/dom/HTMLAnchorElement/anchor-ismap-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLAnchorElement/get-href-attribute-port_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hash_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hostname_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -491,43 +491,43 @@
 LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-relative_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLDialogElement/top-layer-position-static_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLDocument/title-get_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLDocument/title-set_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-before-text-node_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-child-node_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text-form-control_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-children_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-remove-add-children_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-text-form-control-child_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto-text-form-control_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-auto_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-dir-value-change_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-empty-string_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-false-string_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-invalid-string_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-false_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-true_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-missing-parent-ancestor-missing_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-missing-parent-false_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-missing-parent-true_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/attr-true-string_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-before-text-node_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-child-node_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text-form-control_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-change-text_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-children_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-remove-add-children_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-text-form-control-child_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto-text-form-control_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-auto_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-dir-value-change_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-empty-string_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-false-string_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-invalid-string_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-false_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-missing-ancestor-true_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-missing-parent-ancestor-missing_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-missing-parent-false_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-missing-parent-true_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/attr-true-string_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLElement/insertAdjacentHTML-errors_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/set-false_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/set-inherit-parent-false_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/set-inherit-parent-true_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/set-false_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/set-inherit-parent-false_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/set-inherit-parent-true_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLElement/set-inner-outer-optimization_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/set-invalid-value_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/set-true_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLElement/set-value-caseinsensitive_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/set-invalid-value_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/set-true_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLElement/set-value-caseinsensitive_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLElement/spellcheck_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLElement/translate_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLFontElement/size-attribute_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLFormElement/move-option-between-documents_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLHtmlElement/duplicate-html-element-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLImageElement/image-src-absolute-url_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLImageElement/image-src-absolute-url_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLInputElement/cloned-input-checked-state_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLInputElement/input-hidden-value_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -536,22 +536,22 @@
 LayoutTests/fast/dom/HTMLInputElement/size-attribute_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLLabelElement/focus-label_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLLabelElement/label-control_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test-nonexistent_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test-nonexistent_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-existent-and-non-existent-import_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLLinkElement/link-onerror-stylesheet-with-non-existent-import_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLLinkElement/link-onerror_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLLinkElement/link-onload-stylesheet-with-import_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/onload-completion-test_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onerror_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/onload-completion-test_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-onerror_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLMeterElement/set-meter-properties_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLObjectElement/children-changed_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLObjectElement/set-type-to-null-crash_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLObjectElement/set-type-to-null-crash_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLOutputElement/dom-settable-token-list_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement-reset-event_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -560,31 +560,31 @@
 LayoutTests/fast/dom/HTMLOutputElement/htmloutputelement_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLProgressElement/indeterminate-progress-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLProgressElement/set-progress-properties_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/async-inline-script_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/dont-load-unknown-type_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/isURLAttribute_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/remove-source_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/async-inline-script_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/defer-script-invalid-url_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/dont-load-unknown-type_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/isURLAttribute_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/remove-source_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/script-async-attr_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/script-for-attribute-unexpected-execution_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLSelectElement/change-multiple-preserve-selection_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/script-for-attribute-unexpected-execution_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLSelectElement/change-multiple-preserve-selection_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLSelectElement/named-options_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLSelectElement/select-selectedOptions_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLSelectElement/selected-false_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/programmatically-add-style-with-onerror-handler_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/programmatically-add-style-with-onload-handler_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/style-onerror_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLStyleElement/style-onload_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLSelectElement/select-selectedOptions_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLSelectElement/selected-false_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/programmatically-add-style-with-onerror-handler_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/programmatically-add-style-with-onload-handler_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/style-onerror-with-existent-and-non-existent-import_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/style-onerror_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLStyleElement/style-onload_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTableElement/cellpadding-attribute_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLTableElement/insert-row_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTableElement/table-with-invalid-border_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTemplateElement/cloneNode_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTemplateElement/content-outlives-template-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -629,7 +629,7 @@
 LayoutTests/fast/dom/Node/fragment-mutation_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/NodeIterator/NodeIterator-basic_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/NodeList/invalidate-node-lists-when-parsing_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/NodeList/invalidate-node-lists-when-parsing_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/NodeList/nodelist-moved-to-fragment-2_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/NodeList/nodelist-reachable_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Range/13000_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -638,26 +638,26 @@
 LayoutTests/fast/dom/Range/create-contextual-fragment-script-not-ran_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Range/create-contextual-fragment-script-unmark-already-started_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Range/create-contextual-fragment_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/deleted-range-endpoints_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/getClientRects-character_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/deleted-range-endpoints_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/getClientRects-character_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Range/mutation_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/range-delete-contents-event-fire-crash_t01: Timeout, Pass # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-delete-contents-event-fire-crash_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Range/range-exceptions_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/range-expand_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/range-extractContents_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/range-modifycontents_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/range-on-detached-node_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-expand_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-extractContents_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-modifycontents_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/range-on-detached-node_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Range/range-processing-instructions_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Range/surroundContents-1_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/surroundContents-for-detached-node_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/Range/surroundContents-for-detached-node_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Selection/collapseToX-empty-selection_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Selection/getRangeAt_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/html/imports/import-element-removed-flag_t01: Timeout, RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/html/imports/import-element-removed-flag_t01: Skip, RuntimeError # co19-roll r722: Please triage this failure.
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t01: Skip # co19-roll r722: Please triage this failure.
 LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t05: Timeout # co19-roll r722: Please triage this failure.
+LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t05: Skip # co19-roll r722: Please triage this failure.
 LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/Element/getAttributeNS_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/IFrameElement/outerHtml_setter_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -666,10 +666,10 @@
 LibTest/html/IFrameElement/spellcheck_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/IFrameElement/tagName_A01_t03: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/IFrameElement/translate_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/Node/addEventListener_A01_t01: Timeout # co19-roll r722: Please triage this failure.
-LibTest/html/Node/addEventListener_A01_t03: Timeout # co19-roll r722: Please triage this failure.
-LibTest/html/Node/addEventListener_A01_t04: Timeout # co19-roll r722: Please triage this failure.
-LibTest/html/Node/addEventListener_A01_t05: Timeout # co19-roll r722: Please triage this failure.
+LibTest/html/Node/addEventListener_A01_t01: Skip # co19-roll r722: Please triage this failure.
+LibTest/html/Node/addEventListener_A01_t03: Skip # co19-roll r722: Please triage this failure.
+LibTest/html/Node/addEventListener_A01_t04: Skip # co19-roll r722: Please triage this failure.
+LibTest/html/Node/addEventListener_A01_t05: Skip # co19-roll r722: Please triage this failure.
 LibTest/html/Node/addEventListener_A01_t06: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/Node/append_A01_t02: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/Node/contains_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -679,11 +679,11 @@
 LibTest/html/Node/ownerDocument_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/Node/parent_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/Node/previousNode_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LibTest/html/Node/removeEventListener_A01_t01: Timeout # co19-roll r722: Please triage this failure.
-LibTest/html/Node/removeEventListener_A01_t02: Timeout # co19-roll r722: Please triage this failure.
+LibTest/html/Node/removeEventListener_A01_t01: Skip # co19-roll r722: Please triage this failure.
+LibTest/html/Node/removeEventListener_A01_t02: Skip # co19-roll r722: Please triage this failure.
 WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/Utils/test/asyncTestTimeout_t01: Timeout # co19-roll r722: Please triage this failure.
+WebPlatformTest/Utils/test/asyncTestTimeout_t01: Skip # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/EventTarget/dispatchEvent_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/EventTarget/dispatchEvent_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/events/defaultPrevented_A01_t05: RuntimeError # co19-roll r722: Please triage this failure.
@@ -1161,31 +1161,31 @@
 [ $compiler == dart2js && $runtime == jsshell ]
 LibTest/typed_data/Float32List/Float32List.view_A06_t01: fail # co19-roll r587: Please triage this failure
 LibTest/typed_data/Float32List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float32List/toList_A01_t01: fail, timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float32List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
 LibTest/typed_data/Float64List/Float64List.view_A06_t01: fail # co19-roll r587: Please triage this failure
 LibTest/typed_data/Float64List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Float64List/toList_A01_t01: fail, timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Float64List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
 LibTest/typed_data/Int16List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
 LibTest/typed_data/Int16List/Int16List.view_A06_t01: fail # co19-roll r587: Please triage this failure
 LibTest/typed_data/Int16List/toList_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int16List/toList_A01_t01: timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int16List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
 LibTest/typed_data/Int32List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
 LibTest/typed_data/Int32List/Int32List.view_A06_t01: fail # co19-roll r587: Please triage this failure
 LibTest/typed_data/Int32List/toList_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int32List/toList_A01_t01: timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int32List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
 LibTest/typed_data/Int8List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Int8List/toList_A01_t01: fail, timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Int8List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
 LibTest/typed_data/Uint16List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
 LibTest/typed_data/Uint16List/toList_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint16List/toList_A01_t01: timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint16List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
 LibTest/typed_data/Uint16List/Uint16List.view_A06_t01: fail # co19-roll r587: Please triage this failure
 LibTest/typed_data/Uint32List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint32List/toList_A01_t01: RuntimeError, timeout # issue 16934, co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint32List/toList_A01_t01: Skip # issue 16934, co19-roll r559: Please triage this failure
 LibTest/typed_data/Uint32List/Uint32List.view_A06_t01: fail # co19-roll r587: Please triage this failure
 LibTest/typed_data/Uint8ClampedList/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint8ClampedList/toList_A01_t01: fail, timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8ClampedList/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
 LibTest/typed_data/Uint8List/hashCode_A01_t01: fail # co19-roll r559: Please triage this failure
-LibTest/typed_data/Uint8List/toList_A01_t01: fail, timeout # co19-roll r559: Please triage this failure
+LibTest/typed_data/Uint8List/toList_A01_t01: Skip # co19-roll r559: Please triage this failure
 
 [ $compiler == dart2js && ($runtime == d8 || $runtime == jsshell) ]
 LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: fail # co19-roll r587: Please triage this failure
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 9f06144..2cfa47a 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -10,7 +10,7 @@
 LayoutTests/fast/dom/HTMLB*: Skip # Issue 18558
 
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Pass, Fail # Issue 13719: Please triage this failure.
-Language/14_Libraries_and_Scripts/3_Parts_A02_t02: Pass, Timeout # Issue 13719: Please triage this failure.
+Language/14_Libraries_and_Scripts/3_Parts_A02_t02: Skip # Issue 13719: Please triage this failure.
 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.
@@ -19,12 +19,12 @@
 LibTest/isolate/SendPort/send_A02_t05: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t06: Fail # Issue 13921
 LibTest/isolate/Isolate/spawnUri_A01_t01: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/isolate/Isolate/spawnUri_A01_t02: Timeout  # co19-roll r672: Please triage this failure
-LibTest/isolate/Isolate/spawnUri_A01_t03: Timeout # co19-roll r672: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A01_t02: Skip # co19-roll r672: Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A01_t03: Skip # co19-roll r672: Please triage this failure
 LibTest/isolate/Isolate/spawnUri_A01_t04: RuntimeError # co19-roll r672: Please triage this failure
 LibTest/isolate/Isolate/spawnUri_A01_t05: RuntimeError # co19-roll r672: Please triage this failure
 LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError # co19-roll r672: Please triage this failure
-LibTest/isolate/Isolate/spawnUri_A02_t04: Pass, Timeout # Please triage this failure
+LibTest/isolate/Isolate/spawnUri_A02_t04: Skip # Please triage this failure
 
 LibTest/isolate/RawReceivePort/RawReceivePort_A01_t01: RuntimeError # Issue 13921
 LibTest/isolate/RawReceivePort/RawReceivePort_A01_t02: RuntimeError # Issue 13921
@@ -99,21 +99,21 @@
 
 # New Dartium failures on new co19 browser tests in co19 revision 706.
 
-LibTest/html/Element/blur_A01_t01: Timeout, Pass # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/blur_A01_t01: Timeout, Pass # Issue 17758.  Please triage this failure.
-LibTest/html/Element/focus_A01_t01: Timeout, Pass # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/focus_A01_t01: Timeout, Pass # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/enteredView_A01_t01: Timeout # Issue 17758.  Please triage this failure.
-LibTest/html/IFrameElement/leftView_A01_t01: Timeout, RuntimeError # Issue 17758.  Please triage this failure.
-LibTest/html/HttpRequest/onError_A01_t02: Timeout # Issue 17758.  Please triage this failure.
-LibTest/html/HttpRequest/responseText_A01_t02: Timeout # Issue 17758.  Please triage this failure.
-LibTest/html/HttpRequestUpload/onError_A01_t02: Timeout # Issue 17758.  Please triage this failure.
-LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Timeout # Issue 17758.  Please triage this failure.
-LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Timeout # Issue 17758.  Please triage this failure.
-LibTest/html/HttpRequestUpload/onLoad_A01_t01: Timeout # Issue 17758.  Please triage this failure.
-WebPlatformTest/dom/events/event_constants/constants_A01_t01: Timeout, Pass # Issue 17758.  Please triage this failure.
-WebPlatformTest/dom/events/event_constructors/Event_A01_t01: Timeout, Pass # Issue 17758.  Please triage this failure.
-WebPlatformTest/dom/events/event_constructors/Event_A02_t01: Timeout, Pass # Issue 17758.  Please triage this failure.
+LibTest/html/Element/blur_A01_t01: Skip # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/blur_A01_t01: Skip # Issue 17758.  Please triage this failure.
+LibTest/html/Element/focus_A01_t01: Skip # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/focus_A01_t01: Skip # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/enteredView_A01_t01: Skip # Issue 17758.  Please triage this failure.
+LibTest/html/IFrameElement/leftView_A01_t01: Skip # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequest/onError_A01_t02: Skip # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequest/responseText_A01_t02: Skip # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequestUpload/onError_A01_t02: Skip # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequestUpload/onLoadEnd_A01_t01: Skip # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequestUpload/onLoadStart_A01_t01: Skip # Issue 17758.  Please triage this failure.
+LibTest/html/HttpRequestUpload/onLoad_A01_t01: Skip # Issue 17758.  Please triage this failure.
+WebPlatformTest/dom/events/event_constants/constants_A01_t01: Skip # Issue 17758.  Please triage this failure.
+WebPlatformTest/dom/events/event_constructors/Event_A01_t01: Skip # Issue 17758.  Please triage this failure.
+WebPlatformTest/dom/events/event_constructors/Event_A02_t01: Skip # Issue 17758.  Please triage this failure.
 
 LayoutTests/fast/dom/DOMImplementation/createDocument-namespace-err_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/dom/Document/CaretRangeFromPoint/basic_t01: RuntimeError # Issue 17758.  Please triage this failure.
@@ -191,7 +191,7 @@
 
 LibTest/async/Timer/Timer_A01_t01: RuntimeError, Pass # Issue 16475
 
-LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Timeout, Pass # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLAnchorElement/remove-href-from-focused-anchor_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hash_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-host_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-hostname_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -224,12 +224,12 @@
 LayoutTests/fast/dom/HTMLImageElement/image-alt-text_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLImageElement/parse-src_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLInputElement/input-image-alt-text_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Timeout # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-and-subresource-test_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/link-beforeload-recursive_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-onload_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLLinkElement/prefetch_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLLinkElement/resolve-url-on-insertion_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLObjectElement/beforeload-set-text-crash_t01: Skip # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLObjectElement/children-changed_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/script-set-src_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
 LibTest/html/IFrameElement/outerHtml_setter_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -268,10 +268,10 @@
 WebPlatformTest/shadow-dom/events/event-retargeting/test-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/event-retargeting/test-004_t01: RuntimeError # co19-roll r722: Please triage this failure.
 
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError, Timeout, Pass # co19-roll r722: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: Pass, Timeout # co19-roll r722: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: Pass, Timeout, RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: Pass, Timeout # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t01: RuntimeError, Skip # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t02: Skip # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t05: Skip # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-001_t06: Skip # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-002_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/events/retargeting-focus-events/test-003_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
 
@@ -284,10 +284,9 @@
 WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-007_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: Timeout, Pass # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Timeout, Pass # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDocument/active-element-gets-unforcusable_t01: Skip # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLDocument/set-focus-on-valid-element_t01: Skip # co19-roll r722: Please triage this failure.
 LibTest/html/Window/requestFileSystem_A01_t02: RuntimeError,Pass # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLOptionElement/collection-setter-getter_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -300,27 +299,23 @@
 LayoutTests/fast/dom/HTMLTemplateElement/custom-element-wrapper-gc_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTemplateElement/innerHTML_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLTemplateElement/ownerDocumentXHTML_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/MutationObserver/database-callback-delivery_t01: RuntimeError # Issue 18931
 LayoutTests/fast/dom/MutationObserver/observe-attributes_t01: RuntimeError # Issue 18931
 LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/NodeIterator/NodeIterator-basic_t01: RuntimeError # Issue 18931
 LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
-LayoutTests/fast/html/imports/import-element-removed-flag_t01: Timeout # co19-roll r722: Please triage this failure.
-LibTest/collection/ListBase/ListBase_class_A01_t01: Pass, Timeout # co19-roll r722: Please triage this failure.
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: Pass, Timeout # co19-roll r722: Please triage this failure.
+LayoutTests/fast/html/imports/import-element-removed-flag_t01: Skip # co19-roll r722: Please triage this failure.
+LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # co19-roll r722: Please triage this failure.
+LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip # co19-roll r722: Please triage this failure.
 LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t03: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/CanvasRenderingContext2D/addEventListener_A01_t06: RuntimeError # co19-roll r722: Please triage this failure.
 LibTest/html/Element/getAttributeNS_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/Utils/test/asyncTestFail_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/Utils/test/asyncTestFail_t02: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/Utils/test/asyncTestTimeout_t01: Timeout # co19-roll r722: Please triage this failure.
+WebPlatformTest/Utils/test/asyncTestTimeout_t01: Skip # co19-roll r722: Please triage this failure.
 WebPlatformTest/Utils/test/testFail_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/EventTarget/addEventListener_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/EventTarget/dispatchEvent_A02_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/EventTarget/dispatchEvent_A03_t01: Timeout # co19-roll r722: Please triage this failure.
-WebPlatformTest/dom/EventTarget/removeEventListener_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/dom/EventTarget/dispatchEvent_A03_t01: Skip # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/events/type_A01_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/DOMImplementation-createDocument_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/DOMImplementation-createDocumentType_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
@@ -378,6 +373,7 @@
 WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-body-context_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-context_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
 
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
 LibTest/math/log_A01_t01: Pass, Fail # co19 issue 44.
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 7fbd470..151ebc9 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -49,6 +49,11 @@
 LibTest/typed_data/Float32x4/reciprocalSqrt_A01_t01: Pass, Fail # co19 issue 599
 LibTest/typed_data/Float32x4/reciprocal_A01_t01: Pass, Fail # co19 issue 599
 
+# With asynchronous loading, the load errors in these tests are no longer recognized as compile errors:
+Language/14_Libraries_and_Scripts/1_Imports_A04_t02: Fail
+Language/14_Libraries_and_Scripts/2_Exports_A05_t02: Fail
+Language/14_Libraries_and_Scripts/3_Parts_A01_t06: Fail
+
 [ $runtime == vm ]
 # These flaky tests also fail with dart2dart.
 LibTest/math/MutableRectangle/MutableRectangle.fromPoints_A01_t01: Pass, RuntimeError # co19-roll r607: Please triage this failure
diff --git a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
index 81ead79..a9b9b5a 100644
--- a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
@@ -18,9 +18,12 @@
   // and classes, are used in production code.*/
   // Helper methods for debugging should never be called from production code:
   "implementation/helpers/": const [" is never "],
-  
+
   // Some things in dart_printer are not yet used
-  "implementation/dart_backend/dart_printer.dart" : const [" is never "]
+  "implementation/dart_backend/dart_printer.dart" : const [" is never "],
+
+  // Setlet implements the Set interface: Issue 18959.
+  "implementation/util/setlet.dart": const [" is never "],
 };
 
 void main() {
diff --git a/tests/compiler/dart2js/command_line_split_test.dart b/tests/compiler/dart2js/command_line_split_test.dart
new file mode 100644
index 0000000..22e5b88
--- /dev/null
+++ b/tests/compiler/dart2js/command_line_split_test.dart
@@ -0,0 +1,16 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+import '../../../sdk/lib/_internal/compiler/implementation/util/command_line.dart';
+
+main() {
+  Expect.listEquals(["foo", "bar"], splitLine("foo bar"));
+  Expect.listEquals(["foo bar"], splitLine(r"foo\ bar"));
+  Expect.listEquals(["foo'", '"bar'], splitLine(r"""foo\' \"bar"""));
+  Expect.listEquals(["foo'", '"bar'], splitLine(r"""foo"'" '"'bar"""));
+  Expect.listEquals(["foo", "bar"], splitLine("'f''o''o' " + '"b""a""r"'));
+  Expect.listEquals(["\n", "\t", "\t", "\b", "\f", "\v", "\\", "a", "Z", "-"],
+                    splitLine(r"\n \t \t \b \f \v \\ \a \Z \-"));
+}
diff --git a/tests/compiler/dart2js/dart2js_batch_test.dart b/tests/compiler/dart2js/dart2js_batch_test.dart
new file mode 100644
index 0000000..fab3d8c
--- /dev/null
+++ b/tests/compiler/dart2js/dart2js_batch_test.dart
@@ -0,0 +1,98 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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:convert';
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+
+var tmpDir;
+
+copyDirectory(Directory sourceDir, Directory destinationDir) {
+  sourceDir.listSync().forEach((FileSystemEntity element) {
+    String newPath = path.join(destinationDir.path,
+                               path.basename(element.path));
+    if (element is File) {
+      element.copySync(newPath);
+    } else if (element is Directory) {
+      Directory newDestinationDir = new Directory(newPath);
+      newDestinationDir.createSync();
+      copyDirectory(element, newDestinationDir);
+    }
+  });
+}
+
+Future<Directory> createTempDir() {
+  return Directory.systemTemp
+      .createTemp('dart2js_batch_test-')
+      .then((Directory dir) {
+    return dir;
+  });
+}
+
+Future setup() {
+  return createTempDir().then((Directory directory) {
+    tmpDir = directory;
+    Directory sunflowerDir = new Directory.fromUri(
+        Platform.script.resolve('../../../samples/sunflower'));
+
+    print("Copying '${sunflowerDir.path}' to '${tmpDir.path}'.");
+    copyDirectory(sunflowerDir, tmpDir);
+  });
+}
+
+void cleanUp() {
+  print("Deleting '${tmpDir.path}'.");
+  tmpDir.deleteSync(recursive: true);
+}
+
+Future launchDart2Js(_) {
+  String ext = Platform.isWindows ? '.bat' : '';
+  String command =
+      path.normalize(path.join(path.fromUri(Platform.script),
+                    '../../../../sdk/bin/dart2js${ext}'));
+  print("Running '$command --batch' from '${tmpDir}'.");
+  return Process.start(command, ['--batch'], workingDirectory: tmpDir.path);
+}
+
+Future runTests(Process process) {
+  String inFile = path.join(tmpDir.path, 'web/sunflower.dart');
+  String outFile = path.join(tmpDir.path, 'out.js');
+  String outFile2 = path.join(tmpDir.path, 'out2.js');
+
+  process.stdin.writeln("--out='$outFile' '$inFile'");
+  process.stdin.writeln("--out='$outFile2' '$inFile'");
+  process.stdin.writeln("too many arguments");
+  process.stdin.writeln(r"non\ existing\ file.dart");
+  process.stdin.close();
+  Future<String> output = process.stdout.transform(UTF8.decoder).join();
+  Future<String> errorOut = process.stderr.transform(UTF8.decoder).join();
+  return Future.wait([output, errorOut])
+        .then((result) {
+      String stdoutOutput = result[0];
+      String stderrOutput = result[1];
+      Expect.equals("""
+>>> EOF STDERR
+>>> EOF STDERR
+>>> EOF STDERR
+>>> EOF STDERR
+""", stderrOutput);
+      Expect.isTrue(stdoutOutput.startsWith(">>> TEST OK\n>>> TEST OK\n"));
+      Expect.equals(2, ">>> TEST FAIL".allMatches(stdoutOutput).length);
+      Expect.equals(4, ">>>".allMatches(stdoutOutput).length);
+    });
+}
+
+void main() {
+  var tmpDir;
+  asyncTest(() {
+    return setup()
+        .then(launchDart2Js)
+        .then(runTests)
+        .whenComplete(cleanUp);
+  });
+}
diff --git a/tests/compiler/dart2js/dump_info_test.dart b/tests/compiler/dart2js/dump_info_test.dart
index e34e828..374b862 100644
--- a/tests/compiler/dart2js/dump_info_test.dart
+++ b/tests/compiler/dart2js/dump_info_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
-import 'dart:async';
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'memory_compiler.dart';
+import '../../../sdk/lib/_internal/compiler/implementation/dump_info.dart';
 
 const String TEST_ONE = r"""
 library main;
@@ -15,36 +15,56 @@
 
 class c {
   final int m;
-  c(this.m);
+  c(this.m) {
+    () {} ();  // TODO (sigurdm): Empty closure, hack to avoid inlining.
+    a = 1;
+  }
+  foo() {
+    () {} ();
+    k = 2;
+    print(k);
+    print(p);
+  }
+  var k = (() => 10)();
+  final static p = 20;
 }
 
 void f() {
-  () {} (); // TODO (sigurdm): Empty closure, hack to avoid inlining.
-  a = 2;
+  () {} ();
+  a = 3;
 }
 
 main() {
+  print(a);
   f();
-  new c(2);
+  print(new c(2).foo());
 }
 """;
 
 main() {
-  var compiler = compilerFor({'main.dart': TEST_ONE});
+  var compiler = compilerFor({'main.dart': TEST_ONE}, options: ["--dump-info"]);
   asyncTest(() => compiler.runCompiler(Uri.parse('memory:main.dart')).then((_) {
-    var info = compiler.dumpInfoTask.collectDumpInfo();
+    var visitor = compiler.dumpInfoTask.infoDumpVisitor;
+    var info = visitor.collectDumpInfo();
     var mainlib = info.libraries[0];
     Expect.stringEquals("main", mainlib.name);
-    var contents = mainlib.contents;
+    List contents = mainlib.contents;
     Expect.stringEquals("main", mainlib.name);
-    Expect.stringEquals("a", contents[0].name);
-    Expect.stringEquals("c", contents[1].name);
-    Expect.stringEquals("f", contents[2].name);
-    Expect.stringEquals("main", contents[3].name);
+    print(mainlib.contents.map((e)=> e.name));
+    var a = contents.singleWhere((e) => e.name == "a");
+    var c = contents.singleWhere((e) => e.name == "c");
+    var f = contents.singleWhere((e) => e.name == "f");
+    var main = contents.singleWhere((e) => e.name == "main");
     Expect.stringEquals("library", mainlib.kind);
-    Expect.stringEquals("field", contents[0].kind);
-    Expect.stringEquals("class", contents[1].kind);
-    Expect.stringEquals("function", contents[2].kind);
-    Expect.stringEquals("function", contents[3].kind);
+    Expect.stringEquals("field", a.kind);
+    Expect.stringEquals("class", c.kind);
+    var constructor = c.contents.singleWhere((e) => e.name == "c");
+    Expect.stringEquals("constructor", constructor.kind);
+    var method = c.contents.singleWhere((e) => e.name == "foo");
+    Expect.stringEquals("method", method.kind);
+    var field = c.contents.singleWhere((e) => e.name == "m");
+    Expect.stringEquals("field", field.kind);
+    Expect.stringEquals("function", f.kind);
+    Expect.stringEquals("function", main.kind);
   }));
 }
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index f2656a2..4f78840 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -59,7 +59,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 = 378;
+    int expectedMethodCount = 380;
     Expect.isTrue(
         generatedCode.length <= expectedMethodCount,
         'Too many compiled methods: '
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index 4d4123d..af82c4a 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -420,20 +420,23 @@
 
   TreeElementMapping resolveNodeStatement(Node tree, Element element) {
     ResolverVisitor visitor =
-        new ResolverVisitor(this, element, new CollectingTreeElements(element));
+        new ResolverVisitor(this, element,
+            new ResolutionRegistry.internal(this,
+                new CollectingTreeElements(element)));
     if (visitor.scope is LibraryScope) {
       visitor.scope = new MethodScope(visitor.scope, element);
     }
     visitor.visit(tree);
     visitor.scope = new LibraryScope(element.library);
-    return visitor.mapping;
+    return visitor.registry.mapping;
   }
 
   resolverVisitor() {
     Element mockElement = new MockElement(mainApp.entryCompilationUnit);
     ResolverVisitor visitor =
         new ResolverVisitor(this, mockElement,
-                            new CollectingTreeElements(mockElement));
+          new ResolutionRegistry.internal(this,
+              new CollectingTreeElements(mockElement)));
     visitor.scope = new MethodScope(visitor.scope, mockElement);
     return visitor;
   }
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 1080622..4e88fb0 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -127,7 +127,7 @@
   matchResolvedTypes(visitor, text, name, expectedElements) {
     VariableDefinitions definition = parseStatement(text);
     visitor.visit(definition.type);
-    InterfaceType type = visitor.mapping.getType(definition.type);
+    InterfaceType type = visitor.registry.mapping.getType(definition.type);
     Expect.equals(definition.type.typeArguments.slowLength(),
                   length(type.typeArguments));
     int index = 0;
@@ -194,7 +194,9 @@
   FunctionElement fooA = classA.lookupLocalMember("foo");
 
   ResolverVisitor visitor =
-      new ResolverVisitor(compiler, fooB, new CollectingTreeElements(fooB));
+      new ResolverVisitor(compiler, fooB,
+          new ResolutionRegistry.internal(compiler,
+              new CollectingTreeElements(fooB)));
   FunctionExpression node = fooB.parseNode(compiler);
   visitor.visit(node.body);
   Map mapping = map(visitor);
@@ -232,7 +234,8 @@
   FunctionElement funElement = fooElement.lookupLocalMember("foo");
   ResolverVisitor visitor =
       new ResolverVisitor(compiler, funElement,
-                          new CollectingTreeElements(funElement));
+          new ResolutionRegistry.internal(compiler,
+              new CollectingTreeElements(funElement)));
   FunctionExpression function = funElement.parseNode(compiler);
   visitor.visit(function.body);
   Map mapping = map(visitor);
@@ -253,7 +256,8 @@
   fooElement = compiler.mainApp.find("Foo");
   funElement = fooElement.lookupLocalMember("foo");
   visitor = new ResolverVisitor(compiler, funElement,
-                                new CollectingTreeElements(funElement));
+      new ResolutionRegistry.internal(compiler,
+          new CollectingTreeElements(funElement)));
   function = funElement.parseNode(compiler);
   visitor.visit(function.body);
   Expect.equals(0, compiler.warnings.length);
@@ -337,16 +341,18 @@
   List statements1 = thenPart.statements.nodes.toList();
   Node def1 = statements1[0].definitions.nodes.head;
   Node id1 = statements1[1].expression;
-  Expect.equals(visitor.mapping[def1], visitor.mapping[id1]);
+  Expect.equals(visitor.registry.mapping[def1], visitor.registry.mapping[id1]);
 
   Block elsePart = tree.elsePart;
   List statements2 = elsePart.statements.nodes.toList();
   Node def2 = statements2[0].definitions.nodes.head;
   Node id2 = statements2[1].expression;
-  Expect.equals(visitor.mapping[def2], visitor.mapping[id2]);
+  Expect.equals(visitor.registry.mapping[def2], visitor.registry.mapping[id2]);
 
-  Expect.notEquals(visitor.mapping[def1], visitor.mapping[def2]);
-  Expect.notEquals(visitor.mapping[id1], visitor.mapping[id2]);
+  Expect.notEquals(visitor.registry.mapping[def1],
+                   visitor.registry.mapping[def2]);
+  Expect.notEquals(visitor.registry.mapping[id1],
+                   visitor.registry.mapping[id2]);
 }
 
 testParametersOne() {
@@ -359,14 +365,14 @@
   // Check that an element has been created for the parameter.
   VariableDefinitions vardef = tree.parameters.nodes.head;
   Node param = vardef.definitions.nodes.head;
-  Expect.equals(ElementKind.PARAMETER, visitor.mapping[param].kind);
+  Expect.equals(ElementKind.PARAMETER, visitor.registry.mapping[param].kind);
 
   // Check that 'a' in 'return a' is resolved to the parameter.
   Block body = tree.body;
   Return ret = body.statements.nodes.head;
   Send use = ret.expression;
-  Expect.equals(ElementKind.PARAMETER, visitor.mapping[use].kind);
-  Expect.equals(visitor.mapping[param], visitor.mapping[use]);
+  Expect.equals(ElementKind.PARAMETER, visitor.registry.mapping[use].kind);
+  Expect.equals(visitor.registry.mapping[param], visitor.registry.mapping[use]);
 }
 
 testFor() {
@@ -381,7 +387,7 @@
 
   VariableDefinitions initializer = tree.initializer;
   Node iNode = initializer.definitions.nodes.head;
-  Element iElement = visitor.mapping[iNode];
+  Element iElement = visitor.registry.mapping[iNode];
 
   // Check that we have the expected nodes. This test relies on the mapping
   // field to be a linked hash map (preserving insertion order).
@@ -531,7 +537,9 @@
   compiler.parseScript("abstract class Bar {}");
 
   ResolverVisitor visitor =
-      new ResolverVisitor(compiler, null, new CollectingTreeElements(null));
+      new ResolverVisitor(compiler, null,
+          new ResolutionRegistry.internal(compiler,
+              new CollectingTreeElements(null)));
   compiler.resolveStatement("Foo bar;");
 
   ClassElement fooElement = compiler.mainApp.find('Foo');
@@ -656,7 +664,8 @@
   FunctionExpression tree = element.parseNode(compiler);
   ResolverVisitor visitor =
       new ResolverVisitor(compiler, element,
-                          new CollectingTreeElements(element));
+          new ResolutionRegistry.internal(compiler,
+              new CollectingTreeElements(element)));
   new InitializerResolver(visitor).resolveInitializers(element, tree);
   visitor.visit(tree.body);
   Expect.equals(expectedElementCount, map(visitor).length);
@@ -872,7 +881,7 @@
 }
 
 map(ResolverVisitor visitor) {
-  CollectingTreeElements elements = visitor.mapping;
+  CollectingTreeElements elements = visitor.registry.mapping;
   return elements.map;
 }
 
diff --git a/tests/compiler/dart2js_extra/inference_nsm_mirrors_test.dart b/tests/compiler/dart2js_extra/inference_nsm_mirrors_test.dart
index 8875dc0..46a9737 100644
--- a/tests/compiler/dart2js_extra/inference_nsm_mirrors_test.dart
+++ b/tests/compiler/dart2js_extra/inference_nsm_mirrors_test.dart
@@ -22,5 +22,8 @@
 
 main() {
   Expect.equals(42, new B().foo(0));
-  Expect.throws(() => new A().foo('foo'), (e) => e is UnsupportedError);
+  // In checked mode we should get a type error. In unchecked mode it should be
+  // an argument error.
+  Expect.throws(() => new A().foo('foo'),
+                (e) => e is ArgumentError || e is TypeError);
 }
diff --git a/tests/corelib/collection_to_string_test.dart b/tests/corelib/collection_to_string_test.dart
index 97f25bc..67608ffb 100644
--- a/tests/corelib/collection_to_string_test.dart
+++ b/tests/corelib/collection_to_string_test.dart
@@ -330,10 +330,10 @@
     result = random(1000);
     stringRep.write(result);
   } else if (elementTypeFrac < 2/3) {
-    // Element Is a random (new) collection
+    // Element is a random (new) collection
     result = randomCollectionHelper(size, exact, stringRep, beingMade);
   } else {
-    // Element Is a random recursive ref
+    // Element is a random recursive ref
     result = beingMade[random(beingMade.length)];
     if (result is List) {
       stringRep.write('[...]');
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 71bd37c..373b67b 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -70,7 +70,7 @@
 [ $runtime == ie9 ]
 double_round4_test: Fail, OK # IE bug: Math.round(4503599627370497) != 4503599627370497.
 double_round_to_double3_test: Fail, OK # IE bug: Math.round(4503599627370497) != 4503599627370497.
-collection_length_test: Pass, Timeout # Issue 12844
+collection_length_test: Skip # Issue 12844
 
 [ $runtime == opera ]
 core_runtime_types_test: Fail
diff --git a/tests/corelib/set_test.dart b/tests/corelib/set_test.dart
index 32ec520..8867126 100644
--- a/tests/corelib/set_test.dart
+++ b/tests/corelib/set_test.dart
@@ -11,6 +11,8 @@
 void testMain(Set create()) {
   testInts(create);
   testStrings(create);
+  testInts(() => create().toSet());
+  testStrings(() => create().toSet());
 }
 
 void testInts(Set create()) {
@@ -190,6 +192,29 @@
   testLength(0, set);
   Expect.isTrue(set.add(11));
   testLength(1, set);
+
+  // Test Set.toSet.
+  set.add(1);
+  set.add(21);
+  testLength(3, set);
+  var set2 = set.toSet();
+  testLength(3, set2);
+  Expect.listEquals(set.toList(), set2.toList());
+  set.add(31);
+  testLength(4, set);
+  testLength(3, set2);
+
+  set2 = set.toSet()..clear();
+  testLength(0, set2);
+  Expect.isTrue(set2.add(11));
+  Expect.isTrue(set2.add(1));
+  Expect.isTrue(set2.add(21));
+  Expect.isTrue(set2.add(31));
+  testLength(4, set2);
+  Expect.listEquals(set.toList(), set2.toList());
+
+  set2 = (set.toSet()..clear()).toSet();  // Cloning empty set shouldn't fail.
+  testLength(0, set2);
 }
 
 void testLength(int length, Set set) {
@@ -359,9 +384,35 @@
   return i1 - i2;
 }
 
+void testIdentity(Set create()) {
+  Set set = create();
+  var e1 = new CE(0);
+  var e2 = new CE(0);
+  Expect.equals(e1, e2);
+  Expect.isFalse(identical(e1, e2));
+
+  testLength(0, set);
+  set.add(e1);
+  testLength(1, set);
+  Expect.isTrue(set.contains(e1));
+  Expect.isFalse(set.contains(e2));
+
+  set.add(e2);
+  testLength(2, set);
+  Expect.isTrue(set.contains(e1));
+  Expect.isTrue(set.contains(e2));
+
+  var set2 = set.toSet();
+  testLength(2, set2);
+  Expect.isTrue(set2.contains(e1));
+  Expect.isTrue(set2.contains(e2));
+}
+
 main() {
   testMain(() => new HashSet());
   testMain(() => new LinkedHashSet());
+  testMain(() => new HashSet.identity());
+  testMain(() => new LinkedHashSet.identity());
   testMain(() => new HashSet(equals: identical));
   testMain(() => new LinkedHashSet(equals: identical));
   testMain(() => new HashSet(equals: (a, b) => a == b,
@@ -373,6 +424,12 @@
       isValidKey: (a) => true));
   testMain(() => new SplayTreeSet());
 
+  testIdentity(() => new HashSet.identity());
+  testIdentity(() => new LinkedHashSet.identity());
+  testIdentity(() => new HashSet(equals: identical));
+  testIdentity(() => new LinkedHashSet(equals: identical));
+  testIdentity(() => new SplayTreeSet(identityCompare));
+
   testTypeAnnotations(new HashSet<int>());
   testTypeAnnotations(new LinkedHashSet<int>());
   testTypeAnnotations(new HashSet<int>(equals: identical));
@@ -400,5 +457,4 @@
                         isValidKey: validKey));
   testDifferenceIntersection(([equals, hashCode, validKey, comparator]) =>
       new SplayTreeSet(comparator, validKey));
-
 }
diff --git a/tests/html/html.status b/tests/html/html.status
index eb67279..6992f91 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -13,7 +13,6 @@
 form_data_test/functional: Fail # Issue 18931 (Disabled for Chrome 35 roll)
 indexeddb_5_test: Fail # Issue 18931 (Disabled for Chrome 35 roll)
 custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Issue 18931 (Disabled for Chrome 35 roll)
-websql_test/functional: Fail # Issue 18931 (Disabled for Chrome 35 roll)
 
 [ $compiler == dart2js && $csp ]
 custom/js_custom_test: Fail # Issue 14643
@@ -212,7 +211,7 @@
 
 [ $runtime == ie9 ]
 event_customevent_test: Fail # Issue 14170
-isolates_test: Timeout # Issue 13027
+isolates_test: Skip # Issue 13027
 blob_constructor_test: Fail
 custom/document_register_type_extensions_test/namespaces: Fail # Issue 13193
 dom_constructors_test: Fail
@@ -230,8 +229,8 @@
 xhr_cross_origin_test: Skip # Issue 12920
 xhr_test/json: Fail # IE9 returns null because of unsupported type
 js_test: RuntimeError # Issue 14645
-custom: Pass, Fail, Timeout # Issue 16717
-custom_elements_test: Pass, Fail, Timeout # Issue 16717
+custom: Skip # Issue 16717
+custom_elements_test: Skip # Issue 16717
 
 # IE9 Feature support statuses-
 # All changes should be accompanied by platform support annotation changes.
diff --git a/tests/html/postmessage_structured_test.dart b/tests/html/postmessage_structured_test.dart
index 9ceeebc..1dc65d7 100644
--- a/tests/html/postmessage_structured_test.dart
+++ b/tests/html/postmessage_structured_test.dart
@@ -149,4 +149,17 @@
     go('typed_arrays_list', typed_arrays_list);
   });
 
+  group('iframe', () {
+    test('postMessage clones data', () {
+      var iframe = new IFrameElement();
+      var future = iframe.onLoad.first.then((_) {
+        iframe.contentWindow.postMessage(new HashMap<String,num>(), '*');
+      });
+      iframe.src = 'about:blank';
+      document.body.append(iframe);
+
+      return future;
+    });
+  });
+
 }
diff --git a/tests/isolate/object_leak_test.dart b/tests/isolate/object_leak_test.dart
new file mode 100644
index 0000000..4511b43
--- /dev/null
+++ b/tests/isolate/object_leak_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Regression test for http://dartbug.com/18942
+
+library LeakTest;
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+import 'dart:isolate';
+import 'dart:async';
+
+
+class A {
+  var x = 0;
+}
+
+fun(msg) {
+  print("received: ${msg.x}");
+  msg.x = 1;
+  print("done updating: ${msg.x}");
+}
+
+main() {
+  asyncStart();
+  var a = new A();
+  // Sending an A object to another isolate should not work.
+  Isolate.spawn(fun, a).then((isolate) {
+    new Timer(const Duration(milliseconds: 300), () {
+      // Changes in other isolate must not reach here.
+      Expect.equals(0, a.x);
+      asyncEnd();
+    });
+  }, onError: (e) {
+    // Sending an A isn't required to work.
+    // It works in the VM, but not in dart2js.
+    print("Send of A failed:\n$e");
+    asyncEnd();
+  });
+}
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 196ad26..32d0f1c 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -166,12 +166,6 @@
 
 # missing warning for override
 override_inheritance_generic_test/07: MissingStaticWarning # Issue 16135
-override_inheritance_generic_test/09: MissingStaticWarning # Issue 16135
-
-# flaky override tests
-override_inheritance_field_test/33: MissingStaticWarning, Pass # Issue 16498
-override_inheritance_field_test/33a: MissingStaticWarning, Pass # Issue 16498
-override_inheritance_generic_test/09: MissingStaticWarning, Pass # Issue 16498
 
 # The following tests are currently assumed to be failing because the test is wrong.
 #
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index fd819b5..8190432 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -15,8 +15,6 @@
 
 type_check_const_function_typedef2_test/00: MissingCompileTimeError, Ok # Compile-time error in checked mode, because of constants.
 
-call_closurization_test: StaticWarning # Issue 17476
-
 # Please add new failing tests before this line.
 # Section below is for invalid tests.
 #
@@ -165,7 +163,6 @@
 override_inheritance_generic_test/08: MissingStaticWarning # Issue 17983
 override_inheritance_field_test/32: MissingStaticWarning # Issue 17983
 override_inheritance_field_test/09: MissingStaticWarning # Issue 17983
-override_inheritance_abstract_test/27: StaticWarning # Issue 17983
 
 # missing warning for override
 override_inheritance_generic_test/07: MissingStaticWarning # Issue 16135
@@ -176,8 +173,6 @@
 override_inheritance_field_test/33a: MissingStaticWarning, Pass # Issue 16498
 override_inheritance_generic_test/09: MissingStaticWarning, Pass # Issue 16498
 
-abstract_object_method_test: StaticWarning # Issue 14527
-
 # The following tests are currently assumed to be failing because the test is wrong.
 #
 application_negative_test: CompileTimeError # Test Issue 14528
diff --git a/tests/language/rewrite_while_test.dart b/tests/language/rewrite_while_test.dart
new file mode 100644
index 0000000..5bb1105
--- /dev/null
+++ b/tests/language/rewrite_while_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:expect/expect.dart";
+
+baz() {}
+
+loop1(x) {
+    var n = 0;
+    while (n < x) {
+        n = n + 1;
+    }
+    return n;
+}
+
+loop2(x) {
+    var n = 0;
+    if (x < 100) {
+        while (n < x) {
+            n = n + 1;
+        }
+    }
+    baz();
+    return n;
+}
+
+main() {
+    Expect.equals(10, loop1(10));
+    Expect.equals(10, loop2(10));
+    Expect.equals(0, loop2(200));
+}
diff --git a/tests/language/try_catch_optimized3_test.dart b/tests/language/try_catch_optimized3_test.dart
new file mode 100644
index 0000000..18ca114
--- /dev/null
+++ b/tests/language/try_catch_optimized3_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.
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+
+import "package:expect/expect.dart";
+
+// Test unboxed double operations inside try-catch.
+foo(bool b) {
+  if (b) throw 123;
+}
+
+test_double(double x, bool b) {
+  try {
+    x += 1.0;
+    foo(b);
+  } catch (e) {
+    var result = x - 1.0;
+    Expect.equals(1.0, result);
+    return result;
+  }
+}
+
+main() {
+  for (var i=0; i<100; i++) test_double(1.0, false);
+  test_double(1.0, false);
+  Expect.equals(1.0, test_double(1.0, true));
+}
+
diff --git a/tests/lib/async/stream_timeout_test.dart b/tests/lib/async/stream_timeout_test.dart
index eac7100..e085496 100644
--- a/tests/lib/async/stream_timeout_test.dart
+++ b/tests/lib/async/stream_timeout_test.dart
@@ -67,7 +67,7 @@
   test("broadcast stream timeout",  () {
     StreamController c = new StreamController.broadcast();
     Stream tos = c.stream.timeout(ms5);
-    expect(tos.isBroadcast, false);
+    expect(tos.isBroadcast, true);
     tos.handleError(expectAsync((e, s) {
       expect(e, new isInstanceOf<TimeoutException>());
       expect(s, null);
@@ -77,7 +77,7 @@
   test("asBroadcast stream timeout",  () {
     StreamController c = new StreamController.broadcast();
     Stream tos = c.stream.asBroadcastStream().timeout(ms5);
-    expect(tos.isBroadcast, false);
+    expect(tos.isBroadcast, true);
     tos.handleError(expectAsync((e, s) {
       expect(e, new isInstanceOf<TimeoutException>());
       expect(s, null);
diff --git a/tests/lib/async/stream_transformation_broadcast_test.dart b/tests/lib/async/stream_transformation_broadcast_test.dart
new file mode 100644
index 0000000..11928fe
--- /dev/null
+++ b/tests/lib/async/stream_transformation_broadcast_test.dart
@@ -0,0 +1,184 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test that transformations like `map` and `where` preserve broadcast flag.
+library stream_join_test;
+
+import 'dart:async';
+import 'event_helper.dart';
+import 'package:unittest/unittest.dart';
+import "package:expect/expect.dart";
+
+void testStream(String name,
+                StreamController create(),
+                Stream getStream(controller)) {
+  test("$name-map", () {
+    var c = create();
+    var s = getStream(c);
+    Stream newStream = s.map((x) => x + 1);
+    Expect.equals(s.isBroadcast, newStream.isBroadcast);
+    newStream.single.then(expectAsync((v) {
+      Expect.equals(43, v);
+    }));
+    c.add(42);
+    c.close();
+  });
+  test("$name-where", () {
+    var c = create();
+    var s = getStream(c);
+    Stream newStream = s.where((x) => x.isEven);
+    Expect.equals(s.isBroadcast, newStream.isBroadcast);
+    newStream.single.then(expectAsync((v) {
+      Expect.equals(42, v);
+    }));
+    c.add(37);
+    c.add(42);
+    c.add(87);
+    c.close();
+  });
+  test("$name-handleError", () {
+    var c = create();
+    var s = getStream(c);
+    Stream newStream = s.handleError((x, s) {});
+    Expect.equals(s.isBroadcast, newStream.isBroadcast);
+    newStream.single.then(expectAsync((v) {
+      Expect.equals(42, v);
+    }));
+    c.addError("BAD1");
+    c.add(42);
+    c.addError("BAD2");
+    c.close();
+  });
+  test("$name-expand", () {
+    var c = create();
+    var s = getStream(c);
+    Stream newStream = s.expand((x) => x.isEven ? [x] : []);
+    Expect.equals(s.isBroadcast, newStream.isBroadcast);
+    newStream.single.then(expectAsync((v) {
+      Expect.equals(42, v);
+    }));
+    c.add(37);
+    c.add(42);
+    c.add(87);
+    c.close();
+  });
+  test("$name-transform", () {
+    var c = create();
+    var s = getStream(c);
+    // TODO: find name of default transformer
+    var t = new StreamTransformer.fromHandlers(
+        handleData: (value, EventSink sink) { sink.add(value); }
+    );
+    Stream newStream = s.transform(t);
+    Expect.equals(s.isBroadcast, newStream.isBroadcast);
+    newStream.single.then(expectAsync((v) {
+      Expect.equals(42, v);
+    }));
+    c.add(42);
+    c.close();
+  });
+  test("$name-take", () {
+    var c = create();
+    var s = getStream(c);
+    Stream newStream = s.take(1);
+    Expect.equals(s.isBroadcast, newStream.isBroadcast);
+    newStream.single.then(expectAsync((v) {
+      Expect.equals(42, v);
+    }));
+    c.add(42);
+    c.add(37);
+    c.close();
+  });
+  test("$name-takeWhile", () {
+    var c = create();
+    var s = getStream(c);
+    Stream newStream = s.takeWhile((x) => x.isEven);
+    Expect.equals(s.isBroadcast, newStream.isBroadcast);
+    newStream.single.then(expectAsync((v) {
+      Expect.equals(42, v);
+    }));
+    c.add(42);
+    c.add(37);
+    c.close();
+  });
+  test("$name-skip", () {
+    var c = create();
+    var s = getStream(c);
+    Stream newStream = s.skip(1);
+    Expect.equals(s.isBroadcast, newStream.isBroadcast);
+    newStream.single.then(expectAsync((v) {
+      Expect.equals(42, v);
+    }));
+    c.add(37);
+    c.add(42);
+    c.close();
+  });
+  test("$name-skipWhile", () {
+    var c = create();
+    var s = getStream(c);
+    Stream newStream = s.skipWhile((x) => x.isOdd);
+    Expect.equals(s.isBroadcast, newStream.isBroadcast);
+    newStream.single.then(expectAsync((v) {
+      Expect.equals(42, v);
+    }));
+    c.add(37);
+    c.add(42);
+    c.close();
+  });
+  test("$name-distinct", () {
+    var c = create();
+    var s = getStream(c);
+    Stream newStream = s.distinct();
+    Expect.equals(s.isBroadcast, newStream.isBroadcast);
+    newStream.single.then(expectAsync((v) {
+      Expect.equals(42, v);
+    }));
+    c.add(42);
+    c.add(42);
+    c.close();
+  });
+  test("$name-timeout", () {
+    var c = create();
+    var s = getStream(c);
+    Stream newStream = s.timeout(const Duration(seconds: 1));
+    Expect.equals(s.isBroadcast, newStream.isBroadcast);
+    newStream.single.then(expectAsync((v) {
+      Expect.equals(42, v);
+    }));
+    c.add(42);
+    c.close();
+  });
+  test("$name-asyncMap", () {
+    var c = create();
+    var s = getStream(c);
+    Stream newStream = s.asyncMap((x) => new Future.value(x + 1));
+    Expect.equals(s.isBroadcast, newStream.isBroadcast);
+    newStream.single.then(expectAsync((v) {
+      Expect.equals(43, v);
+    }));
+    c.add(42);
+    c.close();
+  });
+  test("$name-asyncExpand", () {
+    var c = create();
+    var s = getStream(c);
+    Stream newStream = s.asyncExpand((x) => new Stream.fromIterable([x + 1]));
+    Expect.equals(s.isBroadcast, newStream.isBroadcast);
+    newStream.single.then(expectAsync((v) {
+      Expect.equals(43, v);
+    }));
+    c.add(42);
+    c.close();
+  });
+}
+
+main() {
+  testStream("singlesub", () => new StreamController(), (c) => c.stream);
+  testStream("broadcast", () => new StreamController.broadcast(),
+                          (c) => c.stream);
+  testStream("asBroadcast", () => new StreamController(),
+                            (c) => c.stream.asBroadcastStream());
+  testStream("broadcast.asBroadcast", () => new StreamController.broadcast(),
+                                      (c) => c.stream.asBroadcastStream());
+}
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 6c18683..2174982 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -13,7 +13,7 @@
 convert/streamed_conversion_json_utf8_encode_test: Skip # http://dartbug.com/15498
 convert/streamed_conversion_utf8_encode_test: Skip # http://dartbug.com/15498
 
-mirrors/mirrors_reader_test: Timeout, Slow, RuntimeError # Issue 16589
+mirrors/mirrors_reader_test: Skip # Issue 16589
 
 [ $csp ]
 mirrors/delegate_test: RuntimeError # Issue 13864
@@ -35,7 +35,6 @@
 mirrors/class_declarations_test/none: RuntimeError # Issue 13440
 mirrors/constructor_kinds_test: RuntimeError # Issue 13799
 mirrors/constructor_private_name_test: CompileTimeError # Issue 13597
-mirrors/delegate_call_through_getter_test: RuntimeError # Issue 15138
 mirrors/equality_test/02: RuntimeError # Issue 12785
 mirrors/fake_function_with_call_test: RuntimeError # Issue 11612
 mirrors/fake_function_without_call_test: RuntimeError # Issue 11612
@@ -60,11 +59,8 @@
 mirrors/invoke_test: RuntimeError # Issue 11954
 mirrors/invoke_call_on_closure_test: RuntimeError # 6490
 mirrors/invoke_call_through_getter_test/named: RuntimeError # Issue 12863. When updating the status, remove the "///" in the test.
-mirrors/invoke_call_through_getter_test/getter_call_stub: RuntimeError # Issue 17451. When updating the status, remove the "///" in the test.
 mirrors/invoke_call_through_getter_previously_accessed_test/named: RuntimeError # Issue 12863. When updating the status, remove the "///" in the test.
-mirrors/invoke_call_through_getter_previously_accessed_test/getter_call_stub: RuntimeError # Issue 17451. When updating the status, remove the "///" in the test.
 mirrors/invoke_call_through_implicit_getter_previously_accessed_test/named: RuntimeError # Issue 12863. When updating the status, remove the "///" in the test.
-mirrors/invoke_call_through_implicit_getter_previously_accessed_test/getter_call_stub: RuntimeError # Issue 17451. When updating the status, remove the "///" in the test.
 mirrors/invoke_call_through_implicit_getter_test: RuntimeError # Issue 17638
 mirrors/invoke_named_test/none: RuntimeError # Issue 12863
 mirrors/invoke_private_test: CompileTimeError # Issue 12164
@@ -180,6 +176,7 @@
 async/stream_timeout_test: Fail # Timer interface not supported: dartbug.com/7728.
 async/stream_asyncexpand_test: RuntimeError # Timer interface not supported: dartbug.com/7728.
 async/stream_asyncmap_test: RuntimeError # Timer interface not supported: dartbug.com/7728.
+async/stream_transformation_broadcast_test: RuntimeError # Timer interface not supported: dartbug.com/7728.
 
 [ $compiler == dart2js && $checked ]
 convert/utf85_test: Pass, Slow # Issue 12029.
@@ -220,11 +217,11 @@
 [ $runtime == ie9 ]
 # IE9 doesn't support typed arrays.
 typed_data/*: Fail # Issue 11971
-convert/chunked_conversion_utf88_test: Pass, Slow, Timeout  # Issue 12029
-convert/streamed_conversion_json_utf8_decode_test: Pass, Timeout # Issue 12029
-async/deferred/*: Pass, Fail, Timeout # http://dartbug.com/12635
+convert/chunked_conversion_utf88_test: Skip  # Issue 12029
+convert/streamed_conversion_json_utf8_decode_test: Skip # Issue 12029
+async/deferred/*: Skip # http://dartbug.com/12635
 mirrors/deferred*: Pass, Fail # http://dartbug.com/12635
-convert/streamed_conversion_utf8_decode_test: Pass, Timeout # http://dartbug.com/12768
+convert/streamed_conversion_utf8_decode_test: Skip # http://dartbug.com/12768
 convert/utf85_test: Skip # Issue 12029.
 convert/json_util_test: Fail # Issue 16109
 mirrors/mirrors_reader_test: Slow, RuntimeError # Issue 16589
diff --git a/tests/lib/mirrors/invoke_call_through_getter_previously_accessed_test.dart b/tests/lib/mirrors/invoke_call_through_getter_previously_accessed_test.dart
index 893b83c..0b78ec2 100644
--- a/tests/lib/mirrors/invoke_call_through_getter_previously_accessed_test.dart
+++ b/tests/lib/mirrors/invoke_call_through_getter_previously_accessed_test.dart
@@ -55,10 +55,10 @@
                 im.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);    /// named: continued
   Expect.equals('DNU',
                 im.invoke(#doesNotExist, [17, 18]).reflectee);
-  Expect.throws(() => im.invoke(#closure, ['wrong arity']),  /// getter_call_stub: ok
-                (e) => e is NoSuchMethodError);              /// getter_call_stub: continued
-  Expect.throws(() => im.invoke(#notAClosure, []),           /// getter_call_stub: continued
-                (e) => e is NoSuchMethodError);              /// getter_call_stub: continued
+  Expect.throws(() => im.invoke(#closure, ['wrong arity']),
+                (e) => e is NoSuchMethodError);
+  Expect.throws(() => im.invoke(#notAClosure, []),
+                (e) => e is NoSuchMethodError);
 }
 
 class D {
diff --git a/tests/lib/mirrors/invoke_call_through_getter_test.dart b/tests/lib/mirrors/invoke_call_through_getter_test.dart
index c065299..287e212 100644
--- a/tests/lib/mirrors/invoke_call_through_getter_test.dart
+++ b/tests/lib/mirrors/invoke_call_through_getter_test.dart
@@ -55,10 +55,10 @@
                 im.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);    /// named: continued
   Expect.equals('DNU',
                 im.invoke(#doesNotExist, [17, 18]).reflectee);
-  Expect.throws(() => im.invoke(#closure, ['wrong arity']),  /// getter_call_stub: ok
-                (e) => e is NoSuchMethodError);              /// getter_call_stub: continued
-  Expect.throws(() => im.invoke(#notAClosure, []),           /// getter_call_stub: continued
-                (e) => e is NoSuchMethodError);              /// getter_call_stub: continued
+  Expect.throws(() => im.invoke(#closure, ['wrong arity']),
+                (e) => e is NoSuchMethodError);
+  Expect.throws(() => im.invoke(#notAClosure, []),
+                (e) => e is NoSuchMethodError);
 }
 
 class D {
diff --git a/tests/lib/mirrors/invoke_call_through_implicit_getter_previously_accessed_test.dart b/tests/lib/mirrors/invoke_call_through_implicit_getter_previously_accessed_test.dart
index a65c82d..e30b0c3 100644
--- a/tests/lib/mirrors/invoke_call_through_implicit_getter_previously_accessed_test.dart
+++ b/tests/lib/mirrors/invoke_call_through_implicit_getter_previously_accessed_test.dart
@@ -61,10 +61,10 @@
                 im.invoke(#closureNamed, [14, 15], {#w: 16}).reflectee);    /// named: continued
   Expect.equals('DNU',
                 im.invoke(#doesNotExist, [17, 18]).reflectee);
-  Expect.throws(() => im.invoke(#closure, ['wrong arity']),  /// getter_call_stub: ok
-                (e) => e is NoSuchMethodError);              /// getter_call_stub: continued
-  Expect.throws(() => im.invoke(#notAClosure, []),           /// getter_call_stub: continued
-                (e) => e is NoSuchMethodError);              /// getter_call_stub: continued
+  Expect.throws(() => im.invoke(#closure, ['wrong arity']),
+                (e) => e is NoSuchMethodError);
+  Expect.throws(() => im.invoke(#notAClosure, []),
+                (e) => e is NoSuchMethodError);
 }
 
 class D {
diff --git a/tests/lib/mirrors/metadata_allowed_values_test.dart b/tests/lib/mirrors/metadata_allowed_values_test.dart
index d410a63..ce1011b 100644
--- a/tests/lib/mirrors/metadata_allowed_values_test.dart
+++ b/tests/lib/mirrors/metadata_allowed_values_test.dart
@@ -143,6 +143,12 @@
 @a[0]  /// 26: compile-time error
 class JJ {}
 
+@kk  /// 27: compile-time error
+class KK {
+  const KK();
+}
+get kk => const KK();
+
 checkMetadata(DeclarationMirror mirror, List expectedMetadata) {
   Expect.listEquals(expectedMetadata.map(reflect).toList(), mirror.metadata);
 }
@@ -184,4 +190,5 @@
   reflectClass(HH).metadata;
   reflectClass(II).metadata;
   reflectClass(JJ).metadata;
+  reflectClass(KK).metadata;
 }
diff --git a/tests/standalone/http_launch_test.dart b/tests/standalone/http_launch_test.dart
index 5404f0f..31c524b 100644
--- a/tests/standalone/http_launch_test.dart
+++ b/tests/standalone/http_launch_test.dart
@@ -74,10 +74,18 @@
   // Exited cleanly.
   for (int i = 0; i < results.length; i++) {
     ProcessResult result = results[i];
+    if (result.exitCode != 0) {
+      print("Exit code for process $i = ${result.exitCode}");
+      print("---stdout:---\n${result.stdout}");
+      print("---stderr:---\n${result.stderr}\n---");
+    }
     Expect.equals(0, result.exitCode);
   }
   String stdout = results[0].stdout;
   // Output is the string 'hello'. Use startsWith to avoid new line differences.
+  if (!stdout.startsWith('hello')) {
+    print("---- stdout of remote process:\n$stdout\n----");
+  }
   Expect.isTrue(stdout.startsWith('hello'));
   // Same output from all three process runs.
   for (int i = 0; i < results.length; i++) {
diff --git a/tools/VERSION b/tools/VERSION
index 4ea6a56..f15d3d2 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 1
 MINOR 5
 PATCH 0
-PRERELEASE 1
-PRERELEASE_PATCH 2
+PRERELEASE 2
+PRERELEASE_PATCH 0
diff --git a/tools/bots/bot.py b/tools/bots/bot.py
index 1959043..a9b7e70 100644
--- a/tools/bots/bot.py
+++ b/tools/bots/bot.py
@@ -151,7 +151,7 @@
 
   try:
     Clobber()
-    if build_step: 
+    if build_step:
       build_step(build_info)
 
     custom_steps(build_info)
@@ -204,7 +204,7 @@
     RunProcess(cmd)
 
 
-def RunTest(name, build_info, targets, flags=None):
+def RunTest(name, build_info, targets, flags=None, swallow_error=False):
   """
   Runs test.py with the given settings.
   """
@@ -212,7 +212,7 @@
     flags = []
 
   step_name = GetStepName(name, flags)
-  with BuildStep(step_name):
+  with BuildStep(step_name, swallow_error=swallow_error):
     sys.stdout.flush()
 
     cmd = [
diff --git a/tools/bots/dartium_android.py b/tools/bots/dartium_android.py
index 138c7dc..980fb8f 100644
--- a/tools/bots/dartium_android.py
+++ b/tools/bots/dartium_android.py
@@ -23,8 +23,6 @@
 sys.path.append(os.path.join(SCRIPT_DIR, '..'))
 import utils
 
-
-APK_LOCATION = 'apks/Chrome.apk'
 CS_LOCATION = 'apks/ContentShell.apk'
 
 def GetOptionsParser():
@@ -35,31 +33,16 @@
 
 
 def UploadSetACL(gsutil, local, remote):
-  gsutil.upload(local, remote)
-  gsutil.setGroupReadACL(remote, 'google.com')
-  gsutil.setContentType(remote, 'application/vnd.android.package-archive')
-  
+  gsutil.upload(local, remote, public=True)
+
 
 def UploadAPKs(options):
   with bot.BuildStep('Upload apk'):
     revision = utils.GetSVNRevision()
-    namer = bot_utils.GCSNamer(internal=True)
-    # The version of gsutil we have on the bots is not new enough to support
-    # the acl set commands.
-    bot_utils.GSUtil.USE_DART_REPO_VERSION = True
+    namer = bot_utils.GCSNamer()
     gsutil = bot_utils.GSUtil()
 
-    # Archive dartuim
-    local = os.path.join(options.build_products_dir, APK_LOCATION)
-    # TODO(whesse): pass in arch and mode from reciepe
-    remote = namer.dartium_android_apk_filepath(revision,
-                                                'dartium-android',
-                                                'arm',
-                                                'release')
     web_link_prefix = 'https://storage.cloud.google.com/'
-    dartium_link = string.replace(remote, 'gs://', web_link_prefix)
-    UploadSetACL(gsutil, local, remote)
-    print "Uploaded dartium, available from: %s" % dartium_link
 
     # Archive content shell
     local = os.path.join(options.build_products_dir, CS_LOCATION)
diff --git a/tools/bots/pub.py b/tools/bots/pub.py
index efc6670..8bf9946 100755
--- a/tools/bots/pub.py
+++ b/tools/bots/pub.py
@@ -48,21 +48,31 @@
     common_args.append('--builder-tag=%s' % build_info.builder_tag)
 
 
-  # Pub tests currently have a lot of timeouts when run in debug mode.
-  # See issue 18479
+  opt_threshold = '--vm-options=--optimization-counter-threshold=5'
   if build_info.mode == 'release':
-    bot.RunTest('pub', build_info,
-                common_args + ['pub', 'pkg', 'docs'])
+    bot.RunTest('pub and pkg ', build_info,
+                common_args + ['pub', 'pkg', 'docs'],
+                swallow_error=True)
+    bot.RunTest('pub and pkg optimization counter thresshold 5', build_info,
+                common_args + ['--append_logs', opt_threshold,
+                               'pub', 'pkg', 'docs'],
+                swallow_error=True)
   else:
-    bot.RunTest('pub', build_info,
-                common_args + ['pkg', 'docs'])
+    # Pub tests currently have a lot of timeouts when run in debug mode.
+    # See issue 18479
+    bot.RunTest('pub and pkg', build_info, common_args + ['pkg', 'docs'],
+                swallow_error=True)
+    bot.RunTest('pub and pkg optimization counter threshold 5', build_info,
+                common_args + ['--append_logs', opt_threshold, 'pkg', 'docs'],
+                swallow_error=True)
 
   if build_info.mode == 'release':
     pkgbuild_build_info = bot.BuildInfo('none', 'vm', build_info.mode,
                                         build_info.system, checked=False)
     bot.RunTest('pkgbuild_repo_pkgs', pkgbuild_build_info,
-        common_args + ['--append_logs', '--use-repository-packages',
-                       'pkgbuild'])
+                common_args + ['--append_logs', '--use-repository-packages',
+                               'pkgbuild'],
+                swallow_error=True)
 
     # We are seeing issues with pub get calls on the windows bots.
     # Experiment with not running concurrent calls.
diff --git a/tools/dartium/download_multivm.py b/tools/dartium/download_multivm.py
new file mode 100755
index 0000000..a95f9f2
--- /dev/null
+++ b/tools/dartium/download_multivm.py
@@ -0,0 +1,61 @@
+#!/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.
+
+"""Download archived multivm or dartium builds.
+
+  Usage: download_multivm.py revision target_directory
+"""
+
+import imp
+import os
+import platform
+import shutil
+import subprocess
+import sys
+
+# We are in [checkout dir]/src/dart/tools/dartium in a dartium/multivm checkout
+TOOLS_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+SRC_DIR = os.path.dirname(os.path.dirname(TOOLS_DIR))
+GS_BUCKET = 'gs://dartium-archive'
+if platform.system() == 'Windows':
+  GSUTIL = 'e:\\b\\build\\scripts\\slave\\gsutil.bat'
+else:
+  GSUTIL = '/b/build/scripts/slave/gsutil'
+if not os.path.exists(GSUTIL):
+  GSUTIL = 'gsutil'
+
+def ExecuteCommand(cmd):
+  print 'Executing: ' + ' '.join(cmd)
+  subprocess.check_output(cmd)
+
+def main():
+  revision = sys.argv[1]
+  target_dir = sys.argv[2]
+  archive_dir = (os.environ['BUILDBOT_BUILDERNAME']
+                   .replace('linux', 'lucid64')
+                   .replace('multivm', 'multivm-dartium')
+                   .replace('perf', 'build'))
+  utils = imp.load_source('utils', os.path.join(TOOLS_DIR, 'utils.py'))
+  with utils.TempDir() as temp_dir:
+    archive_file = archive_dir + '-' + revision + '.zip'
+    gs_source = '/'.join([GS_BUCKET, archive_dir, archive_file])
+    zip_file = os.path.join(temp_dir, archive_file)
+    ExecuteCommand([GSUTIL, 'cp', gs_source, zip_file])
+
+    unzip_dir = zip_file.replace('.zip', '')
+    if platform.system() == 'Windows':
+      executable = os.path.join(SRC_DIR, 'third_party', 'lzma_sdk',
+                                'Executable', '7za.exe')
+      ExecuteCommand([executable, 'x', '-aoa', '-o' + temp_dir, zip_file])
+    else:
+      ExecuteCommand(['unzip', zip_file, '-d', temp_dir])
+
+    if os.path.exists(target_dir):
+      shutil.rmtree(target_dir)
+    shutil.move(unzip_dir, target_dir)
+
+if __name__ == '__main__':
+  sys.exit(main())
diff --git a/tools/dom/src/dart2js_DOMImplementation.dart b/tools/dom/src/dart2js_DOMImplementation.dart
index a844f23..f263def 100644
--- a/tools/dom/src/dart2js_DOMImplementation.dart
+++ b/tools/dom/src/dart2js_DOMImplementation.dart
@@ -32,9 +32,12 @@
 
   void postMessage(var message, String targetOrigin, [List messagePorts = null]) {
     if (messagePorts == null) {
-      JS('void', '#.postMessage(#,#)', _window, message, targetOrigin);
+      JS('void', '#.postMessage(#,#)', _window,
+          convertDartToNative_SerializedScriptValue(message), targetOrigin);
     } else {
-      JS('void', '#.postMessage(#,#,#)', _window, message, targetOrigin, messagePorts);
+      JS('void', '#.postMessage(#,#,#)', _window,
+          convertDartToNative_SerializedScriptValue(message), targetOrigin,
+          messagePorts);
     }
   }
 
diff --git a/tools/publish_all_pkgs.py b/tools/publish_all_pkgs.py
deleted file mode 100644
index 425d214..0000000
--- a/tools/publish_all_pkgs.py
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/usr/bin/env python
-#
-# 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.
-#
-# Upload all packages in pkg/ (other than a few that should be explicitly
-# excluded), plus sdk/lib/_internal/compiler .
-#
-# Usage: publish_all_pkgs.py
-#
-# "pub" must be in PATH.
-
-
-import os
-import os.path
-import subprocess
-import sys
-
-BLACK_LISTED_DIRECTORIES = ['.svn', 'async_helper', 'expect', 'third_party'];
-
-def Main(argv):
-  pkgs_to_publish = []
-
-  for pkgdir in ['pkg', 'pkg/third_party']:
-    for name in os.listdir(pkgdir):
-      if os.path.isdir(os.path.join(pkgdir, name)):
-        if name not in BLACK_LISTED_DIRECTORIES:
-          pkgs_to_publish.append(os.path.join(pkgdir, name))
-
-  for pkg in pkgs_to_publish:
-    print "\n\nPublishing %s:\n-------------------------------" % pkg
-    subprocess.call(['python', 'tools/publish_pkg.py', pkg])
-
-if __name__ == '__main__':
-  sys.exit(Main(sys.argv))